blob: 1f80878085f86f3146c6969979562d019c96cfee [file] [log] [blame]
Lev Walkinf15320b2004-06-03 03:38:44 +00001/*
2 * Singly linked tail queue support.
3 */
4#ifndef ASN1_PARSER_LIST_H
5#define ASN1_PARSER_LIST_H
6
7#define TQ_HEAD(type) \
8 struct { \
9 type *tq_head; \
10 type**tq_tail; \
11 }
12
13#define TQ_HEAD_COPY(to, from) \
14 do { (to)->tq_head = (from)->tq_head; \
15 (to)->tq_tail = (from)->tq_tail; } while(0)
16
17#define TQ_ENTRY(type) \
18 struct { \
19 type *tq_next; \
20 }
21
22#define TQ_FIRST(headp) ((headp)->tq_head)
23#define TQ_NEXT(el, field) ((el)->field.tq_next)
24
25#define TQ_INIT(head) do { \
26 TQ_FIRST((head)) = 0; \
27 (head)->tq_tail = &TQ_FIRST((head)); \
28 } while(0)
29
30#define TQ_FOR(var, head, field) \
31 for((var) = TQ_FIRST((head)); \
32 (var); (var) = TQ_NEXT((var), field))
33
34#define TQ_ADD(head, xel, field) do { \
35 typeof(xel) __el = xel; \
36 assert(TQ_NEXT((__el), field) == 0); \
37 *(head)->tq_tail = (__el); \
38 (head)->tq_tail = &TQ_NEXT((__el), field); \
39 } while(0)
40
41/*
42 * Remove the first element and return it.
43 */
44#define TQ_REMOVE(head, field) ({ \
45 typeof(TQ_FIRST((head))) __fel; \
46 __fel = TQ_FIRST((head)); \
47 if(__fel == 0 \
48 || (TQ_FIRST((head)) = TQ_NEXT(__fel, field)) \
49 == 0) { \
50 (head)->tq_tail = &TQ_FIRST((head)); \
51 } else { \
52 TQ_NEXT(__fel, field) = 0; \
53 } \
54 __fel; })
55
56
57#endif /* ASN1_PARSER_LIST_H */