blob: c039a0bae5e6d365213b6bf344ce21add8a62fa3 [file] [log] [blame]
Ulrich Drepperb08d5a82005-07-26 05:00:05 +00001/* 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 */