Return to list.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / dhcp / includes / isc-dhcp |
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 */