2 * Singly linked tail queue support.
4 #ifndef ASN1_PARSER_LIST_H
5 #define ASN1_PARSER_LIST_H
7 #define TQ_HEAD(type) \
13 #define TQ_MOVE(to, from) do { \
14 if(&(TQ_FIRST(from)) == (from)->tq_tail) { \
17 (to)->tq_head = (from)->tq_head; \
18 (to)->tq_tail = (from)->tq_tail; \
23 #define TQ_ENTRY(type) \
28 #define TQ_FIRST(headp) ((headp)->tq_head)
29 #define TQ_NEXT(el, field) ((el)->field.tq_next)
31 #define TQ_INIT(head) do { \
32 TQ_FIRST((head)) = 0; \
33 (head)->tq_tail = &TQ_FIRST((head)); \
36 #define TQ_FOR(var, head, field) \
37 for((var) = TQ_FIRST((head)); \
38 (var); (var) = TQ_NEXT((var), field))
40 /* MSVC does not have typeof(), cannot prevent side effects! */
41 #define TQ_ADD(head, xel, field) do { \
42 typeof(xel) __el = (xel); \
43 assert(TQ_NEXT((__el), field) == 0); \
44 *(head)->tq_tail = (__el); \
45 (head)->tq_tail = &TQ_NEXT((__el), field); \
48 #define TQ_CONCAT(head1, head2, field) do { \
49 if(TQ_FIRST(head2)) { \
50 *(head1)->tq_tail = (head2)->tq_head; \
51 (head1)->tq_tail = (head2)->tq_tail; \
57 * Remove the first element and return it.
59 #define TQ_REMOVE(head, field) ({ \
60 typeof(TQ_FIRST((head))) __fel; \
61 __fel = TQ_FIRST((head)); \
63 || (TQ_FIRST((head)) = TQ_NEXT(__fel, field)) \
65 (head)->tq_tail = &TQ_FIRST((head)); \
67 TQ_NEXT(__fel, field) = 0; \
72 #endif /* ASN1_PARSER_LIST_H */