Annotation of embedaddon/dhcp/includes/isc-dhcp/list.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (c) 2004,2009 by Internet Systems Consortium, Inc. ("ISC")
3: * Copyright (c) 1997-2003 by Internet Software Consortium
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
15: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: *
17: * Internet Systems Consortium, Inc.
18: * 950 Charter Street
19: * Redwood City, CA 94063
20: * <info@isc.org>
21: * https://www.isc.org/
22: */
23:
24: #ifndef ISC_LIST_H
25: #define ISC_LIST_H 1
26:
27: #define ISC_LIST(type) struct { type *head, *tail; }
28: #define ISC_LIST_INIT(list) \
29: do { (list).head = NULL; (list).tail = NULL; } while (0)
30:
31: #define ISC_LINK(type) struct { type *prev, *next; }
32: #define ISC_LINK_INIT(elt, link) \
33: do { \
34: (elt)->link.prev = (void *)(-1); \
35: (elt)->link.next = (void *)(-1); \
36: } while (0)
37: #define ISC_LINK_LINKED(elt, link) ((elt)->link.prev != (void *)(-1))
38:
39: #define ISC_LIST_HEAD(list) ((list).head)
40: #define ISC_LIST_TAIL(list) ((list).tail)
41: #define ISC_LIST_EMPTY(list) ((list).head == NULL)
42:
43: #define ISC_LIST_PREPEND(list, elt, link) \
44: do { \
45: if ((list).head != NULL) \
46: (list).head->link.prev = (elt); \
47: else \
48: (list).tail = (elt); \
49: (elt)->link.prev = NULL; \
50: (elt)->link.next = (list).head; \
51: (list).head = (elt); \
52: } while (0)
53:
54: #define ISC_LIST_APPEND(list, elt, link) \
55: do { \
56: if ((list).tail != NULL) \
57: (list).tail->link.next = (elt); \
58: else \
59: (list).head = (elt); \
60: (elt)->link.prev = (list).tail; \
61: (elt)->link.next = NULL; \
62: (list).tail = (elt); \
63: } while (0)
64:
65: #define ISC_LIST_UNLINK(list, elt, link) \
66: do { \
67: if ((elt)->link.next != NULL) \
68: (elt)->link.next->link.prev = (elt)->link.prev; \
69: else \
70: (list).tail = (elt)->link.prev; \
71: if ((elt)->link.prev != NULL) \
72: (elt)->link.prev->link.next = (elt)->link.next; \
73: else \
74: (list).head = (elt)->link.next; \
75: (elt)->link.prev = (void *)(-1); \
76: (elt)->link.next = (void *)(-1); \
77: } while (0)
78:
79: #define ISC_LIST_PREV(elt, link) ((elt)->link.prev)
80: #define ISC_LIST_NEXT(elt, link) ((elt)->link.next)
81:
82: #define ISC_LIST_INSERTBEFORE(list, before, elt, link) \
83: do { \
84: if ((before)->link.prev == NULL) \
85: ISC_LIST_PREPEND(list, elt, link); \
86: else { \
87: (elt)->link.prev = (before)->link.prev; \
88: (before)->link.prev = (elt); \
89: (elt)->link.prev->link.next = (elt); \
90: (elt)->link.next = (before); \
91: } \
92: } while (0)
93:
94: #define ISC_LIST_INSERTAFTER(list, after, elt, link) \
95: do { \
96: if ((after)->link.next == NULL) \
97: ISC_LIST_APPEND(list, elt, link); \
98: else { \
99: (elt)->link.next = (after)->link.next; \
100: (after)->link.next = (elt); \
101: (elt)->link.next->link.prev = (elt); \
102: (elt)->link.prev = (after); \
103: } \
104: } while (0)
105:
106: #define ISC_LIST_APPENDLIST(list1, list2, link) \
107: do { \
108: if (ISC_LIST_EMPTY(list1)) \
109: (list1) = (list2); \
110: else if (!ISC_LIST_EMPTY(list2)) { \
111: (list1).tail->link.next = (list2).head; \
112: (list2).head->link.prev = (list1).tail; \
113: (list1).tail = (list2).tail; \
114: (list2).head = NULL; \
115: (list2).tail = NULL; \
116: } \
117: } while (0)
118:
119: #define ISC_LIST_ENQUEUE(list, elt, link) ISC_LIST_APPEND(list, elt, link)
120: #define ISC_LIST_DEQUEUE(list, elt, link) ISC_LIST_UNLINK(list, elt, link)
121:
122: #endif /* ISC_LIST_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>