File: dlist.h

package info (click to toggle)
notion 4.0.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 4,656 kB
  • sloc: ansic: 47,365; sh: 2,093; makefile: 594; perl: 270
file content (128 lines) | stat: -rw-r--r-- 4,410 bytes parent folder | download | duplicates (3)
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 */