]>
Commit | Line | Data |
---|---|---|
03467c88 | 1 | /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ |
60918275 | 2 | |
c2f1db8f | 3 | #pragma once |
60918275 | 4 | |
a7334b09 LP |
5 | /*** |
6 | This file is part of systemd. | |
7 | ||
8 | Copyright 2010 Lennart Poettering | |
9 | ||
10 | systemd is free software; you can redistribute it and/or modify it | |
5430f7f2 LP |
11 | under the terms of the GNU Lesser General Public License as published by |
12 | the Free Software Foundation; either version 2.1 of the License, or | |
a7334b09 LP |
13 | (at your option) any later version. |
14 | ||
15 | systemd is distributed in the hope that it will be useful, but | |
16 | WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
5430f7f2 | 18 | Lesser General Public License for more details. |
a7334b09 | 19 | |
5430f7f2 | 20 | You should have received a copy of the GNU Lesser General Public License |
a7334b09 LP |
21 | along with systemd; If not, see <http://www.gnu.org/licenses/>. |
22 | ***/ | |
23 | ||
60918275 LP |
24 | /* The head of the linked list. Use this in the structure that shall |
25 | * contain the head of the linked list */ | |
26 | #define LIST_HEAD(t,name) \ | |
034c6ed7 | 27 | t *name |
60918275 LP |
28 | |
29 | /* The pointers in the linked list's items. Use this in the item structure */ | |
034c6ed7 LP |
30 | #define LIST_FIELDS(t,name) \ |
31 | t *name##_next, *name##_prev | |
60918275 LP |
32 | |
33 | /* Initialize the list's head */ | |
034c6ed7 | 34 | #define LIST_HEAD_INIT(t,head) \ |
60918275 | 35 | do { \ |
034c6ed7 | 36 | (head) = NULL; } \ |
60918275 LP |
37 | while(false) |
38 | ||
39 | /* Initialize a list item */ | |
034c6ed7 | 40 | #define LIST_INIT(t,name,item) \ |
60918275 LP |
41 | do { \ |
42 | t *_item = (item); \ | |
43 | assert(_item); \ | |
034c6ed7 | 44 | _item->name##_prev = _item->name##_next = NULL; \ |
60918275 LP |
45 | } while(false) |
46 | ||
47 | /* Prepend an item to the list */ | |
034c6ed7 | 48 | #define LIST_PREPEND(t,name,head,item) \ |
60918275 LP |
49 | do { \ |
50 | t **_head = &(head), *_item = (item); \ | |
51 | assert(_item); \ | |
034c6ed7 LP |
52 | if ((_item->name##_next = *_head)) \ |
53 | _item->name##_next->name##_prev = _item; \ | |
54 | _item->name##_prev = NULL; \ | |
60918275 LP |
55 | *_head = _item; \ |
56 | } while(false) | |
57 | ||
58 | /* Remove an item from the list */ | |
034c6ed7 | 59 | #define LIST_REMOVE(t,name,head,item) \ |
60918275 LP |
60 | do { \ |
61 | t **_head = &(head), *_item = (item); \ | |
62 | assert(_item); \ | |
034c6ed7 LP |
63 | if (_item->name##_next) \ |
64 | _item->name##_next->name##_prev = _item->name##_prev; \ | |
65 | if (_item->name##_prev) \ | |
66 | _item->name##_prev->name##_next = _item->name##_next; \ | |
60918275 LP |
67 | else { \ |
68 | assert(*_head == _item); \ | |
034c6ed7 | 69 | *_head = _item->name##_next; \ |
60918275 | 70 | } \ |
034c6ed7 | 71 | _item->name##_next = _item->name##_prev = NULL; \ |
60918275 LP |
72 | } while(false) |
73 | ||
74 | /* Find the head of the list */ | |
034c6ed7 | 75 | #define LIST_FIND_HEAD(t,name,item,head) \ |
60918275 | 76 | do { \ |
034c6ed7 LP |
77 | t *_item = (item); \ |
78 | assert(_item); \ | |
95e26a69 | 79 | while (_item->name##_prev) \ |
034c6ed7 LP |
80 | _item = _item->name##_prev; \ |
81 | (head) = _item; \ | |
82 | } while (false) | |
83 | ||
84 | /* Find the head of the list */ | |
85 | #define LIST_FIND_TAIL(t,name,item,tail) \ | |
86 | do { \ | |
87 | t *_item = (item); \ | |
88 | assert(_item); \ | |
89 | while (_item->name##_next) \ | |
90 | _item = _item->name##_next; \ | |
91 | (tail) = _item; \ | |
60918275 LP |
92 | } while (false) |
93 | ||
94 | /* Insert an item after another one (a = where, b = what) */ | |
034c6ed7 | 95 | #define LIST_INSERT_AFTER(t,name,head,a,b) \ |
60918275 LP |
96 | do { \ |
97 | t **_head = &(head), *_a = (a), *_b = (b); \ | |
98 | assert(_b); \ | |
99 | if (!_a) { \ | |
034c6ed7 LP |
100 | if ((_b->name##_next = *_head)) \ |
101 | _b->name##_next->name##_prev = _b; \ | |
102 | _b->name##_prev = NULL; \ | |
60918275 LP |
103 | *_head = _b; \ |
104 | } else { \ | |
034c6ed7 LP |
105 | if ((_b->name##_next = _a->name##_next)) \ |
106 | _b->name##_next->name##_prev = _b; \ | |
107 | _b->name##_prev = _a; \ | |
108 | _a->name##_next = _b; \ | |
60918275 LP |
109 | } \ |
110 | } while(false) | |
111 | ||
6210e7fc LP |
112 | #define LIST_JUST_US(name,item) \ |
113 | (!(item)->name##_prev && !(item)->name##_next) \ | |
114 | ||
034c6ed7 LP |
115 | #define LIST_FOREACH(name,i,head) \ |
116 | for ((i) = (head); (i); (i) = (i)->name##_next) | |
60918275 | 117 | |
034c6ed7 LP |
118 | #define LIST_FOREACH_SAFE(name,i,n,head) \ |
119 | for ((i) = (head); (i) && (((n) = (i)->name##_next), 1); (i) = (n)) | |
60918275 | 120 | |
e04aad61 LP |
121 | #define LIST_FOREACH_BEFORE(name,i,p) \ |
122 | for ((i) = (p)->name##_prev; (i); (i) = (i)->name##_prev) | |
123 | ||
124 | #define LIST_FOREACH_AFTER(name,i,p) \ | |
125 | for ((i) = (p)->name##_next; (i); (i) = (i)->name##_next) |