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