4 * Copyright (c) Tuomo Valkonen 1999-2005.
6 * You may distribute and modify this library under the terms of either
7 * the Clarified Artistic License or the GNU LGPL, version 2.1 or later.
17 #define LINK_ITEM(LIST, ITEM, NEXT, PREV) \
21 (ITEM)->PREV=(ITEM); \
23 (ITEM)->PREV=(LIST)->PREV; \
24 (ITEM)->PREV->NEXT=(ITEM); \
25 (LIST)->PREV=(ITEM); \
29 #define LINK_ITEM_FIRST(LIST, ITEM, NEXT, PREV) \
30 (ITEM)->NEXT=(LIST); \
32 (ITEM)->PREV=(ITEM); \
34 (ITEM)->PREV=(LIST)->PREV; \
35 (LIST)->PREV=(ITEM); \
40 #define LINK_ITEM_LAST LINK_ITEM
43 #define LINK_ITEM_BEFORE(LIST, BEFORE, ITEM, NEXT, PREV) \
44 (ITEM)->NEXT=(BEFORE); \
45 (ITEM)->PREV=(BEFORE)->PREV; \
46 (BEFORE)->PREV=(ITEM); \
47 if((BEFORE)==(LIST)) \
50 (ITEM)->PREV->NEXT=(ITEM)
53 #define LINK_ITEM_AFTER(LIST, AFTER, ITEM, NEXT, PREV) \
54 (ITEM)->NEXT=(AFTER)->NEXT; \
55 (ITEM)->PREV=(AFTER); \
56 (AFTER)->NEXT=(ITEM); \
57 if((ITEM)->NEXT==NULL) \
58 (LIST)->PREV=(ITEM); \
60 (ITEM)->NEXT->PREV=ITEM;
63 #define UNLINK_ITEM(LIST, ITEM, NEXT, PREV) \
64 if((ITEM)->PREV!=NULL){ \
66 (LIST)=(ITEM)->NEXT; \
68 (LIST)->PREV=(ITEM)->PREV; \
69 }else if((ITEM)->NEXT==NULL){ \
70 (ITEM)->PREV->NEXT=NULL; \
71 (LIST)->PREV=(ITEM)->PREV; \
73 (ITEM)->PREV->NEXT=(ITEM)->NEXT; \
74 (ITEM)->NEXT->PREV=(ITEM)->PREV; \
87 #define LIST_FIRST(LIST, NEXT, PREV) \
89 #define LIST_LAST(LIST, NEXT, PREV) \
90 ((LIST)==NULL ? NULL : LIST_PREV_WRAP(LIST, LIST, NEXT, PREV))
91 #define LIST_NEXT(LIST, REG, NEXT, PREV) \
93 #define LIST_PREV(LIST, REG, NEXT, PREV) \
94 ((REG)->PREV->NEXT ? (REG)->PREV : NULL)
95 #define LIST_NEXT_WRAP(LIST, REG, NEXT, PREV) \
96 (((REG) && (REG)->NEXT) ? (REG)->NEXT : (LIST))
97 #define LIST_PREV_WRAP(LIST, REG, NEXT, PREV) \
98 ((REG) ? (REG)->PREV : (LIST))
100 #define LIST_FOR_ALL(LIST, NODE, NEXT, PREV) \
101 for(NODE=LIST; NODE!=NULL; NODE=(NODE)->NEXT)
103 #define LIST_FOR_ALL_REV(LIST, NODE, NEXT, PREV) \
104 for(NODE=((LIST)==NULL ? NULL : (LIST)->PREV); \
106 NODE=((NODE)==(LIST) ? NULL : (NODE)->PREV))
108 #define LIST_FOR_ALL_W_NEXT(LIST, NODE, NXT, NEXT, PREV) \
109 for(NODE=LL, NXT=(NODE==NULL ? NULL : (NODE)->NEXT); \
111 NODE=NXT, NXT=(NODE==NULL ? NULL : (NODE)->NEXT))
113 #define LIST_FOR_ALL_W_NEXT_REV(LIST, NODE, NXT, NEXT, PREV) \
114 for(NODE=((LIST)==NULL ? NULL : (LIST)->PREV), \
115 NXT=((NODE)==(LIST) ? NULL : (NODE)->PREV); \
118 NXT=((NODE)==(LIST) ? NULL : (NODE)->PREV))
124 #endif /* LIBTU_DLIST_H */