Files
bpfire/src/misc-progs/list.h
Stephan Feddersen 0d6cc79d98 WIO: first addon release v1.3.1
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
2017-08-15 11:45:46 +01:00

130 lines
2.8 KiB
C

/* list.h by Jan Bobrowski. Inspired by list.h from Linux */
#ifndef LIST_H
#define LIST_H
typedef struct list {
struct list *next, *prev;
} list_t;
static inline void list_link(struct list *a, struct list *b)
{
a->next = b;
b->prev = a;
}
static inline void list_add(struct list *head, struct list *item)
{
struct list *first = head->next;
list_link(head, item);
list_link(item, first);
}
static inline void list_add_end(struct list *head, struct list *item)
{
struct list *last = head->prev;
list_link(item, head);
list_link(last, item);
}
static inline list_t *list_del(struct list *item)
{
struct list *prev = item->prev, *next = item->next;
list_link(prev, next);
return next;
}
static inline void list_init(struct list *head)
{
list_link(head, head);
}
/* delete item from one list and add it to another */
static inline void list_del_add(list_t *head, list_t *item)
{
list_t *prev = item->prev, *next = item->next;
list_link(prev, next);
next = head->next;
list_link(head, item);
list_link(item, next);
}
/*static inline list_check(list_t *l)
{
list_t *a = l;
list_t *b;
do {
b = a->next;
assert(b->prev == a);
if(a==l) break;
a = b;
} while(1);
}*/
static inline void list_del_add_end(list_t *head, list_t *item)
{
list_t *prev = item->prev, *next = item->next;
list_link(prev, next);
prev = head->prev;
list_link(item, head);
item->prev = prev;
prev->next = item;
}
static inline void list_del_init(struct list *item)
{
struct list *prev = item->prev, *next = item->next;
list_link(item, item);
list_link(prev, next);
}
static inline void list_join(struct list *a, struct list *b)
{
list_t *ae = a->prev;
list_t *be = b->prev;
b->prev = ae;
a->prev = be;
ae->next = b;
be->next = a;
}
static inline int list_empty(struct list *head)
{
return head->next == head;
}
#define LIST(L) struct list L = {&L, &L}
#define list_entry(L, T, M) ((T*)((char*)(L) - (long)(&((T*)0)->M)))
#define list_item(L, T, M) ((T*)((char*)(L) - (long)(&((T*)0)->M)))
#define list_first(H, T, M) list_item((H)->next, T, M)
#define list_last(H, T, M) list_item((H)->prev, T, M)
#define list_next(O, M) list_item((O)->M.next, typeof(*(O)), M)
/* remove first element and return it */
static inline struct list *list_get(struct list *head)
{
struct list *item = head->next;
struct list *next = item->next;
list_link(head, next);
return item;
}
/* remove first element, initialize and return it */
static inline struct list *list_get_init(struct list *head)
{
struct list *item = head->next;
struct list *next = item->next;
list_link(item, item);
list_link(head, next);
return item;
}
#define list_get_entry(H, T, M) list_item(list_get((H)), T, M)
#define list_get_init_entry(H, T, M) list_item(list_get_init((H)), T, M)
#define list_get_item(H, T, M) list_item(list_get((H)), T, M)
#define list_get_init_item(H, T, M) list_item(list_get_init((H)), T, M)
#endif