summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruen@gnu.org>2015-03-01 01:10:15 +0100
committerAndreas Gruenbacher <agruen@gnu.org>2015-03-05 22:57:07 +0100
commitca9df22fe61c7e3b76ded1543ba083e51d0319ce (patch)
tree963300f1c34a70e5b5687bcb2db0a5b79ab601a9
parent0d3df382d616f37efb5191548a22656f8494ca76 (diff)
downloadpatch-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.am3
-rw-r--r--src/list.h55
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 */