]> mj.ucw.cz Git - libucw.git/blob - lib/lists.h
4f605697eb6b4587a71a5e7e735da0bce19618e2
[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
24 void add_tail(list *, node *);
25 void add_head(list *, node *);
26 void rem_node(node *);
27 void add_tail_list(list *, list *);
28 void init_list(list *);
29 void insert_node(node *, node *);
30
31 #ifdef __GNUC__
32
33 extern inline void
34 add_tail(list *l, node *n)
35 {
36   node *z = l->tail.prev;
37
38   n->next = &l->tail;
39   n->prev = z;
40   z->next = n;
41   l->tail.prev = n;
42 }
43
44 extern inline void
45 add_head(list *l, node *n)
46 {
47   node *z = l->head.next;
48
49   n->next = z;
50   n->prev = &l->head;
51   z->prev = n;
52   l->head.next = n;
53 }
54
55 extern inline void
56 insert_node(node *n, node *after)
57 {
58   node *z = after->next;
59
60   n->next = z;
61   n->prev = after;
62   after->next = n;
63   z->prev = n;
64 }
65
66 extern inline void
67 rem_node(node *n)
68 {
69   node *z = n->prev;
70   node *x = n->next;
71
72   z->next = x;
73   x->prev = z;
74 }
75
76 extern inline void
77 init_list(list *l)
78 {
79   l->head.next = &l->tail;
80   l->head.prev = NULL;
81   l->tail.next = NULL;
82   l->tail.prev = &l->head;
83 }
84
85 extern inline void
86 add_tail_list(list *to, list *l)
87 {
88   node *p = to->tail.prev;
89   node *q = l->head.next;
90
91   p->next = q;
92   q->prev = p;
93   q = l->tail.prev;
94   q->next = &to->tail;
95   to->tail.prev = q;
96 }
97
98 #endif