summaryrefslogtreecommitdiffstats
path: root/list.h
diff options
context:
space:
mode:
Diffstat (limited to 'list.h')
-rw-r--r--list.h48
1 files changed, 48 insertions, 0 deletions
diff --git a/list.h b/list.h
new file mode 100644
index 0000000..5cc1473
--- /dev/null
+++ b/list.h
@@ -0,0 +1,48 @@
+#ifndef paagllist
+#define paagllist
+
+#define AGL_DLIST_INIT(self) \
+ do { \
+ (&(self))->prev = &(self); \
+ (&(self))->next = &(self); \
+ } while(0)
+
+#define AGL_OFFSET(structure, member) \
+ ((int)((char *)((&((structure *)0)->member)) - (char *)0))
+
+#define AGL_LIST_RELOCATE(structure, member, ptr) \
+ ((structure *)(void *)((char *)ptr - AGL_OFFSET(structure, member)))
+
+#define AGL_DLIST_FOR_EACH(structure, member, pos, head) \
+ for (pos = AGL_LIST_RELOCATE(structure, member, (head)->next); \
+ &pos->member != (head); \
+ pos = AGL_LIST_RELOCATE(structure, member, pos->member.next))
+
+#define AGL_DLIST_FOR_EACH_SAFE(structure, member, pos, n, head) \
+ for (pos = AGL_LIST_RELOCATE(structure, member, (head)->next), \
+ n = AGL_LIST_RELOCATE(structure, member, pos->member.next); \
+ &pos->member != (head); \
+ pos = n, \
+ n = AGL_LIST_RELOCATE(structure, member, pos->member.next))
+
+#define AGL_DLIST_FOR_EACH_BACKWARDS(structure, member, pos, head) \
+ for (pos = AGL_LIST_RELOCATE(structure, member, (head)->prev); \
+ &pos->member != (head); \
+ pos = AGL_LIST_RELOCATE(structure, member, pos->member.prev))
+
+#define AGL_DLIST_UNLINK(structure, member, elem) \
+ do { \
+ agl_dlist *after = (elem)->member.prev; \
+ agl_dlist *before = (elem)->member.next; \
+ after->next = before; \
+ before->prev = after; \
+ (elem)->member.prev = (elem)->member.next = &(elem)->member; \
+ } while(0)
+
+
+typedef struct agl_dlist {
+ struct agl_dlist *prev;
+ struct agl_dlist *next;
+} agl_dlist;
+
+#endif