#ifndef LIST_H #define LIST_H #include struct list_t { struct list_t* next; struct list_t* prev; }; typedef struct list_t list_t; void add_to_list(list_t* head, list_t* prev, list_t* next); void free_node(list_t* head); #define INIT_LIST(name) \ name.next = &name; \ name.prev = &name; #define list_for_each(pos, head) \ for (pos = head->next; pos != head; pos = pos->next) #define list_next_entry(pos, member) \ container_of(pos->member.next, typeof(*pos), member) #define list_prev_entry(pos, member) \ container_of(pos->member.prev, typeof(*pos), member) #define list_for_each_entry(pos, head, member) \ for (pos = container_of(head->next, typeof(*pos), member); pos != container_of(head, typeof(*pos), member); pos = container_of(pos->member.next, typeof(*pos), member)) #define list_for_each_entry_prev(pos, head, member) \ for (pos = container_of(head->prev, typeof(*pos), member); pos != container_of(head, typeof(*pos), member); pos = container_of(pos->member.prev, typeof(*pos), member)) #define list_is_empty(pos) \ (pos == pos->next) #endif