From ca9df22fe61c7e3b76ded1543ba083e51d0319ce Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Sun, 1 Mar 2015 01:10:15 +0100 Subject: Add list_head based double linked list * src/list.h: New data structure. src/Makefile.am (patch_SOURCES): Add list.h. --- src/Makefile.am | 3 ++- src/list.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/list.h 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 + +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 */ -- cgit v1.2.1