]> mj.ucw.cz Git - libucw.git/blob - lib/lists.h
9c9cabf2088e8849675b56ee3b165e44d28b3198
[libucw.git] / lib / lists.h
1 /*
2  *      Sherlock Library -- Linked Lists
3  *
4  *      (c) 1997 Martin Mares, <mj@atrey.karlin.mff.cuni.cz>
5  */
6
7 struct node {
8   struct node *next, *prev;
9 };
10 typedef struct node node;
11
12 struct list {
13   struct node head, tail;
14 };
15 typedef struct list list;
16
17 #define NODE (node *)
18 #define HEAD(list) ((void *)((list).head.next))
19 #define TAIL(list) ((void *)((list).tail.prev))
20 #define DO_FOR_ALL(n,list) for((n)=HEAD(list);(NODE (n))->next; \
21                                  n=(void *)((NODE (n))->next))
22 #define EMPTY_LIST(list) (!(list).head.next->next)
23 #define OFFSETOF(s, i) ((unsigned int)&((s *)0)->i)
24 #define SKIP_BACK(s, i, p) ((s *)((char *)p - OFFSETOF(s, i)))
25
26 void add_tail(list *, node *);
27 void add_head(list *, node *);
28 void rem_node(node *);
29 void add_tail_list(list *, list *);
30 void init_list(list *);
31 void insert_node(node *, node *);
32
33 #ifdef __GNUC__
34
35 extern inline void
36 add_tail(list *l, node *n)
37 {
38   node *z = l->tail.prev;
39
40   n->next = &l->tail;
41   n->prev = z;
42   z->next = n;
43   l->tail.prev = n;
44 }
45
46 extern inline void
47 add_head(list *l, node *n)
48 {
49   node *z = l->head.next;
50
51   n->next = z;
52   n->prev = &l->head;
53   z->prev = n;
54   l->head.next = n;
55 }
56
57 extern inline void
58 insert_node(node *n, node *after)
59 {
60   node *z = after->next;
61
62   n->next = z;
63   n->prev = after;
64   after->next = n;
65   z->prev = n;
66 }
67
68 extern inline void
69 rem_node(node *n)
70 {
71   node *z = n->prev;
72   node *x = n->next;
73
74   z->next = x;
75   x->prev = z;
76 }
77
78 extern inline void
79 init_list(list *l)
80 {
81   l->head.next = &l->tail;
82   l->head.prev = NULL;
83   l->tail.next = NULL;
84   l->tail.prev = &l->head;
85 }
86
87 extern inline void
88 add_tail_list(list *to, list *l)
89 {
90   node *p = to->tail.prev;
91   node *q = l->head.next;
92
93   p->next = q;
94   q->prev = p;
95   q = l->tail.prev;
96   q->next = &to->tail;
97   to->tail.prev = q;
98 }
99
100 #endif