13597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu/*
22f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * list.h, list
330bd6062e4b295f5f7bcaeb98165065310d29269Ho-Eun Ryu *
42f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Copyright (c) 2009-2010 Wind River Systems, Inc.
52f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu *
62f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Licensed under the Apache License, Version 2.0 (the "License");
72f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * you may not use this file except in compliance with the License.
82f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * You may obtain a copy of the License at
92f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu *
102f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * http://www.apache.org/licenses/LICENSE-2.0
112f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu *
122f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Unless required by applicable law or agreed to in writing, software
132f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * distributed under the License is distributed on an "AS IS" BASIS,
142f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
152f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * See the License for the specific language governing permissions and
162f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * limitations under the License.
173597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu */
183597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
193597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#ifndef __LIST_H
203597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#define __LIST_H
213597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
223597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#ifdef __cplusplus
233597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryuextern "C" {
243597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#endif
253597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
263597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list {
273597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu    struct list *next;
283597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu    struct list *prev;
293597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
303597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu    void *data;
313597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu};
323597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
333597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryuvoid __list_init(struct list *);
343597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
353597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_alloc(void);
363597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_alloc(void *);
373597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
383597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryuvoid __list_free(struct list *);
393597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryuvoid list_free_all(struct list *);
403597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
413597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_last(struct list *);
423597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_first(struct list *);
433597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_entry(struct list *, int);
443597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryuint list_length(struct list *);
453597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
463597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_add_before(struct list *, struct list *);
473597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_add_after(struct list *, struct list *);
483597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_add_head(struct list *, struct list *);
493597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_add_tail(struct list *, struct list *);
503597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_add_head(struct list *, void *);
513597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_add_tail(struct list *, void *);
523597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
533597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_remove(struct list *, struct list *);
543597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_delete(struct list *, struct list *);
553597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_delete(struct list *, void *);
563597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_delete_all(struct list *, void *);
573597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
583597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_find(struct list *, void *);
593597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_find_reverse(struct list *, void *);
603597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
613597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#define __list_next(entry) ((entry) ? (entry->next) : NULL)
623597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#define __list_prev(entry) ((entry) ? (entry->prev) : NULL)
633597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
643597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#define list_foreach(list, ptr)         \
653597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu    for (ptr = list;                    \
663597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu         ptr != NULL;                   \
673597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu         ptr = __list_next(ptr))
683597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
693597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#define list_foreach_safe(list, ptr, nxt)                       \
703597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu    for (ptr = list, nxt = __list_next(ptr);                    \
713597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu         ptr != NULL;						\
723597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu         ptr = nxt, nxt = __list_next(ptr))
733597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
743597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#define list_foreach_reverse(list, ptr)         \
753597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu    for (ptr = __list_last(list);               \
763597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu         ptr != NULL;                           \
773597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu         ptr = __list_prev(ptr))
783597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
793597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#define list_foreach_reverse_safe(list, ptr, prv)               \
803597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu    for (ptr = __list_last(list), prv = __list_prev(ptr);      \
813597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu         ptr != NULL;						\
823597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu         ptr = prv, prv = __list_prev(ptr))
833597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
843597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#ifdef __cplusplus
853597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} /* extern "C" */
863597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#endif
873597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu
883597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#endif /* __LIST_H */
89