everything: shotgun attempt to put PROTO_WS and PROTO_WSS across core and in modules...
[sip-router] / clist.h
1 /*
2  * $Id$
3  *
4  * circular list maintenance macros
5  *
6  * Copyright (C) 2005 iptelorg GmbH
7  *
8  * This file is part of ser, a free SIP server.
9  *
10  * ser is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version
14  *
15  * ser is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License 
21  * along with this program; if not, write to the Free Software 
22  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23  */
24
25 /*!
26  * \file
27  * \brief SIP-router core :: circular list maintenance macros
28  *
29  * \ingroup core
30  * Module: \ref core
31  */
32
33 /* History:
34  * --------
35  *  2005-08-08  created by andrei
36  */
37
38 #ifndef _clist_h
39 #define _clist_h
40
41 /*! \brief circular list */
42 #define clist_init(c, next, prev) \
43         do{ \
44                 (c)->next=(void*)(c); \
45                 (c)->prev=(void*)(c); \
46         } while(0)
47
48
49
50 /*! \brief adds an entire sublist { s,e } (including s & e )
51  * after head
52  *
53  * \note WARNING: clist_insert_sublist(head, n, n->prev) won't work,
54  *          same for clist_insert_sublist(head, n->next, n)
55  *  (macro!), use  e=n->prev; clist_insert_sublist(head, n, e, ...)
56  *  instead!
57  */
58 #define clist_insert_sublist(head, s, e, next, prev) \
59         do{ \
60                 (s)->prev=(void*)(head); \
61                 (e)->next=(head)->next; \
62                 (e)->next->prev=(e); \
63                 (head)->next=s;   \
64         }while(0)
65
66
67
68 /*! \brief appends an entire sublist { s,e } (including s & e )
69  * at the end of the list
70  *
71  * WARNING: clist_append_sublist(head, n, n->prev, ...) won't work,
72  *  (macro!), use  e=n->prev; clist_append_sublist(head, n, e, ...)
73  *  instead!
74  */
75 #define clist_append_sublist(head, s, e, next, prev) \
76         do{ \
77                 (s)->prev=(head)->prev; \
78                 (e)->next=(void*)(head); \
79                 (s)->prev->next=(s); \
80                 (head)->prev=(e);   \
81         }while(0)
82
83
84
85
86 /*! \brief remove sublist { s,e } (including s & e )
87  * always, if start is the beginning of the list use
88  * clist_rm_sublist(head->next, e, next, prev )
89  * WARNING: clist_rm_sublist(n, n->prev, ...) won't work,
90  *  (macro!), use  e=n->prev; clist_rm_sublist(n, e, ...)
91  *  instead! */
92 #define clist_rm_sublist(s, e, next, prev) \
93         do{\
94                 (s)->prev->next=(e)->next;  \
95                 (e)->next->prev=(s)->prev ; \
96         }while(0)
97
98
99
100 /*! \brief insert after (head) */
101 #define clist_insert(head, c, next, prev) \
102         clist_insert_sublist(head, c, c, next, prev)
103
104
105
106 /*! \brief  append at the end of the list (head->prev) */
107 #define clist_append(head, c, next, prev) \
108         clist_append_sublist(head, c, c, next, prev)
109
110
111
112 /*! \brief  remove and element */
113 #define clist_rm(c, next, prev) \
114         clist_rm_sublist(c, c, next, prev)
115
116
117
118 /*! \brief  iterate on a clist */
119 #define clist_foreach(head, v, dir) \
120         for((v)=(head)->dir; (v)!=(void*)(head); (v)=(v)->dir)
121
122 /*! \brief  iterate on a clist, safe version (requires an extra bak. var)
123  * (it allows removing of the current element) */
124 #define clist_foreach_safe(head, v, bak,  dir) \
125         for((v)=(head)->dir, (bak)=(v)->dir; (v)!=(void*)(head); \
126                                 (v)=(bak), (bak)=(v)->dir)
127 #endif