#ifndef __LIST__ #define __LIST__ /** * double linked list implementation * **/ #include struct list { struct list *next; struct list *prev; }; #define LIST_INIT(name) do { (name)->next = NULL; (name)->prev = NULL; } while(0); static int inline __list_insert(struct list *prev, struct list *new, struct list *next) { if(prev != NULL) prev->next = new; new->prev = prev; new->next = next; if(next != NULL) next->prev = new; } static int inline list_insert_after(struct list *list, struct list *new_elem) { return __list_insert(list, new_elem, list->next); } static int inline list_insert_before(struct list *list, struct list *new_elem) { return __list_insert(list->prev, new_elem, list); } static void inline __list_delete(struct list *prev, struct list *elem, struct list *next) { if(prev != NULL) prev->next = next; if(next != NULL) next->prev = prev; elem->next = elem; elem->prev = elem; } static void inline list_delete(struct list *elem) { __list_delete(elem->prev, elem, elem->next); } #define list_get_prev(elem) (elem)->prev #define list_get_next(elem) (elem)->next #define LIST_TO_END(pos, head) for(pos = head; pos != NULL; pos = pos->next) #define CONTAINER_OF(ptr, type, member) ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member))) #endif