#ifndef foolisthfoo #define foolisthfoo /* * Doubly linked list implementation from the Linux kernel * Copyright Linus Torvalds et al, GPLv2 */ struct list_head { struct list_head *next; struct list_head *prev; }; #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name) static inline void list_init(struct list_head *list) { list->next = list; list->prev = list; } static inline void list_del(struct list_head *list) { list->next->prev = list->prev; list->prev->next = list->next; } static inline void list_add(struct list_head *new, struct list_head *list) { list->next->prev = new; new->next = list->next; new->prev = list; list->next = new; } static inline void list_replace(struct list_head *old, struct list_head *new) { old->prev->next = new; old->next->prev = new; new->next = old->next; new->prev = old->prev; old->next = old->prev = NULL; } static inline bool list_empty(struct list_head *list) { return list->next == list; } #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #define container_of(ptr, type, member) __extension__ ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) #define list_entry(ptr, type, member) \ container_of(ptr, type, member) #define list_first_entry(ptr, type, member) \ list_entry((ptr)->next, type, member) #define list_next_entry(pos, member) \ list_entry((pos)->member.next, typeof(*(pos)), member) #define list_for_each(pos, head) \ for (pos = (head)->next; pos != (head); pos = pos->next) #define list_for_each_entry(pos, head, member) \ for (pos = list_first_entry(head, typeof(*pos), member); \ &pos->member != (head); \ pos = list_next_entry(pos, member)) #define list_for_each_entry_safe(pos, n, head, member) \ for (pos = list_entry((head)->next, typeof(*pos), member), \ n = list_entry(pos->member.next, typeof(*pos), member); \ &pos->member != (head); \ pos = n, n = list_entry(n->member.next, typeof(*n), member)) #endif