diff options
-rw-r--r-- | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/list.h | 55 |
2 files changed, 57 insertions, 1 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index ee773cd..4fe71d2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -32,7 +32,8 @@ patch_SOURCES = \ util.c \ util.h \ version.c \ - version.h + version.h \ + list.h AM_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib patch_LDADD = $(LDADD) $(top_builddir)/lib/libpatch.a $(LIB_CLOCK_GETTIME) \ diff --git a/src/list.h b/src/list.h new file mode 100644 index 0000000..11d1184 --- /dev/null +++ b/src/list.h @@ -0,0 +1,55 @@ +#ifndef __LIST_H +#define __LIST_H + +#include <stdbool.h> + +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +static inline void INIT_LIST_HEAD(struct list_head *list) +{ + list->next = list; + list->prev = list; +} + +static inline void +list_add (struct list_head *entry, struct list_head *head) +{ + struct list_head *next = head->next; + entry->prev = head; + entry->next = next; + next->prev = head->next = entry; +} + +static inline void +list_del (struct list_head *entry) +{ + struct list_head *next = entry->next; + struct list_head *prev = entry->prev; + next->prev = prev; + prev->next = next; +} + +static inline void +list_del_init (struct list_head *entry) +{ + list_del(entry); + INIT_LIST_HEAD(entry); +} + +static inline bool +list_empty (const struct list_head *head) +{ + return head->next == head; +} + +#define list_entry(ptr, type, member) \ + (type *)( (char *)(ptr) - offsetof(type, member) ) + +#endif /* __LIST_H */ |