vlm | fa67ddc | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 1 | /* |
| 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 */ |