1f62c4786SHajimu UMEMOTO /* 2f62c4786SHajimu UMEMOTO * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 3f62c4786SHajimu UMEMOTO * Copyright (c) 1997,1999 by Internet Software Consortium. 4f62c4786SHajimu UMEMOTO * 5f62c4786SHajimu UMEMOTO * Permission to use, copy, modify, and distribute this software for any 6f62c4786SHajimu UMEMOTO * purpose with or without fee is hereby granted, provided that the above 7f62c4786SHajimu UMEMOTO * copyright notice and this permission notice appear in all copies. 8f62c4786SHajimu UMEMOTO * 9f62c4786SHajimu UMEMOTO * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 10f62c4786SHajimu UMEMOTO * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11f62c4786SHajimu UMEMOTO * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 12f62c4786SHajimu UMEMOTO * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13f62c4786SHajimu UMEMOTO * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14f62c4786SHajimu UMEMOTO * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 15f62c4786SHajimu UMEMOTO * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16f62c4786SHajimu UMEMOTO */ 17f62c4786SHajimu UMEMOTO 18d808369aSHajimu UMEMOTO /* $FreeBSD$ */ 19d808369aSHajimu UMEMOTO 20f62c4786SHajimu UMEMOTO #ifndef LIST_H 21f62c4786SHajimu UMEMOTO #define LIST_H 1 22d808369aSHajimu UMEMOTO #ifdef _LIBC 23d808369aSHajimu UMEMOTO #include <assert.h> 24d808369aSHajimu UMEMOTO #define INSIST(cond) assert(cond) 25d808369aSHajimu UMEMOTO #else 26f62c4786SHajimu UMEMOTO #include <isc/assertions.h> 27d808369aSHajimu UMEMOTO #endif 28f62c4786SHajimu UMEMOTO 29f62c4786SHajimu UMEMOTO #define LIST(type) struct { type *head, *tail; } 30f62c4786SHajimu UMEMOTO #define INIT_LIST(list) \ 31f62c4786SHajimu UMEMOTO do { (list).head = NULL; (list).tail = NULL; } while (0) 32f62c4786SHajimu UMEMOTO 33f62c4786SHajimu UMEMOTO #define LINK(type) struct { type *prev, *next; } 34f62c4786SHajimu UMEMOTO #define INIT_LINK_TYPE(elt, link, type) \ 35f62c4786SHajimu UMEMOTO do { \ 36f62c4786SHajimu UMEMOTO (elt)->link.prev = (type *)(-1); \ 37f62c4786SHajimu UMEMOTO (elt)->link.next = (type *)(-1); \ 38f62c4786SHajimu UMEMOTO } while (0) 39f62c4786SHajimu UMEMOTO #define INIT_LINK(elt, link) \ 40f62c4786SHajimu UMEMOTO INIT_LINK_TYPE(elt, link, void) 41f62c4786SHajimu UMEMOTO #define LINKED(elt, link) ((void *)((elt)->link.prev) != (void *)(-1)) 42f62c4786SHajimu UMEMOTO 43f62c4786SHajimu UMEMOTO #define HEAD(list) ((list).head) 44f62c4786SHajimu UMEMOTO #define TAIL(list) ((list).tail) 45f62c4786SHajimu UMEMOTO #define EMPTY(list) ((list).head == NULL) 46f62c4786SHajimu UMEMOTO 47f62c4786SHajimu UMEMOTO #define PREPEND(list, elt, link) \ 48f62c4786SHajimu UMEMOTO do { \ 49f62c4786SHajimu UMEMOTO INSIST(!LINKED(elt, link));\ 50f62c4786SHajimu UMEMOTO if ((list).head != NULL) \ 51f62c4786SHajimu UMEMOTO (list).head->link.prev = (elt); \ 52f62c4786SHajimu UMEMOTO else \ 53f62c4786SHajimu UMEMOTO (list).tail = (elt); \ 54f62c4786SHajimu UMEMOTO (elt)->link.prev = NULL; \ 55f62c4786SHajimu UMEMOTO (elt)->link.next = (list).head; \ 56f62c4786SHajimu UMEMOTO (list).head = (elt); \ 57f62c4786SHajimu UMEMOTO } while (0) 58f62c4786SHajimu UMEMOTO 59f62c4786SHajimu UMEMOTO #define APPEND(list, elt, link) \ 60f62c4786SHajimu UMEMOTO do { \ 61f62c4786SHajimu UMEMOTO INSIST(!LINKED(elt, link));\ 62f62c4786SHajimu UMEMOTO if ((list).tail != NULL) \ 63f62c4786SHajimu UMEMOTO (list).tail->link.next = (elt); \ 64f62c4786SHajimu UMEMOTO else \ 65f62c4786SHajimu UMEMOTO (list).head = (elt); \ 66f62c4786SHajimu UMEMOTO (elt)->link.prev = (list).tail; \ 67f62c4786SHajimu UMEMOTO (elt)->link.next = NULL; \ 68f62c4786SHajimu UMEMOTO (list).tail = (elt); \ 69f62c4786SHajimu UMEMOTO } while (0) 70f62c4786SHajimu UMEMOTO 71f62c4786SHajimu UMEMOTO #define UNLINK_TYPE(list, elt, link, type) \ 72f62c4786SHajimu UMEMOTO do { \ 73f62c4786SHajimu UMEMOTO INSIST(LINKED(elt, link));\ 74f62c4786SHajimu UMEMOTO if ((elt)->link.next != NULL) \ 75f62c4786SHajimu UMEMOTO (elt)->link.next->link.prev = (elt)->link.prev; \ 76a38329b5SHajimu UMEMOTO else { \ 77a38329b5SHajimu UMEMOTO INSIST((list).tail == (elt)); \ 78f62c4786SHajimu UMEMOTO (list).tail = (elt)->link.prev; \ 79a38329b5SHajimu UMEMOTO } \ 80f62c4786SHajimu UMEMOTO if ((elt)->link.prev != NULL) \ 81f62c4786SHajimu UMEMOTO (elt)->link.prev->link.next = (elt)->link.next; \ 82a38329b5SHajimu UMEMOTO else { \ 83a38329b5SHajimu UMEMOTO INSIST((list).head == (elt)); \ 84f62c4786SHajimu UMEMOTO (list).head = (elt)->link.next; \ 85a38329b5SHajimu UMEMOTO } \ 86f62c4786SHajimu UMEMOTO INIT_LINK_TYPE(elt, link, type); \ 87f62c4786SHajimu UMEMOTO } while (0) 88f62c4786SHajimu UMEMOTO #define UNLINK(list, elt, link) \ 89f62c4786SHajimu UMEMOTO UNLINK_TYPE(list, elt, link, void) 90f62c4786SHajimu UMEMOTO 91f62c4786SHajimu UMEMOTO #define PREV(elt, link) ((elt)->link.prev) 92f62c4786SHajimu UMEMOTO #define NEXT(elt, link) ((elt)->link.next) 93f62c4786SHajimu UMEMOTO 94f62c4786SHajimu UMEMOTO #define INSERT_BEFORE(list, before, elt, link) \ 95f62c4786SHajimu UMEMOTO do { \ 96f62c4786SHajimu UMEMOTO INSIST(!LINKED(elt, link));\ 97f62c4786SHajimu UMEMOTO if ((before)->link.prev == NULL) \ 98f62c4786SHajimu UMEMOTO PREPEND(list, elt, link); \ 99f62c4786SHajimu UMEMOTO else { \ 100f62c4786SHajimu UMEMOTO (elt)->link.prev = (before)->link.prev; \ 101f62c4786SHajimu UMEMOTO (before)->link.prev = (elt); \ 102f62c4786SHajimu UMEMOTO (elt)->link.prev->link.next = (elt); \ 103f62c4786SHajimu UMEMOTO (elt)->link.next = (before); \ 104f62c4786SHajimu UMEMOTO } \ 105f62c4786SHajimu UMEMOTO } while (0) 106f62c4786SHajimu UMEMOTO 107f62c4786SHajimu UMEMOTO #define INSERT_AFTER(list, after, elt, link) \ 108f62c4786SHajimu UMEMOTO do { \ 109f62c4786SHajimu UMEMOTO INSIST(!LINKED(elt, link));\ 110f62c4786SHajimu UMEMOTO if ((after)->link.next == NULL) \ 111f62c4786SHajimu UMEMOTO APPEND(list, elt, link); \ 112f62c4786SHajimu UMEMOTO else { \ 113f62c4786SHajimu UMEMOTO (elt)->link.next = (after)->link.next; \ 114f62c4786SHajimu UMEMOTO (after)->link.next = (elt); \ 115f62c4786SHajimu UMEMOTO (elt)->link.next->link.prev = (elt); \ 116f62c4786SHajimu UMEMOTO (elt)->link.prev = (after); \ 117f62c4786SHajimu UMEMOTO } \ 118f62c4786SHajimu UMEMOTO } while (0) 119f62c4786SHajimu UMEMOTO 120f62c4786SHajimu UMEMOTO #define ENQUEUE(list, elt, link) APPEND(list, elt, link) 121f62c4786SHajimu UMEMOTO #define DEQUEUE(list, elt, link) UNLINK(list, elt, link) 122f62c4786SHajimu UMEMOTO 123f62c4786SHajimu UMEMOTO #endif /* LIST_H */ 124a38329b5SHajimu UMEMOTO /*! \file */ 125