File: queue_8h-source.html

package info (click to toggle)
klone 1.1.1.dfsg1-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 6,480 kB
  • ctags: 4,238
  • sloc: ansic: 16,288; makefile: 384; sh: 351
file content (311 lines) | stat: -rw-r--r-- 27,972 bytes parent folder | download
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>LibU: queue.h Source File</title>
<link href="kl.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.3.9.1 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a></div>
<div class="nav">
<a class="el" href="dir_000001.html">u</a></div>
<h1>queue.h</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">/*  $Id: queue.h,v 1.2 2005/12/04 20:41:15 tho Exp $ */</span>
00002 <span class="comment">/*  $OpenBSD: queue.h,v 1.22 2001/06/23 04:39:35 angelos Exp $  */</span>
00003 <span class="comment">/*  $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $   */</span>
00004 
00005 <span class="preprocessor">#ifndef _U_QUEUE_H_</span>
00006 <span class="preprocessor"></span><span class="preprocessor">#define _U_QUEUE_H_</span>
00007 <span class="preprocessor"></span>
00008 
00009 <span class="comment">/* A list is headed by a single forward pointer (or an array of forward</span>
00010 <span class="comment"> * pointers for a hash table header). The elements are doubly linked so that</span>
00011 <span class="comment"> * an arbitrary element can be removed without a need to traverse the list. </span>
00012 <span class="comment"> * New elements can be added to the list before or after an existing element </span>
00013 <span class="comment"> * or at the head of the list. A list may only be traversed in the forward </span>
00014 <span class="comment"> * direction. */</span>
00015 
00016 <span class="preprocessor">#define LIST_HEAD(name, type)                                           \</span>
00017 <span class="preprocessor">struct name {                                                           \</span>
00018 <span class="preprocessor">        struct type *lh_first;  </span><span class="comment">/* first element */</span>                     \
00019 }
00020 
00021 <span class="preprocessor">#define LIST_HEAD_INITIALIZER(head)                                     \</span>
00022 <span class="preprocessor">        { NULL }</span>
00023 <span class="preprocessor"></span>
00024 <span class="preprocessor">#define LIST_ENTRY(type)                                                \</span>
00025 <span class="preprocessor">struct {                                                                \</span>
00026 <span class="preprocessor">        struct type *le_next;   </span><span class="comment">/* next element */</span>                      \
00027         struct type **le_prev;  <span class="comment">/* address of previous next element */</span>  \
00028 }
00029 
00030 <span class="preprocessor">#define LIST_FIRST(head)                ((head)-&gt;lh_first)</span>
00031 <span class="preprocessor"></span><span class="preprocessor">#define LIST_END(head)                  NULL</span>
00032 <span class="preprocessor"></span><span class="preprocessor">#define LIST_EMPTY(head)                (LIST_FIRST(head) == LIST_END(head))</span>
00033 <span class="preprocessor"></span><span class="preprocessor">#define LIST_NEXT(elm, field)           ((elm)-&gt;field.le_next)</span>
00034 <span class="preprocessor"></span>
00035 <span class="preprocessor">#define LIST_FOREACH(var, head, field)                                  \</span>
00036 <span class="preprocessor">        for((var) = LIST_FIRST(head);                                   \</span>
00037 <span class="preprocessor">            (var)!= LIST_END(head);                                     \</span>
00038 <span class="preprocessor">            (var) = LIST_NEXT(var, field))</span>
00039 <span class="preprocessor"></span>
00040 <span class="preprocessor">#define LIST_INIT(head) do {                                            \</span>
00041 <span class="preprocessor">        LIST_FIRST(head) = LIST_END(head);                              \</span>
00042 <span class="preprocessor">} while (0)</span>
00043 <span class="preprocessor"></span>
00044 <span class="preprocessor">#define LIST_INSERT_AFTER(listelm, elm, field) do {                     \</span>
00045 <span class="preprocessor">        if (((elm)-&gt;field.le_next = (listelm)-&gt;field.le_next) != NULL)  \</span>
00046 <span class="preprocessor">                (listelm)-&gt;field.le_next-&gt;field.le_prev =               \</span>
00047 <span class="preprocessor">                    &amp;(elm)-&gt;field.le_next;                              \</span>
00048 <span class="preprocessor">        (listelm)-&gt;field.le_next = (elm);                               \</span>
00049 <span class="preprocessor">        (elm)-&gt;field.le_prev = &amp;(listelm)-&gt;field.le_next;               \</span>
00050 <span class="preprocessor">} while (0)</span>
00051 <span class="preprocessor"></span>
00052 <span class="preprocessor">#define LIST_INSERT_BEFORE(listelm, elm, field) do {                    \</span>
00053 <span class="preprocessor">        (elm)-&gt;field.le_prev = (listelm)-&gt;field.le_prev;                \</span>
00054 <span class="preprocessor">        (elm)-&gt;field.le_next = (listelm);                               \</span>
00055 <span class="preprocessor">        *(listelm)-&gt;field.le_prev = (elm);                              \</span>
00056 <span class="preprocessor">        (listelm)-&gt;field.le_prev = &amp;(elm)-&gt;field.le_next;               \</span>
00057 <span class="preprocessor">} while (0)</span>
00058 <span class="preprocessor"></span>
00059 <span class="preprocessor">#define LIST_INSERT_HEAD(head, elm, field) do {                         \</span>
00060 <span class="preprocessor">        if (((elm)-&gt;field.le_next = (head)-&gt;lh_first) != NULL)          \</span>
00061 <span class="preprocessor">                (head)-&gt;lh_first-&gt;field.le_prev = &amp;(elm)-&gt;field.le_next;\</span>
00062 <span class="preprocessor">        (head)-&gt;lh_first = (elm);                                       \</span>
00063 <span class="preprocessor">        (elm)-&gt;field.le_prev = &amp;(head)-&gt;lh_first;                       \</span>
00064 <span class="preprocessor">} while (0)</span>
00065 <span class="preprocessor"></span>
00066 <span class="preprocessor">#define LIST_REMOVE(elm, field) do {                                    \</span>
00067 <span class="preprocessor">        if ((elm)-&gt;field.le_next != NULL)                               \</span>
00068 <span class="preprocessor">                (elm)-&gt;field.le_next-&gt;field.le_prev =                   \</span>
00069 <span class="preprocessor">                    (elm)-&gt;field.le_prev;                               \</span>
00070 <span class="preprocessor">        *(elm)-&gt;field.le_prev = (elm)-&gt;field.le_next;                   \</span>
00071 <span class="preprocessor">} while (0)</span>
00072 <span class="preprocessor"></span>
00073 <span class="preprocessor">#define LIST_REPLACE(elm, elm2, field) do {                             \</span>
00074 <span class="preprocessor">        if (((elm2)-&gt;field.le_next = (elm)-&gt;field.le_next) != NULL)     \</span>
00075 <span class="preprocessor">                (elm2)-&gt;field.le_next-&gt;field.le_prev =                  \</span>
00076 <span class="preprocessor">                    &amp;(elm2)-&gt;field.le_next;                             \</span>
00077 <span class="preprocessor">        (elm2)-&gt;field.le_prev = (elm)-&gt;field.le_prev;                   \</span>
00078 <span class="preprocessor">        *(elm2)-&gt;field.le_prev = (elm2);                                \</span>
00079 <span class="preprocessor">} while (0)</span>
00080 <span class="preprocessor"></span>
00081 
00082 <span class="comment">/* A tail queue is headed by a pair of pointers, one to the head of the</span>
00083 <span class="comment"> * list and the other to the tail of the list. The elements are doubly</span>
00084 <span class="comment"> * linked so that an arbitrary element can be removed without a need to</span>
00085 <span class="comment"> * traverse the list. New elements can be added to the list after</span>
00086 <span class="comment"> * an existing element, at the head of the list, or at the end of the</span>
00087 <span class="comment"> * list. A tail queue may only be traversed in the forward direction. */</span>
00088 
00089 <span class="comment">/* Tail queue definitions. */</span>
00090 <span class="preprocessor">#define TAILQ_HEAD(name, type)                                              \</span>
00091 <span class="preprocessor">struct name {                                                               \</span>
00092 <span class="preprocessor">        struct type *tqh_first;     </span><span class="comment">/* first element */</span>                     \
00093         struct type **tqh_last;     <span class="comment">/* addr of last next element */</span>         \
00094 }
00095 
00096 <span class="preprocessor">#define TAILQ_ENTRY(type)                                                   \</span>
00097 <span class="preprocessor">struct {                                                                    \</span>
00098 <span class="preprocessor">        struct type *tqe_next;      </span><span class="comment">/* next element */</span>                      \
00099         struct type **tqe_prev;     <span class="comment">/* address of previous next element */</span>  \
00100 }
00101 
00102 <span class="comment">/* Tail queue functions. */</span>
00103 <span class="preprocessor">#define TAILQ_INIT(head) {                                                  \</span>
00104 <span class="preprocessor">        (head)-&gt;tqh_first = NULL;                                           \</span>
00105 <span class="preprocessor">        (head)-&gt;tqh_last = &amp;(head)-&gt;tqh_first;                              \</span>
00106 <span class="preprocessor">}</span>
00107 <span class="preprocessor"></span>
00108 <span class="preprocessor">#define TAILQ_INSERT_HEAD(head, elm, field) {                               \</span>
00109 <span class="preprocessor">        if (((elm)-&gt;field.tqe_next = (head)-&gt;tqh_first) != NULL)            \</span>
00110 <span class="preprocessor">                (elm)-&gt;field.tqe_next-&gt;field.tqe_prev =                     \</span>
00111 <span class="preprocessor">                    &amp;(elm)-&gt;field.tqe_next;                                 \</span>
00112 <span class="preprocessor">        else                                                                \</span>
00113 <span class="preprocessor">                (head)-&gt;tqh_last = &amp;(elm)-&gt;field.tqe_next;                  \</span>
00114 <span class="preprocessor">        (head)-&gt;tqh_first = (elm);                                          \</span>
00115 <span class="preprocessor">        (elm)-&gt;field.tqe_prev = &amp;(head)-&gt;tqh_first;                         \</span>
00116 <span class="preprocessor">}</span>
00117 <span class="preprocessor"></span>
00118 <span class="preprocessor">#define TAILQ_INSERT_TAIL(head, elm, field) {                               \</span>
00119 <span class="preprocessor">        (elm)-&gt;field.tqe_next = NULL;                                       \</span>
00120 <span class="preprocessor">        (elm)-&gt;field.tqe_prev = (head)-&gt;tqh_last;                           \</span>
00121 <span class="preprocessor">        *(head)-&gt;tqh_last = (elm);                                          \</span>
00122 <span class="preprocessor">        (head)-&gt;tqh_last = &amp;(elm)-&gt;field.tqe_next;                          \</span>
00123 <span class="preprocessor">}</span>
00124 <span class="preprocessor"></span>
00125 <span class="preprocessor">#define TAILQ_INSERT_AFTER(head, listelm, elm, field) {                     \</span>
00126 <span class="preprocessor">        if (((elm)-&gt;field.tqe_next = (listelm)-&gt;field.tqe_next) != NULL)    \</span>
00127 <span class="preprocessor">                (elm)-&gt;field.tqe_next-&gt;field.tqe_prev =                     \</span>
00128 <span class="preprocessor">                    &amp;(elm)-&gt;field.tqe_next;                                 \</span>
00129 <span class="preprocessor">        else                                                                \</span>
00130 <span class="preprocessor">                (head)-&gt;tqh_last = &amp;(elm)-&gt;field.tqe_next;                  \</span>
00131 <span class="preprocessor">        (listelm)-&gt;field.tqe_next = (elm);                                  \</span>
00132 <span class="preprocessor">        (elm)-&gt;field.tqe_prev = &amp;(listelm)-&gt;field.tqe_next;                 \</span>
00133 <span class="preprocessor">}</span>
00134 <span class="preprocessor"></span>
00135 <span class="preprocessor">#define TAILQ_INSERT_BEFORE(listelm, elm, field) do {                       \</span>
00136 <span class="preprocessor">        (elm)-&gt;field.tqe_prev = (listelm)-&gt;field.tqe_prev;                  \</span>
00137 <span class="preprocessor">        (elm)-&gt;field.tqe_next = (listelm);                                  \</span>
00138 <span class="preprocessor">        *(listelm)-&gt;field.tqe_prev = (elm);                                 \</span>
00139 <span class="preprocessor">        (listelm)-&gt;field.tqe_prev = &amp;(elm)-&gt;field.tqe_next;                 \</span>
00140 <span class="preprocessor">} while (0)</span>
00141 <span class="preprocessor"></span>
00142 <span class="preprocessor">#define TAILQ_REMOVE(head, elm, field) {                                    \</span>
00143 <span class="preprocessor">        if (((elm)-&gt;field.tqe_next) != NULL)                                \</span>
00144 <span class="preprocessor">                (elm)-&gt;field.tqe_next-&gt;field.tqe_prev =                     \</span>
00145 <span class="preprocessor">                    (elm)-&gt;field.tqe_prev;                                  \</span>
00146 <span class="preprocessor">        else                                                                \</span>
00147 <span class="preprocessor">                (head)-&gt;tqh_last = (elm)-&gt;field.tqe_prev;                   \</span>
00148 <span class="preprocessor">        *(elm)-&gt;field.tqe_prev = (elm)-&gt;field.tqe_next;                     \</span>
00149 <span class="preprocessor">}</span>
00150 <span class="preprocessor"></span>
00151 
00152 <span class="comment">/* A circle queue is headed by a pair of pointers, one to the head of the</span>
00153 <span class="comment"> * list and the other to the tail of the list. The elements are doubly</span>
00154 <span class="comment"> * linked so that an arbitrary element can be removed without a need to</span>
00155 <span class="comment"> * traverse the list. New elements can be added to the list before or after</span>
00156 <span class="comment"> * an existing element, at the head of the list, or at the end of the list.</span>
00157 <span class="comment"> * A circle queue may be traversed in either direction, but has a more</span>
00158 <span class="comment"> * complex end of list detection. */</span>
00159 
00160 <span class="comment">/* Circular queue definitions. */</span>
00161 <span class="preprocessor">#define CIRCLEQ_HEAD(name, type)                                            \</span>
00162 <span class="preprocessor">struct name {                                                               \</span>
00163 <span class="preprocessor">        struct type *cqh_first;               </span><span class="comment">/* first element */</span>           \
00164         struct type *cqh_last;                <span class="comment">/* last element */</span>            \
00165 }
00166 
00167 <span class="preprocessor">#define CIRCLEQ_ENTRY(type)                                                 \</span>
00168 <span class="preprocessor">struct {                                                                    \</span>
00169 <span class="preprocessor">        struct type *cqe_next;                </span><span class="comment">/* next element */</span>            \
00170         struct type *cqe_prev;                <span class="comment">/* previous element */</span>        \
00171 }
00172 
00173 <span class="comment">/* Circular queue functions. */</span>
00174 <span class="preprocessor">#define CIRCLEQ_INIT(head) {                                                \</span>
00175 <span class="preprocessor">        (head)-&gt;cqh_first = (void *)(head);                                 \</span>
00176 <span class="preprocessor">        (head)-&gt;cqh_last = (void *)(head);                                  \</span>
00177 <span class="preprocessor">}</span>
00178 <span class="preprocessor"></span>
00179 <span class="preprocessor">#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) {                   \</span>
00180 <span class="preprocessor">        (elm)-&gt;field.cqe_next = (listelm)-&gt;field.cqe_next;                  \</span>
00181 <span class="preprocessor">        (elm)-&gt;field.cqe_prev = (listelm);                                  \</span>
00182 <span class="preprocessor">        if ((listelm)-&gt;field.cqe_next == (void *)(head))                    \</span>
00183 <span class="preprocessor">                (head)-&gt;cqh_last = (elm);                                   \</span>
00184 <span class="preprocessor">        else                                                                \</span>
00185 <span class="preprocessor">                (listelm)-&gt;field.cqe_next-&gt;field.cqe_prev = (elm);          \</span>
00186 <span class="preprocessor">        (listelm)-&gt;field.cqe_next = (elm);                                  \</span>
00187 <span class="preprocessor">}</span>
00188 <span class="preprocessor"></span>
00189 <span class="preprocessor">#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) {                  \</span>
00190 <span class="preprocessor">        (elm)-&gt;field.cqe_next = (listelm);                                  \</span>
00191 <span class="preprocessor">        (elm)-&gt;field.cqe_prev = (listelm)-&gt;field.cqe_prev;                  \</span>
00192 <span class="preprocessor">        if ((listelm)-&gt;field.cqe_prev == (void *)(head))                    \</span>
00193 <span class="preprocessor">                (head)-&gt;cqh_first = (elm);                                  \</span>
00194 <span class="preprocessor">        else                                                                \</span>
00195 <span class="preprocessor">                (listelm)-&gt;field.cqe_prev-&gt;field.cqe_next = (elm);          \</span>
00196 <span class="preprocessor">        (listelm)-&gt;field.cqe_prev = (elm);                                  \</span>
00197 <span class="preprocessor">}</span>
00198 <span class="preprocessor"></span>
00199 <span class="preprocessor">#define CIRCLEQ_INSERT_HEAD(head, elm, field) {                             \</span>
00200 <span class="preprocessor">        (elm)-&gt;field.cqe_next = (head)-&gt;cqh_first;                          \</span>
00201 <span class="preprocessor">        (elm)-&gt;field.cqe_prev = (void *)(head);                             \</span>
00202 <span class="preprocessor">        if ((head)-&gt;cqh_last == (void *)(head))                             \</span>
00203 <span class="preprocessor">                (head)-&gt;cqh_last = (elm);                                   \</span>
00204 <span class="preprocessor">        else                                                                \</span>
00205 <span class="preprocessor">                (head)-&gt;cqh_first-&gt;field.cqe_prev = (elm);                  \</span>
00206 <span class="preprocessor">        (head)-&gt;cqh_first = (elm);                                          \</span>
00207 <span class="preprocessor">}</span>
00208 <span class="preprocessor"></span>
00209 <span class="preprocessor">#define CIRCLEQ_INSERT_TAIL(head, elm, field) {                             \</span>
00210 <span class="preprocessor">        (elm)-&gt;field.cqe_next = (void *)(head);                             \</span>
00211 <span class="preprocessor">        (elm)-&gt;field.cqe_prev = (head)-&gt;cqh_last;                           \</span>
00212 <span class="preprocessor">        if ((head)-&gt;cqh_first == (void *)(head))                            \</span>
00213 <span class="preprocessor">                (head)-&gt;cqh_first = (elm);                                  \</span>
00214 <span class="preprocessor">        else                                                                \</span>
00215 <span class="preprocessor">                (head)-&gt;cqh_last-&gt;field.cqe_next = (elm);                   \</span>
00216 <span class="preprocessor">        (head)-&gt;cqh_last = (elm);                                           \</span>
00217 <span class="preprocessor">}</span>
00218 <span class="preprocessor"></span>
00219 <span class="preprocessor">#define CIRCLEQ_REMOVE(head, elm, field) {                                  \</span>
00220 <span class="preprocessor">        if ((elm)-&gt;field.cqe_next == (void *)(head))                        \</span>
00221 <span class="preprocessor">                (head)-&gt;cqh_last = (elm)-&gt;field.cqe_prev;                   \</span>
00222 <span class="preprocessor">        else                                                                \</span>
00223 <span class="preprocessor">                (elm)-&gt;field.cqe_next-&gt;field.cqe_prev =                     \</span>
00224 <span class="preprocessor">                    (elm)-&gt;field.cqe_prev;                                  \</span>
00225 <span class="preprocessor">        if ((elm)-&gt;field.cqe_prev == (void *)(head))                        \</span>
00226 <span class="preprocessor">                (head)-&gt;cqh_first = (elm)-&gt;field.cqe_next;                  \</span>
00227 <span class="preprocessor">        else                                                                \</span>
00228 <span class="preprocessor">                (elm)-&gt;field.cqe_prev-&gt;field.cqe_next =                     \</span>
00229 <span class="preprocessor">                    (elm)-&gt;field.cqe_next;                                  \</span>
00230 <span class="preprocessor">}</span>
00231 <span class="preprocessor"></span>
00232 <span class="preprocessor">#ifndef LIST_ENTRY_NULL</span>
00233 <span class="preprocessor"></span><span class="preprocessor">#define LIST_ENTRY_NULL { NULL, NULL }</span>
00234 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00235 <span class="preprocessor"></span>
00236 <span class="preprocessor">#ifndef LIST_FOREACH</span>
00237 <span class="preprocessor"></span><span class="preprocessor">#define LIST_FOREACH(var, head, entries)                                    \</span>
00238 <span class="preprocessor">    for (var = (head)-&gt;lh_first; var != NULL; var = var-&gt;entries.le_next)</span>
00239 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00240 <span class="preprocessor"></span>
00241 <span class="preprocessor">#ifndef LIST_FIRST</span>
00242 <span class="preprocessor"></span><span class="preprocessor">#define LIST_FIRST(head)    ((head)-&gt;lh_first)</span>
00243 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
00244 <span class="preprocessor"></span>
00245 <span class="preprocessor">#ifndef TAILQ_ENTRY_NULL</span>
00246 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_ENTRY_NULL { NULL, NULL }</span>
00247 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00248 <span class="preprocessor"></span>
00249 <span class="preprocessor">#ifndef TAILQ_FIRST</span>
00250 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_FIRST(head)   ((head)-&gt;tqh_first)</span>
00251 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
00252 <span class="preprocessor"></span>
00253 <span class="preprocessor">#ifndef TAILQ_END</span>
00254 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_END(head)     NULL</span>
00255 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00256 <span class="preprocessor"></span>
00257 <span class="preprocessor">#ifndef TAILQ_NEXT</span>
00258 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_NEXT(elm, field)  ((elm)-&gt;field.tqe_next)</span>
00259 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00260 <span class="preprocessor"></span>
00261 <span class="preprocessor">#ifndef TAILQ_LAST</span>
00262 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_LAST(head, headname)                                          \</span>
00263 <span class="preprocessor">        (*(((struct headname *)((head)-&gt;tqh_last))-&gt;tqh_last))</span>
00264 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00265 <span class="preprocessor"></span>
00266 <span class="preprocessor">#ifndef TAILQ_PREV</span>
00267 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_PREV(elm, headname, field)                                    \</span>
00268 <span class="preprocessor">        (*(((struct headname *)((elm)-&gt;field.tqe_prev))-&gt;tqh_last))</span>
00269 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00270 <span class="preprocessor"></span>
00271 <span class="preprocessor">#ifndef TAILQ_EMPTY</span>
00272 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_EMPTY(head)                                                   \</span>
00273 <span class="preprocessor">        (TAILQ_FIRST(head) == TAILQ_END(head))</span>
00274 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00275 <span class="preprocessor"></span>
00276 <span class="preprocessor">#ifndef TAILQ_FOREACH</span>
00277 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_FOREACH(var, head, field)                                     \</span>
00278 <span class="preprocessor">        for((var) = TAILQ_FIRST(head);                                      \</span>
00279 <span class="preprocessor">            (var) != TAILQ_END(head);                                       \</span>
00280 <span class="preprocessor">            (var) = TAILQ_NEXT(var, field))</span>
00281 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00282 <span class="preprocessor"></span>
00283 <span class="preprocessor">#ifndef TAILQ_FOREACH_REVERSE</span>
00284 <span class="preprocessor"></span><span class="preprocessor">#define TAILQ_FOREACH_REVERSE(var, head, field, headname)                   \</span>
00285 <span class="preprocessor">        for((var) = TAILQ_LAST(head, headname);                             \</span>
00286 <span class="preprocessor">            (var) != TAILQ_END(head);                                       \</span>
00287 <span class="preprocessor">            (var) = TAILQ_PREV(var, headname, field))</span>
00288 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00289 <span class="preprocessor"></span>
00290 <span class="preprocessor">#endif </span><span class="comment">/* !_U_QUEUE_H_ */</span>
</pre></div><hr>
<div> 
  <div style="text-align:left">
    <a href="http://www.koanlogic.com/kl/cont/gb/html/products.html">&larr;Products</a>
  </div>
  <div style="text-align:center;">
    &copy; 2005-2006 - <a href="http://www.koanlogic.com">KoanLogic S.r.l.</a> - All rights reserved
  </div>
</div>

</body>
</html>