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>