1 /* Copyright (C) 2001, 2002, 2003 Red Hat, Inc. 2 Written by Ulrich Drepper <drepper@redhat.com>, 2001. 3 4 This program is Open Source software; you can redistribute it and/or 5 modify it under the terms of the Open Software License version 1.0 as 6 published by the Open Source Initiative. 7 8 You should have received a copy of the Open Software License along 9 with this program; if not, you may obtain a copy of the Open Software 10 License version 1.0 from http://www.opensource.org/licenses/osl.php or 11 by writing the Open Source Initiative c/o Lawrence Rosen, Esq., 12 3001 King Ranch Road, Ukiah, CA 95482. */ 13 14 #ifndef LIST_H 15 #define LIST_H 1 16 17 /* Add element to the end of a circular, double-linked list. */ 18 #define CDBL_LIST_ADD_REAR(first, newp) \ 19 do { \ 20 __typeof (newp) _newp = (newp); \ 21 assert (_newp->next == NULL); \ 22 assert (_newp->previous == NULL); \ 23 if (unlikely ((first) == NULL)) \ 24 (first) = _newp->next = _newp->previous = _newp; \ 25 else \ 26 { \ 27 _newp->next = (first); \ 28 _newp->previous = (first)->previous; \ 29 _newp->previous->next = _newp->next->previous = _newp; \ 30 } \ 31 } while (0) 32 33 /* Remove element from circular, double-linked list. */ 34 #define CDBL_LIST_DEL(first, elem) \ 35 do { \ 36 __typeof (elem) _elem = (elem); \ 37 /* Check whether the element is indeed on the list. */ \ 38 assert (first != NULL && _elem != NULL \ 39 && (first != elem \ 40 || ({ __typeof (elem) _runp = first->next; \ 41 while (_runp != first) \ 42 if (_runp == _elem) \ 43 break; \ 44 else \ 45 _runp = _runp->next; \ 46 _runp == _elem; }))); \ 47 if (unlikely (_elem->next == _elem)) \ 48 first = NULL; \ 49 else \ 50 { \ 51 _elem->next->previous = _elem->previous; \ 52 _elem->previous->next = _elem->next; \ 53 if (unlikely (first == _elem)) \ 54 first = _elem->next; \ 55 } \ 56 assert ((_elem->next = _elem->previous = NULL, 1)); \ 57 } while (0) 58 59 60 /* Add element to the front of a single-linked list. */ 61 #define SNGL_LIST_PUSH(first, newp) \ 62 do { \ 63 __typeof (newp) _newp = (newp); \ 64 assert (_newp->next == NULL); \ 65 _newp->next = first; \ 66 first = _newp; \ 67 } while (0) 68 69 70 /* Add element to the rear of a circular single-linked list. */ 71 #define CSNGL_LIST_ADD_REAR(first, newp) \ 72 do { \ 73 __typeof (newp) _newp = (newp); \ 74 assert (_newp->next == NULL); \ 75 if (unlikely ((first) == NULL)) \ 76 (first) = _newp->next = _newp; \ 77 else \ 78 { \ 79 _newp->next = (first)->next; \ 80 (first) = (first)->next = _newp; \ 81 } \ 82 } while (0) 83 84 85 #endif /* list.h */ 86