Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: third_party/libevent/linux/sys/queue.h

Issue 1422623002: Build fixes for fnl/musl (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: fix android build Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « shell/BUILD.gn ('k') | third_party/libteken/teken/teken.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* $OpenBSD: queue.h,v 1.16 2000/09/07 19:47:59 art Exp $ */
2 /* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */
3
4 /* 1 /*
5 * Copyright (c) 1991, 1993 2 * Copyright (c) 1991, 1993
6 * The Regents of the University of California. All rights reserved. 3 * The Regents of the University of California. All rights reserved.
7 * 4 *
8 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
10 * are met: 7 * are met:
11 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 15 matching lines...) Expand all
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE. 27 * SUCH DAMAGE.
31 * 28 *
32 * @(#)queue.h 8.5 (Berkeley) 8/20/94 29 * @(#)queue.h 8.5 (Berkeley) 8/20/94
33 */ 30 */
34 31
35 #ifndef _SYS_QUEUE_H_ 32 #ifndef _SYS_QUEUE_H_
36 #define _SYS_QUEUE_H_ 33 #define _SYS_QUEUE_H_
37 34
38 /* 35 /*
39 * This file defines five types of data structures: singly-linked lists, 36 * This file defines five types of data structures: singly-linked lists,
jamesr 2015/10/21 22:55:43 where'd this file come from?
cdotstout 2015/10/22 00:03:24 removed it, I realized it's already there
40 * lists, simple queues, tail queues, and circular queues. 37 * lists, simple queues, tail queues, and circular queues.
41 * 38 *
42 * 39 * A singly-linked list is headed by a single forward pointer. The
43 * A singly-linked list is headed by a single forward pointer. The elements 40 * elements are singly linked for minimum space and pointer manipulation
44 * are singly linked for minimum space and pointer manipulation overhead at 41 * overhead at the expense of O(n) removal for arbitrary elements. New
45 * the expense of O(n) removal for arbitrary elements. New elements can be 42 * elements can be added to the list after an existing element or at the
46 * added to the list after an existing element or at the head of the list. 43 * head of the list. Elements being removed from the head of the list
47 * Elements being removed from the head of the list should use the explicit 44 * should use the explicit macro for this purpose for optimum
48 * macro for this purpose for optimum efficiency. A singly-linked list may 45 * efficiency. A singly-linked list may only be traversed in the forward
49 * only be traversed in the forward direction. Singly-linked lists are ideal 46 * direction. Singly-linked lists are ideal for applications with large
50 * for applications with large datasets and few or no removals or for 47 * datasets and few or no removals or for implementing a LIFO queue.
51 * implementing a LIFO queue.
52 * 48 *
53 * A list is headed by a single forward pointer (or an array of forward 49 * A list is headed by a single forward pointer (or an array of forward
54 * pointers for a hash table header). The elements are doubly linked 50 * pointers for a hash table header). The elements are doubly linked
55 * so that an arbitrary element can be removed without a need to 51 * so that an arbitrary element can be removed without a need to
56 * traverse the list. New elements can be added to the list before 52 * traverse the list. New elements can be added to the list before
57 * or after an existing element or at the head of the list. A list 53 * or after an existing element or at the head of the list. A list
58 * may only be traversed in the forward direction. 54 * may only be traversed in the forward direction.
59 * 55 *
60 * A simple queue is headed by a pair of pointers, one the head of the 56 * A simple queue is headed by a pair of pointers, one the head of the
61 * list and the other to the tail of the list. The elements are singly 57 * list and the other to the tail of the list. The elements are singly
62 * linked to save space, so elements can only be removed from the 58 * linked to save space, so elements can only be removed from the
63 * head of the list. New elements can be added to the list before or after 59 * head of the list. New elements can be added to the list after
64 * an existing element, at the head of the list, or at the end of the 60 * an existing element, at the head of the list, or at the end of the
65 * list. A simple queue may only be traversed in the forward direction. 61 * list. A simple queue may only be traversed in the forward direction.
66 * 62 *
67 * A tail queue is headed by a pair of pointers, one to the head of the 63 * A tail queue is headed by a pair of pointers, one to the head of the
68 * list and the other to the tail of the list. The elements are doubly 64 * list and the other to the tail of the list. The elements are doubly
69 * linked so that an arbitrary element can be removed without a need to 65 * linked so that an arbitrary element can be removed without a need to
70 * traverse the list. New elements can be added to the list before or 66 * traverse the list. New elements can be added to the list before or
71 * after an existing element, at the head of the list, or at the end of 67 * after an existing element, at the head of the list, or at the end of
72 * the list. A tail queue may be traversed in either direction. 68 * the list. A tail queue may be traversed in either direction.
73 * 69 *
74 * A circle queue is headed by a pair of pointers, one to the head of the 70 * A circle queue is headed by a pair of pointers, one to the head of the
75 * list and the other to the tail of the list. The elements are doubly 71 * list and the other to the tail of the list. The elements are doubly
76 * linked so that an arbitrary element can be removed without a need to 72 * linked so that an arbitrary element can be removed without a need to
77 * traverse the list. New elements can be added to the list before or after 73 * traverse the list. New elements can be added to the list before or after
78 * an existing element, at the head of the list, or at the end of the list. 74 * an existing element, at the head of the list, or at the end of the list.
79 * A circle queue may be traversed in either direction, but has a more 75 * A circle queue may be traversed in either direction, but has a more
80 * complex end of list detection. 76 * complex end of list detection.
81 * 77 *
82 * For details on the use of these macros, see the queue(3) manual page. 78 * For details on the use of these macros, see the queue(3) manual page.
83 */ 79 */
84 80
85 /* 81 /*
86 * Singly-linked List definitions. 82 * List definitions.
87 */ 83 */
88 #define SLIST_HEAD(name, type)» » » » » » \ 84 #define»LIST_HEAD(name, type)» » » » » » \
89 struct name {» » » » » » » » \ 85 struct name {» » » » » » » » \
90 » struct type *slh_first;»/* first element */» » » \ 86 » struct type *lh_first;» /* first element */» » » \
91 } 87 }
92 88
93 #define»SLIST_HEAD_INITIALIZER(head)» » » » » \ 89 #define»LIST_HEAD_INITIALIZER(head)» » » » » \
94 { NULL } 90 { NULL }
95 91
96 #ifndef WIN32 92 #define»LIST_ENTRY(type)» » » » » » \
97 #define SLIST_ENTRY(type)» » » » » » \
98 struct {» » » » » » » » \
99 » struct type *sle_next;» /* next element */» » » \
100 }
101 #endif
102
103 /*
104 * Singly-linked List access methods.
105 */
106 #define»SLIST_FIRST(head)» ((head)->slh_first)
107 #define»SLIST_END(head)»» NULL
108 #define»SLIST_EMPTY(head)» (SLIST_FIRST(head) == SLIST_END(head))
109 #define»SLIST_NEXT(elm, field)» ((elm)->field.sle_next)
110
111 #define»SLIST_FOREACH(var, head, field)»» » » » \
112 » for((var) = SLIST_FIRST(head);» » » » » \
113 » (var) != SLIST_END(head);» » » » » \
114 » (var) = SLIST_NEXT(var, field))
115
116 /*
117 * Singly-linked List functions.
118 */
119 #define»SLIST_INIT(head) {» » » » » » \
120 » SLIST_FIRST(head) = SLIST_END(head);» » » » \
121 }
122
123 #define»SLIST_INSERT_AFTER(slistelm, elm, field) do {» » » \
124 » (elm)->field.sle_next = (slistelm)->field.sle_next;» » \
125 » (slistelm)->field.sle_next = (elm);» » » » \
126 } while (0)
127
128 #define»SLIST_INSERT_HEAD(head, elm, field) do {» » » \
129 » (elm)->field.sle_next = (head)->slh_first;» » » \
130 » (head)->slh_first = (elm);» » » » » \
131 } while (0)
132
133 #define»SLIST_REMOVE_HEAD(head, field) do {» » » » \
134 » (head)->slh_first = (head)->slh_first->field.sle_next;» » \
135 } while (0)
136
137 /*
138 * List definitions.
139 */
140 #define LIST_HEAD(name, type)» » » » » » \
141 struct name {» » » » » » » » \
142 » struct type *lh_first;» /* first element */» » » \
143 }
144
145 #define LIST_HEAD_INITIALIZER(head)» » » » » \
146 » { NULL }
147
148 #define LIST_ENTRY(type)» » » » » » \
149 struct { \ 93 struct { \
150 struct type *le_next; /* next element */ \ 94 struct type *le_next; /* next element */ \
151 struct type **le_prev; /* address of previous next element */ \ 95 struct type **le_prev; /* address of previous next element */ \
152 } 96 }
153 97
154 /* 98 /*
155 * List access methods
156 */
157 #define LIST_FIRST(head) ((head)->lh_first)
158 #define LIST_END(head) NULL
159 #define LIST_EMPTY(head) (LIST_FIRST(head) == LIST_END(head))
160 #define LIST_NEXT(elm, field) ((elm)->field.le_next)
161
162 #define LIST_FOREACH(var, head, field) \
163 for((var) = LIST_FIRST(head); \
164 (var)!= LIST_END(head); \
165 (var) = LIST_NEXT(var, field))
166
167 /*
168 * List functions. 99 * List functions.
169 */ 100 */
170 #define LIST_INIT(head) do { \ 101 #define LIST_INIT(head) do { \
171 » LIST_FIRST(head) = LIST_END(head);» » » » \ 102 » (head)->lh_first = NULL;» » » » » \
172 } while (0) 103 } while (/*CONSTCOND*/0)
173 104
174 #define LIST_INSERT_AFTER(listelm, elm, field) do {» » » \ 105 #define»LIST_INSERT_AFTER(listelm, elm, field) do {» » » \
175 if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ 106 if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \
176 (listelm)->field.le_next->field.le_prev = \ 107 (listelm)->field.le_next->field.le_prev = \
177 &(elm)->field.le_next; \ 108 &(elm)->field.le_next; \
178 (listelm)->field.le_next = (elm); \ 109 (listelm)->field.le_next = (elm); \
179 (elm)->field.le_prev = &(listelm)->field.le_next; \ 110 (elm)->field.le_prev = &(listelm)->field.le_next; \
180 } while (0) 111 } while (/*CONSTCOND*/0)
181 112
182 #define LIST_INSERT_BEFORE(listelm, elm, field) do { \ 113 #define LIST_INSERT_BEFORE(listelm, elm, field) do { \
183 (elm)->field.le_prev = (listelm)->field.le_prev; \ 114 (elm)->field.le_prev = (listelm)->field.le_prev; \
184 (elm)->field.le_next = (listelm); \ 115 (elm)->field.le_next = (listelm); \
185 *(listelm)->field.le_prev = (elm); \ 116 *(listelm)->field.le_prev = (elm); \
186 (listelm)->field.le_prev = &(elm)->field.le_next; \ 117 (listelm)->field.le_prev = &(elm)->field.le_next; \
187 } while (0) 118 } while (/*CONSTCOND*/0)
188 119
189 #define LIST_INSERT_HEAD(head, elm, field) do {»» » » \ 120 #define»LIST_INSERT_HEAD(head, elm, field) do {»» » » \
190 if (((elm)->field.le_next = (head)->lh_first) != NULL) \ 121 if (((elm)->field.le_next = (head)->lh_first) != NULL) \
191 (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ 122 (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
192 (head)->lh_first = (elm); \ 123 (head)->lh_first = (elm); \
193 (elm)->field.le_prev = &(head)->lh_first; \ 124 (elm)->field.le_prev = &(head)->lh_first; \
194 } while (0) 125 } while (/*CONSTCOND*/0)
195 126
196 #define LIST_REMOVE(elm, field) do {» » » » » \ 127 #define»LIST_REMOVE(elm, field) do {» » » » » \
197 if ((elm)->field.le_next != NULL) \ 128 if ((elm)->field.le_next != NULL) \
198 » » (elm)->field.le_next->field.le_prev =» » » \ 129 » » (elm)->field.le_next->field.le_prev = » » » \
199 (elm)->field.le_prev; \ 130 (elm)->field.le_prev; \
200 *(elm)->field.le_prev = (elm)->field.le_next; \ 131 *(elm)->field.le_prev = (elm)->field.le_next; \
201 } while (0) 132 } while (/*CONSTCOND*/0)
202 133
203 #define LIST_REPLACE(elm, elm2, field) do {» » » » \ 134 #define»LIST_FOREACH(var, head, field)» » » » » \
204 » if (((elm2)->field.le_next = (elm)->field.le_next) != NULL)» \ 135 » for ((var) = ((head)->lh_first);» » » » \
205 » » (elm2)->field.le_next->field.le_prev =» » » \ 136 » » (var);» » » » » » » \
206 » » &(elm2)->field.le_next;» » » » \ 137 » » (var) = ((var)->field.le_next))
207 » (elm2)->field.le_prev = (elm)->field.le_prev;» » » \ 138
208 » *(elm2)->field.le_prev = (elm2);» » » » \ 139 /*
209 } while (0) 140 * List access methods.
141 */
142 #define»LIST_EMPTY(head)» » ((head)->lh_first == NULL)
143 #define»LIST_FIRST(head)» » ((head)->lh_first)
144 #define»LIST_NEXT(elm, field)» » ((elm)->field.le_next)
145
146
147 /*
148 * Singly-linked List definitions.
149 */
150 #define»SLIST_HEAD(name, type)» » » » » » \
151 struct name {» » » » » » » » \
152 » struct type *slh_first;»/* first element */» » » \
153 }
154
155 #define»SLIST_HEAD_INITIALIZER(head)» » » » » \
156 » { NULL }
157
158 #define»SLIST_ENTRY(type)» » » » » » \
159 struct {» » » » » » » » \
160 » struct type *sle_next;» /* next element */» » » \
161 }
162
163 /*
164 * Singly-linked List functions.
165 */
166 #define»SLIST_INIT(head) do {» » » » » » \
167 » (head)->slh_first = NULL;» » » » » \
168 } while (/*CONSTCOND*/0)
169
170 #define»SLIST_INSERT_AFTER(slistelm, elm, field) do {» » » \
171 » (elm)->field.sle_next = (slistelm)->field.sle_next;» » \
172 » (slistelm)->field.sle_next = (elm);» » » » \
173 } while (/*CONSTCOND*/0)
174
175 #define»SLIST_INSERT_HEAD(head, elm, field) do {» » » \
176 » (elm)->field.sle_next = (head)->slh_first;» » » \
177 » (head)->slh_first = (elm);» » » » » \
178 } while (/*CONSTCOND*/0)
179
180 #define»SLIST_REMOVE_HEAD(head, field) do {» » » » \
181 » (head)->slh_first = (head)->slh_first->field.sle_next;» » \
182 } while (/*CONSTCOND*/0)
183
184 #define»SLIST_REMOVE(head, elm, type, field) do {» » » \
185 » if ((head)->slh_first == (elm)) {» » » » \
186 » » SLIST_REMOVE_HEAD((head), field);» » » \
187 » }» » » » » » » » \
188 » else {» » » » » » » » \
189 » » struct type *curelm = (head)->slh_first;» » \
190 » » while(curelm->field.sle_next != (elm))» » » \
191 » » » curelm = curelm->field.sle_next;» » \
192 » » curelm->field.sle_next =» » » » \
193 » » curelm->field.sle_next->field.sle_next;» » \
194 » }» » » » » » » » \
195 } while (/*CONSTCOND*/0)
196
197 #define»SLIST_FOREACH(var, head, field)»» » » » \
198 » for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next)
199
200 /*
201 * Singly-linked List access methods.
202 */
203 #define»SLIST_EMPTY(head)» ((head)->slh_first == NULL)
204 #define»SLIST_FIRST(head)» ((head)->slh_first)
205 #define»SLIST_NEXT(elm, field)» ((elm)->field.sle_next)
206
207
208 /*
209 * Singly-linked Tail queue declarations.
210 */
211 #define»STAILQ_HEAD(name, type)»» » » » \
212 struct name {» » » » » » » » \
213 » struct type *stqh_first;» /* first element */» » » \
214 » struct type **stqh_last;» /* addr of last next element */»» \
215 }
216
217 #define»STAILQ_HEAD_INITIALIZER(head)» » » » » \
218 » { NULL, &(head).stqh_first }
219
220 #define»STAILQ_ENTRY(type)» » » » » » \
221 struct {» » » » » » » » \
222 » struct type *stqe_next;»/* next element */» » » \
223 }
224
225 /*
226 * Singly-linked Tail queue functions.
227 */
228 #define»STAILQ_INIT(head) do {» » » » » » \
229 » (head)->stqh_first = NULL;» » » » » \
230 » (head)->stqh_last = &(head)->stqh_first;» » » » \
231 } while (/*CONSTCOND*/0)
232
233 #define»STAILQ_INSERT_HEAD(head, elm, field) do {» » » \
234 » if (((elm)->field.stqe_next = (head)->stqh_first) == NULL)» \
235 » » (head)->stqh_last = &(elm)->field.stqe_next;» » \
236 » (head)->stqh_first = (elm);» » » » » \
237 } while (/*CONSTCOND*/0)
238
239 #define»STAILQ_INSERT_TAIL(head, elm, field) do {» » » \
240 » (elm)->field.stqe_next = NULL;» » » » » \
241 » *(head)->stqh_last = (elm);» » » » » \
242 » (head)->stqh_last = &(elm)->field.stqe_next;» » » \
243 } while (/*CONSTCOND*/0)
244
245 #define»STAILQ_INSERT_AFTER(head, listelm, elm, field) do {» » \
246 » if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\
247 » » (head)->stqh_last = &(elm)->field.stqe_next;» » \
248 » (listelm)->field.stqe_next = (elm);» » » » \
249 } while (/*CONSTCOND*/0)
250
251 #define»STAILQ_REMOVE_HEAD(head, field) do {» » » » \
252 » if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \
253 » » (head)->stqh_last = &(head)->stqh_first;» » » \
254 } while (/*CONSTCOND*/0)
255
256 #define»STAILQ_REMOVE(head, elm, type, field) do {» » » \
257 » if ((head)->stqh_first == (elm)) {» » » » \
258 » » STAILQ_REMOVE_HEAD((head), field);» » » \
259 » } else {» » » » » » » \
260 » » struct type *curelm = (head)->stqh_first;» » \
261 » » while (curelm->field.stqe_next != (elm))» » » \
262 » » » curelm = curelm->field.stqe_next;» » \
263 » » if ((curelm->field.stqe_next =» » » » \
264 » » » curelm->field.stqe_next->field.stqe_next) == NULL) \
265 » » » (head)->stqh_last = &(curelm)->field.stqe_next; \
266 » }» » » » » » » » \
267 } while (/*CONSTCOND*/0)
268
269 #define»STAILQ_FOREACH(var, head, field)» » » » \
270 » for ((var) = ((head)->stqh_first);» » » » \
271 » » (var);» » » » » » » \
272 » » (var) = ((var)->field.stqe_next))
273
274 #define»STAILQ_CONCAT(head1, head2) do {» » » » \
275 » if (!STAILQ_EMPTY((head2))) {» » » » » \
276 » » *(head1)->stqh_last = (head2)->stqh_first;» » \
277 » » (head1)->stqh_last = (head2)->stqh_last;» » \
278 » » STAILQ_INIT((head2));» » » » » \
279 » }» » » » » » » » \
280 } while (/*CONSTCOND*/0)
281
282 /*
283 * Singly-linked Tail queue access methods.
284 */
285 #define»STAILQ_EMPTY(head)» ((head)->stqh_first == NULL)
286 #define»STAILQ_FIRST(head)» ((head)->stqh_first)
287 #define»STAILQ_NEXT(elm, field)»((elm)->field.stqe_next)
288
210 289
211 /* 290 /*
212 * Simple queue definitions. 291 * Simple queue definitions.
213 */ 292 */
214 #define SIMPLEQ_HEAD(name, type)» » » » » \ 293 #define»SIMPLEQ_HEAD(name, type)» » » » » \
215 struct name { \ 294 struct name { \
216 struct type *sqh_first; /* first element */ \ 295 struct type *sqh_first; /* first element */ \
217 struct type **sqh_last; /* addr of last next element */ \ 296 struct type **sqh_last; /* addr of last next element */ \
218 } 297 }
219 298
220 #define SIMPLEQ_HEAD_INITIALIZER(head)» » » » » \ 299 #define»SIMPLEQ_HEAD_INITIALIZER(head)» » » » » \
221 { NULL, &(head).sqh_first } 300 { NULL, &(head).sqh_first }
222 301
223 #define SIMPLEQ_ENTRY(type)» » » » » » \ 302 #define»SIMPLEQ_ENTRY(type)» » » » » » \
224 struct { \ 303 struct { \
225 struct type *sqe_next; /* next element */ \ 304 struct type *sqe_next; /* next element */ \
226 } 305 }
227 306
228 /* 307 /*
229 * Simple queue access methods.
230 */
231 #define SIMPLEQ_FIRST(head) ((head)->sqh_first)
232 #define SIMPLEQ_END(head) NULL
233 #define SIMPLEQ_EMPTY(head) (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head))
234 #define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)
235
236 #define SIMPLEQ_FOREACH(var, head, field) \
237 for((var) = SIMPLEQ_FIRST(head); \
238 (var) != SIMPLEQ_END(head); \
239 (var) = SIMPLEQ_NEXT(var, field))
240
241 /*
242 * Simple queue functions. 308 * Simple queue functions.
243 */ 309 */
244 #define SIMPLEQ_INIT(head) do { \ 310 #define SIMPLEQ_INIT(head) do { \
245 (head)->sqh_first = NULL; \ 311 (head)->sqh_first = NULL; \
246 (head)->sqh_last = &(head)->sqh_first; \ 312 (head)->sqh_last = &(head)->sqh_first; \
247 } while (0) 313 } while (/*CONSTCOND*/0)
248 314
249 #define SIMPLEQ_INSERT_HEAD(head, elm, field) do {» » » \ 315 #define»SIMPLEQ_INSERT_HEAD(head, elm, field) do {» » » \
250 if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ 316 if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \
251 (head)->sqh_last = &(elm)->field.sqe_next; \ 317 (head)->sqh_last = &(elm)->field.sqe_next; \
252 (head)->sqh_first = (elm); \ 318 (head)->sqh_first = (elm); \
253 } while (0) 319 } while (/*CONSTCOND*/0)
254 320
255 #define SIMPLEQ_INSERT_TAIL(head, elm, field) do {» » » \ 321 #define»SIMPLEQ_INSERT_TAIL(head, elm, field) do {» » » \
256 (elm)->field.sqe_next = NULL; \ 322 (elm)->field.sqe_next = NULL; \
257 *(head)->sqh_last = (elm); \ 323 *(head)->sqh_last = (elm); \
258 (head)->sqh_last = &(elm)->field.sqe_next; \ 324 (head)->sqh_last = &(elm)->field.sqe_next; \
259 } while (0) 325 } while (/*CONSTCOND*/0)
260 326
261 #define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {» » \ 327 #define»SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {» » \
262 if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ 328 if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
263 (head)->sqh_last = &(elm)->field.sqe_next; \ 329 (head)->sqh_last = &(elm)->field.sqe_next; \
264 (listelm)->field.sqe_next = (elm); \ 330 (listelm)->field.sqe_next = (elm); \
265 } while (0) 331 } while (/*CONSTCOND*/0)
266 332
267 #define SIMPLEQ_REMOVE_HEAD(head, elm, field) do {» » » \ 333 #define»SIMPLEQ_REMOVE_HEAD(head, field) do {» » » » \
268 » if (((head)->sqh_first = (elm)->field.sqe_next) == NULL)» \ 334 » if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
269 (head)->sqh_last = &(head)->sqh_first; \ 335 (head)->sqh_last = &(head)->sqh_first; \
270 } while (0) 336 } while (/*CONSTCOND*/0)
337
338 #define»SIMPLEQ_REMOVE(head, elm, type, field) do {» » » \
339 » if ((head)->sqh_first == (elm)) {» » » » \
340 » » SIMPLEQ_REMOVE_HEAD((head), field);» » » \
341 » } else {» » » » » » » \
342 » » struct type *curelm = (head)->sqh_first;» » \
343 » » while (curelm->field.sqe_next != (elm))»» » \
344 » » » curelm = curelm->field.sqe_next;» » \
345 » » if ((curelm->field.sqe_next =» » » » \
346 » » » curelm->field.sqe_next->field.sqe_next) == NULL) \
347 » » » (head)->sqh_last = &(curelm)->field.sqe_next; \
348 » }» » » » » » » » \
349 } while (/*CONSTCOND*/0)
350
351 #define»SIMPLEQ_FOREACH(var, head, field)» » » » \
352 » for ((var) = ((head)->sqh_first);» » » » \
353 » » (var);» » » » » » » \
354 » » (var) = ((var)->field.sqe_next))
355
356 /*
357 * Simple queue access methods.
358 */
359 #define»SIMPLEQ_EMPTY(head)» » ((head)->sqh_first == NULL)
360 #define»SIMPLEQ_FIRST(head)» » ((head)->sqh_first)
361 #define»SIMPLEQ_NEXT(elm, field)» ((elm)->field.sqe_next)
362
271 363
272 /* 364 /*
273 * Tail queue definitions. 365 * Tail queue definitions.
274 */ 366 */
275 #define TAILQ_HEAD(name, type)» » » » » » \ 367 #define»_TAILQ_HEAD(name, type, qual)» » » » » \
276 struct name {» » » » » » » » \ 368 struct name {» » » » » » » » \
277 » struct type *tqh_first;»/* first element */» » » \ 369 » qual type *tqh_first;» » /* first element */» » \
278 » struct type **tqh_last;»/* addr of last next element */»» \ 370 » qual type *qual *tqh_last;» /* addr of last next element */»\
279 } 371 }
280 372 #define TAILQ_HEAD(name, type)» _TAILQ_HEAD(name, struct type,)
281 #define TAILQ_HEAD_INITIALIZER(head)» » » » » \ 373
374 #define»TAILQ_HEAD_INITIALIZER(head)» » » » » \
282 { NULL, &(head).tqh_first } 375 { NULL, &(head).tqh_first }
283 376
284 #define TAILQ_ENTRY(type)» » » » » » \ 377 #define»_TAILQ_ENTRY(type, qual)» » » » » \
285 struct {» » » » » » » » \ 378 struct {» » » » » » » » \
286 » struct type *tqe_next;» /* next element */» » » \ 379 » qual type *tqe_next;» » /* next element */» » \
287 » struct type **tqe_prev;»/* address of previous next element */» \ 380 » qual type *qual *tqe_prev;» /* address of previous next element */\
288 } 381 }
289 382 #define TAILQ_ENTRY(type)» _TAILQ_ENTRY(struct type,)
290 /*
291 * tail queue access methods
292 */
293 #define»TAILQ_FIRST(head)» » ((head)->tqh_first)
294 #define»TAILQ_END(head)»» » NULL
295 #define»TAILQ_NEXT(elm, field)» » ((elm)->field.tqe_next)
296 #define TAILQ_LAST(head, headname)» » » » » \
297 » (*(((struct headname *)((head)->tqh_last))->tqh_last))
298 /* XXX */
299 #define TAILQ_PREV(elm, headname, field)» » » » \
300 » (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
301 #define»TAILQ_EMPTY(head)» » » » » » \
302 » (TAILQ_FIRST(head) == TAILQ_END(head))
303
304 #define TAILQ_FOREACH(var, head, field)»» » » » \
305 » for((var) = TAILQ_FIRST(head);» » » » » \
306 » (var) != TAILQ_END(head);» » » » » \
307 » (var) = TAILQ_NEXT(var, field))
308
309 #define TAILQ_FOREACH_REVERSE(var, head, field, headname)» » \
310 » for((var) = TAILQ_LAST(head, headname);»» » » \
311 » (var) != TAILQ_END(head);» » » » » \
312 » (var) = TAILQ_PREV(var, headname, field))
313 383
314 /* 384 /*
315 * Tail queue functions. 385 * Tail queue functions.
316 */ 386 */
317 #define TAILQ_INIT(head) do { \ 387 #define TAILQ_INIT(head) do { \
318 (head)->tqh_first = NULL; \ 388 (head)->tqh_first = NULL; \
319 (head)->tqh_last = &(head)->tqh_first; \ 389 (head)->tqh_last = &(head)->tqh_first; \
320 } while (0) 390 } while (/*CONSTCOND*/0)
321 391
322 #define TAILQ_INSERT_HEAD(head, elm, field) do {» » » \ 392 #define»TAILQ_INSERT_HEAD(head, elm, field) do {» » » \
323 if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ 393 if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
324 (head)->tqh_first->field.tqe_prev = \ 394 (head)->tqh_first->field.tqe_prev = \
325 &(elm)->field.tqe_next; \ 395 &(elm)->field.tqe_next; \
326 else \ 396 else \
327 (head)->tqh_last = &(elm)->field.tqe_next; \ 397 (head)->tqh_last = &(elm)->field.tqe_next; \
328 (head)->tqh_first = (elm); \ 398 (head)->tqh_first = (elm); \
329 (elm)->field.tqe_prev = &(head)->tqh_first; \ 399 (elm)->field.tqe_prev = &(head)->tqh_first; \
330 } while (0) 400 } while (/*CONSTCOND*/0)
331 401
332 #define TAILQ_INSERT_TAIL(head, elm, field) do {» » » \ 402 #define»TAILQ_INSERT_TAIL(head, elm, field) do {» » » \
333 (elm)->field.tqe_next = NULL; \ 403 (elm)->field.tqe_next = NULL; \
334 (elm)->field.tqe_prev = (head)->tqh_last; \ 404 (elm)->field.tqe_prev = (head)->tqh_last; \
335 *(head)->tqh_last = (elm); \ 405 *(head)->tqh_last = (elm); \
336 (head)->tqh_last = &(elm)->field.tqe_next; \ 406 (head)->tqh_last = &(elm)->field.tqe_next; \
337 } while (0) 407 } while (/*CONSTCOND*/0)
338 408
339 #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {» » \ 409 #define»TAILQ_INSERT_AFTER(head, listelm, elm, field) do {» » \
340 if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ 410 if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
341 » » (elm)->field.tqe_next->field.tqe_prev =»» » \ 411 » » (elm)->field.tqe_next->field.tqe_prev = » » \
342 &(elm)->field.tqe_next; \ 412 &(elm)->field.tqe_next; \
343 else \ 413 else \
344 (head)->tqh_last = &(elm)->field.tqe_next; \ 414 (head)->tqh_last = &(elm)->field.tqe_next; \
345 (listelm)->field.tqe_next = (elm); \ 415 (listelm)->field.tqe_next = (elm); \
346 (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ 416 (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
347 } while (0) 417 } while (/*CONSTCOND*/0)
348 418
349 #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ 419 #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \
350 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ 420 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
351 (elm)->field.tqe_next = (listelm); \ 421 (elm)->field.tqe_next = (listelm); \
352 *(listelm)->field.tqe_prev = (elm); \ 422 *(listelm)->field.tqe_prev = (elm); \
353 (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ 423 (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \
354 } while (0) 424 } while (/*CONSTCOND*/0)
355 425
356 #define TAILQ_REMOVE(head, elm, field) do {» » » » \ 426 #define»TAILQ_REMOVE(head, elm, field) do {» » » » \
357 if (((elm)->field.tqe_next) != NULL) \ 427 if (((elm)->field.tqe_next) != NULL) \
358 » » (elm)->field.tqe_next->field.tqe_prev =»» » \ 428 » » (elm)->field.tqe_next->field.tqe_prev = » » \
359 (elm)->field.tqe_prev; \ 429 (elm)->field.tqe_prev; \
360 else \ 430 else \
361 (head)->tqh_last = (elm)->field.tqe_prev; \ 431 (head)->tqh_last = (elm)->field.tqe_prev; \
362 *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ 432 *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
363 } while (0) 433 } while (/*CONSTCOND*/0)
364 434
365 #define TAILQ_REPLACE(head, elm, elm2, field) do {» » » \ 435 #define»TAILQ_FOREACH(var, head, field)»» » » » \
366 » if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL)» \ 436 » for ((var) = ((head)->tqh_first);» » » » \
367 » » (elm2)->field.tqe_next->field.tqe_prev =» » \ 437 » » (var);» » » » » » » \
368 » » &(elm2)->field.tqe_next;» » » » \ 438 » » (var) = ((var)->field.tqe_next))
369 » else» » » » » » » » \ 439
370 » » (head)->tqh_last = &(elm2)->field.tqe_next;» » \ 440 #define»TAILQ_FOREACH_REVERSE(var, head, headname, field)» » \
371 » (elm2)->field.tqe_prev = (elm)->field.tqe_prev;»» » \ 441 » for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));» \
372 » *(elm2)->field.tqe_prev = (elm2);» » » » \ 442 » » (var);» » » » » » » \
373 } while (0) 443 » » (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_las t)))
444
445 #define»TAILQ_CONCAT(head1, head2, field) do {» » » » \
446 » if (!TAILQ_EMPTY(head2)) {» » » » » \
447 » » *(head1)->tqh_last = (head2)->tqh_first;» » \
448 » » (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last;»\
449 » » (head1)->tqh_last = (head2)->tqh_last;» » » \
450 » » TAILQ_INIT((head2));» » » » » \
451 » }» » » » » » » » \
452 } while (/*CONSTCOND*/0)
453
454 /*
455 * Tail queue access methods.
456 */
457 #define»TAILQ_EMPTY(head)» » ((head)->tqh_first == NULL)
458 #define»TAILQ_FIRST(head)» » ((head)->tqh_first)
459 #define»TAILQ_NEXT(elm, field)» » ((elm)->field.tqe_next)
460
461 #define»TAILQ_LAST(head, headname) \
462 » (*(((struct headname *)((head)->tqh_last))->tqh_last))
463 #define»TAILQ_PREV(elm, headname, field) \
464 » (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
465
374 466
375 /* 467 /*
376 * Circular queue definitions. 468 * Circular queue definitions.
377 */ 469 */
378 #define CIRCLEQ_HEAD(name, type)» » » » » \ 470 #define»CIRCLEQ_HEAD(name, type)» » » » » \
379 struct name { \ 471 struct name { \
380 struct type *cqh_first; /* first element */ \ 472 struct type *cqh_first; /* first element */ \
381 struct type *cqh_last; /* last element */ \ 473 struct type *cqh_last; /* last element */ \
382 } 474 }
383 475
384 #define CIRCLEQ_HEAD_INITIALIZER(head)» » » » » \ 476 #define»CIRCLEQ_HEAD_INITIALIZER(head)» » » » » \
385 » { CIRCLEQ_END(&head), CIRCLEQ_END(&head) } 477 » { (void *)&head, (void *)&head }
386 478
387 #define CIRCLEQ_ENTRY(type)» » » » » » \ 479 #define»CIRCLEQ_ENTRY(type)» » » » » » \
388 struct { \ 480 struct { \
389 struct type *cqe_next; /* next element */ \ 481 struct type *cqe_next; /* next element */ \
390 struct type *cqe_prev; /* previous element */ \ 482 struct type *cqe_prev; /* previous element */ \
391 } 483 }
392 484
393 /* 485 /*
394 * Circular queue access methods
395 */
396 #define CIRCLEQ_FIRST(head) ((head)->cqh_first)
397 #define CIRCLEQ_LAST(head) ((head)->cqh_last)
398 #define CIRCLEQ_END(head) ((void *)(head))
399 #define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
400 #define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
401 #define CIRCLEQ_EMPTY(head) \
402 (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
403
404 #define CIRCLEQ_FOREACH(var, head, field) \
405 for((var) = CIRCLEQ_FIRST(head); \
406 (var) != CIRCLEQ_END(head); \
407 (var) = CIRCLEQ_NEXT(var, field))
408
409 #define CIRCLEQ_FOREACH_REVERSE(var, head, field) \
410 for((var) = CIRCLEQ_LAST(head); \
411 (var) != CIRCLEQ_END(head); \
412 (var) = CIRCLEQ_PREV(var, field))
413
414 /*
415 * Circular queue functions. 486 * Circular queue functions.
416 */ 487 */
417 #define CIRCLEQ_INIT(head) do { \ 488 #define CIRCLEQ_INIT(head) do { \
418 » (head)->cqh_first = CIRCLEQ_END(head);» » » » \ 489 » (head)->cqh_first = (void *)(head);» » » » \
419 » (head)->cqh_last = CIRCLEQ_END(head);» » » » \ 490 » (head)->cqh_last = (void *)(head);» » » » \
420 } while (0) 491 } while (/*CONSTCOND*/0)
421 492
422 #define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {» » \ 493 #define»CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {» » \
423 (elm)->field.cqe_next = (listelm)->field.cqe_next; \ 494 (elm)->field.cqe_next = (listelm)->field.cqe_next; \
424 (elm)->field.cqe_prev = (listelm); \ 495 (elm)->field.cqe_prev = (listelm); \
425 » if ((listelm)->field.cqe_next == CIRCLEQ_END(head))» » \ 496 » if ((listelm)->field.cqe_next == (void *)(head))» » \
426 (head)->cqh_last = (elm); \ 497 (head)->cqh_last = (elm); \
427 else \ 498 else \
428 (listelm)->field.cqe_next->field.cqe_prev = (elm); \ 499 (listelm)->field.cqe_next->field.cqe_prev = (elm); \
429 (listelm)->field.cqe_next = (elm); \ 500 (listelm)->field.cqe_next = (elm); \
430 } while (0) 501 } while (/*CONSTCOND*/0)
431 502
432 #define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {» » \ 503 #define»CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {» » \
433 (elm)->field.cqe_next = (listelm); \ 504 (elm)->field.cqe_next = (listelm); \
434 (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ 505 (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \
435 » if ((listelm)->field.cqe_prev == CIRCLEQ_END(head))» » \ 506 » if ((listelm)->field.cqe_prev == (void *)(head))» » \
436 (head)->cqh_first = (elm); \ 507 (head)->cqh_first = (elm); \
437 else \ 508 else \
438 (listelm)->field.cqe_prev->field.cqe_next = (elm); \ 509 (listelm)->field.cqe_prev->field.cqe_next = (elm); \
439 (listelm)->field.cqe_prev = (elm); \ 510 (listelm)->field.cqe_prev = (elm); \
440 } while (0) 511 } while (/*CONSTCOND*/0)
441 512
442 #define CIRCLEQ_INSERT_HEAD(head, elm, field) do {» » » \ 513 #define»CIRCLEQ_INSERT_HEAD(head, elm, field) do {» » » \
443 (elm)->field.cqe_next = (head)->cqh_first; \ 514 (elm)->field.cqe_next = (head)->cqh_first; \
444 » (elm)->field.cqe_prev = CIRCLEQ_END(head);» » » \ 515 » (elm)->field.cqe_prev = (void *)(head);»» » » \
445 » if ((head)->cqh_last == CIRCLEQ_END(head))» » » \ 516 » if ((head)->cqh_last == (void *)(head))»» » » \
446 (head)->cqh_last = (elm); \ 517 (head)->cqh_last = (elm); \
447 else \ 518 else \
448 (head)->cqh_first->field.cqe_prev = (elm); \ 519 (head)->cqh_first->field.cqe_prev = (elm); \
449 (head)->cqh_first = (elm); \ 520 (head)->cqh_first = (elm); \
450 } while (0) 521 } while (/*CONSTCOND*/0)
451 522
452 #define CIRCLEQ_INSERT_TAIL(head, elm, field) do {» » » \ 523 #define»CIRCLEQ_INSERT_TAIL(head, elm, field) do {» » » \
453 » (elm)->field.cqe_next = CIRCLEQ_END(head);» » » \ 524 » (elm)->field.cqe_next = (void *)(head);»» » » \
454 (elm)->field.cqe_prev = (head)->cqh_last; \ 525 (elm)->field.cqe_prev = (head)->cqh_last; \
455 » if ((head)->cqh_first == CIRCLEQ_END(head))» » » \ 526 » if ((head)->cqh_first == (void *)(head))» » » \
456 (head)->cqh_first = (elm); \ 527 (head)->cqh_first = (elm); \
457 else \ 528 else \
458 (head)->cqh_last->field.cqe_next = (elm); \ 529 (head)->cqh_last->field.cqe_next = (elm); \
459 (head)->cqh_last = (elm); \ 530 (head)->cqh_last = (elm); \
460 } while (0) 531 } while (/*CONSTCOND*/0)
461 532
462 #define CIRCLEQ_REMOVE(head, elm, field) do { \ 533 #define CIRCLEQ_REMOVE(head, elm, field) do { \
463 » if ((elm)->field.cqe_next == CIRCLEQ_END(head))»» » \ 534 » if ((elm)->field.cqe_next == (void *)(head))» » » \
464 (head)->cqh_last = (elm)->field.cqe_prev; \ 535 (head)->cqh_last = (elm)->field.cqe_prev; \
465 else \ 536 else \
466 (elm)->field.cqe_next->field.cqe_prev = \ 537 (elm)->field.cqe_next->field.cqe_prev = \
467 (elm)->field.cqe_prev; \ 538 (elm)->field.cqe_prev; \
468 » if ((elm)->field.cqe_prev == CIRCLEQ_END(head))»» » \ 539 » if ((elm)->field.cqe_prev == (void *)(head))» » » \
469 (head)->cqh_first = (elm)->field.cqe_next; \ 540 (head)->cqh_first = (elm)->field.cqe_next; \
470 else \ 541 else \
471 (elm)->field.cqe_prev->field.cqe_next = \ 542 (elm)->field.cqe_prev->field.cqe_next = \
472 (elm)->field.cqe_next; \ 543 (elm)->field.cqe_next; \
473 } while (0) 544 } while (/*CONSTCOND*/0)
474 545
475 #define CIRCLEQ_REPLACE(head, elm, elm2, field) do {» » » \ 546 #define»CIRCLEQ_FOREACH(var, head, field)» » » » \
476 » if (((elm2)->field.cqe_next = (elm)->field.cqe_next) ==»» \ 547 » for ((var) = ((head)->cqh_first);» » » » \
477 » CIRCLEQ_END(head))» » » » » » \ 548 » » (var) != (const void *)(head);» » » » \
478 » » (head).cqh_last = (elm2);» » » » \ 549 » » (var) = ((var)->field.cqe_next))
479 » else» » » » » » » » \
480 » » (elm2)->field.cqe_next->field.cqe_prev = (elm2);» \
481 » if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) ==»» \
482 » CIRCLEQ_END(head))» » » » » » \
483 » » (head).cqh_first = (elm2);» » » » \
484 » else» » » » » » » » \
485 » » (elm2)->field.cqe_prev->field.cqe_next = (elm2);» \
486 } while (0)
487 550
488 #endif» /* !_SYS_QUEUE_H_ */ 551 #define»CIRCLEQ_FOREACH_REVERSE(var, head, field)» » » \
552 » for ((var) = ((head)->cqh_last);» » » » \
553 » » (var) != (const void *)(head);» » » » \
554 » » (var) = ((var)->field.cqe_prev))
555
556 /*
557 * Circular queue access methods.
558 */
559 #define»CIRCLEQ_EMPTY(head)» » ((head)->cqh_first == (void *)(head))
560 #define»CIRCLEQ_FIRST(head)» » ((head)->cqh_first)
561 #define»CIRCLEQ_LAST(head)» » ((head)->cqh_last)
562 #define»CIRCLEQ_NEXT(elm, field)» ((elm)->field.cqe_next)
563 #define»CIRCLEQ_PREV(elm, field)» ((elm)->field.cqe_prev)
564
565 #define CIRCLEQ_LOOP_NEXT(head, elm, field)» » » » \
566 » (((elm)->field.cqe_next == (void *)(head))» » » \
567 » ? ((head)->cqh_first)» » » » » \
568 » : (elm->field.cqe_next))
569 #define CIRCLEQ_LOOP_PREV(head, elm, field)» » » » \
570 » (((elm)->field.cqe_prev == (void *)(head))» » » \
571 » ? ((head)->cqh_last)» » » » » \
572 » : (elm->field.cqe_prev))
573
574 #endif» /* sys/queue.h */
OLDNEW
« no previous file with comments | « shell/BUILD.gn ('k') | third_party/libteken/teken/teken.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698