1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
/*
* libtu/common.h
*
* Copyright (c) Tuomo Valkonen 1999-2005.
*
* You may distribute and modify this library under the terms of either
* the Clarified Artistic License or the GNU LGPL, version 2.1 or later.
*/
#ifndef LIBTU_DLIST_H
#define LIBTU_DLIST_H
/*{{{ Linking */
#define LINK_ITEM(LIST, ITEM, NEXT, PREV) \
(ITEM)->NEXT=NULL; \
if((LIST)==NULL){ \
(LIST)=(ITEM); \
(ITEM)->PREV=(ITEM); \
}else{ \
(ITEM)->PREV=(LIST)->PREV; \
(ITEM)->PREV->NEXT=(ITEM); \
(LIST)->PREV=(ITEM); \
} ((void)0)
#define LINK_ITEM_FIRST(LIST, ITEM, NEXT, PREV) \
(ITEM)->NEXT=(LIST); \
if((LIST)==NULL){ \
(ITEM)->PREV=(ITEM); \
}else{ \
(ITEM)->PREV=(LIST)->PREV; \
(LIST)->PREV=(ITEM); \
} \
(LIST)=(ITEM); \
((void)0)
#define LINK_ITEM_LAST LINK_ITEM
#define LINK_ITEM_BEFORE(LIST, BEFORE, ITEM, NEXT, PREV) \
(ITEM)->NEXT=(BEFORE); \
(ITEM)->PREV=(BEFORE)->PREV; \
(BEFORE)->PREV=(ITEM); \
if((BEFORE)==(LIST)) \
(LIST)=(ITEM); \
else \
(ITEM)->PREV->NEXT=(ITEM); \
((void)0)
#define LINK_ITEM_AFTER(LIST, AFTER, ITEM, NEXT, PREV) \
(ITEM)->NEXT=(AFTER)->NEXT; \
(ITEM)->PREV=(AFTER); \
(AFTER)->NEXT=(ITEM); \
if((ITEM)->NEXT==NULL) \
(LIST)->PREV=(ITEM); \
else \
(ITEM)->NEXT->PREV=ITEM; \
((void)0)
#define UNLINK_ITEM(LIST, ITEM, NEXT, PREV) \
if((ITEM)->PREV!=NULL){ \
if((ITEM)==(LIST)){ \
(LIST)=(ITEM)->NEXT; \
if((LIST)!=NULL) \
(LIST)->PREV=(ITEM)->PREV; \
}else if((ITEM)->NEXT==NULL){ \
(ITEM)->PREV->NEXT=NULL; \
(LIST)->PREV=(ITEM)->PREV; \
}else{ \
(ITEM)->PREV->NEXT=(ITEM)->NEXT; \
(ITEM)->NEXT->PREV=(ITEM)->PREV; \
} \
} \
(ITEM)->NEXT=NULL; \
(ITEM)->PREV=NULL; \
((void)0)
/*}}}*/
/*{{{ Iteration */
#define LIST_FIRST(LIST, NEXT, PREV) \
(LIST)
#define LIST_LAST(LIST, NEXT, PREV) \
((LIST)==NULL ? NULL : LIST_PREV_WRAP(LIST, LIST, NEXT, PREV))
#define LIST_NEXT(LIST, REG, NEXT, PREV) \
((REG)->NEXT)
#define LIST_PREV(LIST, REG, NEXT, PREV) \
((REG)->PREV->NEXT ? (REG)->PREV : NULL)
#define LIST_NEXT_WRAP(LIST, REG, NEXT, PREV) \
(((REG) && (REG)->NEXT) ? (REG)->NEXT : (LIST))
#define LIST_PREV_WRAP(LIST, REG, NEXT, PREV) \
((REG) ? (REG)->PREV : (LIST))
#define LIST_FOR_ALL(LIST, NODE, NEXT, PREV) \
for(NODE=LIST; NODE!=NULL; NODE=(NODE)->NEXT)
#define LIST_FOR_ALL_REV(LIST, NODE, NEXT, PREV) \
for(NODE=((LIST)==NULL ? NULL : (LIST)->PREV); \
NODE!=NULL; \
NODE=((NODE)==(LIST) ? NULL : (NODE)->PREV))
#define LIST_FOR_ALL_W_NEXT(LIST, NODE, NXT, NEXT, PREV) \
for(NODE=LL, NXT=(NODE==NULL ? NULL : (NODE)->NEXT); \
NODE!=NULL; \
NODE=NXT, NXT=(NODE==NULL ? NULL : (NODE)->NEXT))
#define LIST_FOR_ALL_W_NEXT_REV(LIST, NODE, NXT, NEXT, PREV) \
for(NODE=((LIST)==NULL ? NULL : (LIST)->PREV), \
NXT=((NODE)==(LIST) ? NULL : (NODE)->PREV); \
NODE!=NULL; \
NODE=NXT, \
NXT=((NODE)==(LIST) ? NULL : (NODE)->PREV))
/*}}}*/
#endif /* LIBTU_DLIST_H */
|