]> mj.ucw.cz Git - libucw.git/blob - lib/clists.h
e9826eb6601f81f021e6d9019377bde97fd7193c
[libucw.git] / lib / clists.h
1 /*
2  *      Sherlock Library -- Circular Linked Lists
3  *
4  *      (c) 2003 Martin Mares <mj@ucw.cz>
5  *
6  *      This software may be freely distributed and used according to the terms
7  *      of the GNU Lesser General Public License.
8  */
9
10 #ifndef _SHERLOCK_CLISTS_H
11 #define _SHERLOCK_CLISTS_H
12
13 typedef struct cnode {
14   struct cnode *next, *prev;
15 } cnode;
16
17 typedef struct clist {
18   struct cnode head;
19 } clist;
20
21 static inline void *clist_head(clist *l)
22 {
23   return (l->head.next != &l->head) ? l->head.next : NULL;
24 }
25
26 static inline void *clist_tail(clist *l)
27 {
28   return (l->head.prev != &l->head) ? l->head.prev : NULL;
29 }
30
31 static inline void *clist_next(clist *l, cnode *n)
32 {
33   return (n->next != &l->head) ? (void *) n->next : NULL;
34 }
35
36 static inline void *clist_prev(clist *l, cnode *n)
37 {
38   return (n->prev != &l->head) ? (void *) n->prev : NULL;
39 }
40
41 #define CLIST_WALK(n,list) for(n=(void*)(list).head.next; (cnode*)(n) != &(list).head; n=(void*)((cnode*)(n))->next)
42
43 static inline void clist_insert(cnode *what, cnode *after)
44 {
45   cnode *before = after->next;
46   what->next = before;
47   what->prev = before->prev;
48   before->prev = what;
49   after->next = what;
50 }
51
52 static inline void clist_add_tail(clist *l, cnode *n)
53 {
54   clist_insert(n, l->head.prev);
55 }
56
57 static inline void clist_add_head(clist *l, cnode *n)
58 {
59   clist_insert(n, &l->head);
60 }
61
62 static inline void clist_remove(cnode *n)
63 {
64   cnode *before = n->prev;
65   cnode *after = n->next;
66   before->next = after;
67   after->prev = before;
68 }
69
70 static inline void clist_init(clist *l)
71 {
72   cnode *head = &l->head;
73   head->next = head->prev = head;
74 }
75
76 #endif