4 #define AGL_DLIST_INIT(self) \
6 (&(self))->prev = &(self); \
7 (&(self))->next = &(self); \
10 #define AGL_OFFSET(structure, member) \
11 ((int)((char *)((&((structure *)0)->member)) - (char *)0))
13 #define AGL_LIST_RELOCATE(structure, member, ptr) \
14 ((structure *)(void *)((char *)ptr - AGL_OFFSET(structure, member)))
16 #define AGL_DLIST_FOR_EACH(structure, member, pos, head) \
17 for (pos = AGL_LIST_RELOCATE(structure, member, (head)->next); \
18 &pos->member != (head); \
19 pos = AGL_LIST_RELOCATE(structure, member, pos->member.next))
21 #define AGL_DLIST_FOR_EACH_SAFE(structure, member, pos, n, head) \
22 for (pos = AGL_LIST_RELOCATE(structure, member, (head)->next), \
23 n = AGL_LIST_RELOCATE(structure, member, pos->member.next); \
24 &pos->member != (head); \
26 n = AGL_LIST_RELOCATE(structure, member, pos->member.next))
28 #define AGL_DLIST_FOR_EACH_BACKWARDS(structure, member, pos, head) \
29 for (pos = AGL_LIST_RELOCATE(structure, member, (head)->prev); \
30 &pos->member != (head); \
31 pos = AGL_LIST_RELOCATE(structure, member, pos->member.prev))
33 #define AGL_DLIST_UNLINK(structure, member, elem) \
35 agl_dlist *after = (elem)->member.prev; \
36 agl_dlist *before = (elem)->member.next; \
37 after->next = before; \
38 before->prev = after; \
39 (elem)->member.prev = (elem)->member.next = &(elem)->member; \
43 typedef struct agl_dlist {
44 struct agl_dlist *prev;
45 struct agl_dlist *next;