diff options
author | Andreas Gruenbacher <agruen@gnu.org> | 2015-03-01 01:10:15 +0100 |
---|---|---|
committer | Andreas Gruenbacher <agruen@gnu.org> | 2015-03-05 22:57:07 +0100 |
commit | ca9df22fe61c7e3b76ded1543ba083e51d0319ce (patch) | |
tree | 963300f1c34a70e5b5687bcb2db0a5b79ab601a9 | |
parent | 0d3df382d616f37efb5191548a22656f8494ca76 (diff) | |
download | patch-ca9df22fe61c7e3b76ded1543ba083e51d0319ce.tar.gz |
Add list_head based double linked list
* src/list.h: New data structure.
src/Makefile.am (patch_SOURCES): Add list.h.
-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 */ |