]> git.ipfire.org Git - thirdparty/systemd.git/blame - coccinelle/macros.h
meson: Use configure_file when version-tag is specified
[thirdparty/systemd.git] / coccinelle / macros.h
CommitLineData
44764313
FS
1/* Collected macros from our systemd codebase to make the cocci semantic
2 * parser happy. Inspired by the original cocci macros file
3 * /usr/lib64/coccinelle/standard.h (including the YACFE_* symbols)
4 */
5
6// General
7#define PTR_TO_PID(x)
8
9// src/basic/macro.h
10#define _printf_(a, b) __attribute__((__format__(printf, a, b)))
11#define _alloc_(...) __attribute__((__alloc_size__(__VA_ARGS__)))
12#define _sentinel_ __attribute__((__sentinel__))
13#define _section_(x) __attribute__((__section__(x)))
14#define _used_ __attribute__((__used__))
15#define _unused_ __attribute__((__unused__))
16#define _destructor_ __attribute__((__destructor__))
17#define _pure_ __attribute__((__pure__))
18#define _const_ __attribute__((__const__))
19#define _deprecated_ __attribute__((__deprecated__))
20#define _packed_ __attribute__((__packed__))
21#define _malloc_ __attribute__((__malloc__))
22#define _weak_ __attribute__((__weak__))
23#define _likely_(x) (__builtin_expect(!!(x), 1))
24#define _unlikely_(x) (__builtin_expect(!!(x), 0))
25#define _public_ __attribute__((__visibility__("default")))
26#define _hidden_ __attribute__((__visibility__("hidden")))
27#define _weakref_(x) __attribute__((__weakref__(#x)))
28#define _align_(x) __attribute__((__aligned__(x)))
29#define _alignas_(x) __attribute__((__aligned__(__alignof(x))))
30#define _alignptr_ __attribute__((__aligned__(sizeof(void*))))
31#define _cleanup_(x) __attribute__((__cleanup__(x)))
32#define _fallthrough_
33#define _noreturn_ __attribute__((__noreturn__))
34#define thread_local __thread
35
36#define ELEMENTSOF(x) \
37 (__builtin_choose_expr( \
38 !__builtin_types_compatible_p(typeof(x), typeof(&*(x))), \
39 sizeof(x)/sizeof((x)[0]), \
40 VOID_0))
41
42// src/basic/umask-util.h
43#define _cleanup_umask_
44#define RUN_WITH_UMASK(mask) \
45 for (_cleanup_umask_ mode_t _saved_umask_ = umask(mask) | S_IFMT; \
46 FLAGS_SET(_saved_umask_, S_IFMT); \
47 _saved_umask_ &= 0777)
48
49// src/basic/hashmap.h
50#define _IDX_ITERATOR_FIRST (UINT_MAX - 1)
51#define HASHMAP_FOREACH(e, h) YACFE_ITERATOR
52#define ORDERED_HASHMAP_FOREACH(e, h) YACFE_ITERATOR
53#define HASHMAP_FOREACH_KEY(e, k, h) YACFE_ITERATOR
54#define ORDERED_HASHMAP_FOREACH_KEY(e, k, h) YACFE_ITERATOR
55
56// src/basic/list.h
57#define LIST_HEAD(t,name) \
58 t *name
59#define LIST_FIELDS(t,name) \
60 t *name##_next, *name##_prev
61#define LIST_HEAD_INIT(head) \
62 do { \
63 (head) = NULL; \
64 } while (false)
65#define LIST_INIT(name,item) \
66 do { \
67 typeof(*(item)) *_item = (item); \
68 assert(_item); \
69 _item->name##_prev = _item->name##_next = NULL; \
70 } while (false)
71#define LIST_PREPEND(name,head,item) \
72 do { \
73 typeof(*(head)) **_head = &(head), *_item = (item); \
74 assert(_item); \
75 if ((_item->name##_next = *_head)) \
76 _item->name##_next->name##_prev = _item; \
77 _item->name##_prev = NULL; \
78 *_head = _item; \
79 } while (false)
80#define LIST_APPEND(name,head,item) \
81 do { \
82 typeof(*(head)) **_hhead = &(head), *_tail; \
83 LIST_FIND_TAIL(name, *_hhead, _tail); \
84 LIST_INSERT_AFTER(name, *_hhead, _tail, item); \
85 } while (false)
86#define LIST_REMOVE(name,head,item) \
87 do { \
88 typeof(*(head)) **_head = &(head), *_item = (item); \
89 assert(_item); \
90 if (_item->name##_next) \
91 _item->name##_next->name##_prev = _item->name##_prev; \
92 if (_item->name##_prev) \
93 _item->name##_prev->name##_next = _item->name##_next; \
94 else { \
95 assert(*_head == _item); \
96 *_head = _item->name##_next; \
97 } \
98 _item->name##_next = _item->name##_prev = NULL; \
99 } while (false)
100#define LIST_FIND_HEAD(name,item,head) \
101 do { \
102 typeof(*(item)) *_item = (item); \
103 if (!_item) \
104 (head) = NULL; \
105 else { \
106 while (_item->name##_prev) \
107 _item = _item->name##_prev; \
108 (head) = _item; \
109 } \
110 } while (false)
111#define LIST_FIND_TAIL(name,item,tail) \
112 do { \
113 typeof(*(item)) *_item = (item); \
114 if (!_item) \
115 (tail) = NULL; \
116 else { \
117 while (_item->name##_next) \
118 _item = _item->name##_next; \
119 (tail) = _item; \
120 } \
121 } while (false)
122#define LIST_INSERT_AFTER(name,head,a,b) \
123 do { \
124 typeof(*(head)) **_head = &(head), *_a = (a), *_b = (b); \
125 assert(_b); \
126 if (!_a) { \
127 if ((_b->name##_next = *_head)) \
128 _b->name##_next->name##_prev = _b; \
129 _b->name##_prev = NULL; \
130 *_head = _b; \
131 } else { \
132 if ((_b->name##_next = _a->name##_next)) \
133 _b->name##_next->name##_prev = _b; \
134 _b->name##_prev = _a; \
135 _a->name##_next = _b; \
136 } \
137 } while (false)
138#define LIST_INSERT_BEFORE(name,head,a,b) \
139 do { \
140 typeof(*(head)) **_head = &(head), *_a = (a), *_b = (b); \
141 assert(_b); \
142 if (!_a) { \
143 if (!*_head) { \
144 _b->name##_next = NULL; \
145 _b->name##_prev = NULL; \
146 *_head = _b; \
147 } else { \
148 typeof(*(head)) *_tail = (head); \
149 while (_tail->name##_next) \
150 _tail = _tail->name##_next; \
151 _b->name##_next = NULL; \
152 _b->name##_prev = _tail; \
153 _tail->name##_next = _b; \
154 } \
155 } else { \
156 if ((_b->name##_prev = _a->name##_prev)) \
157 _b->name##_prev->name##_next = _b; \
158 else \
159 *_head = _b; \
160 _b->name##_next = _a; \
161 _a->name##_prev = _b; \
162 } \
163 } while (false)
164
165#define LIST_JUST_US(name,item) \
166 (!(item)->name##_prev && !(item)->name##_next) \
167#define LIST_FOREACH(name,i,head) \
168 for ((i) = (head); (i); (i) = (i)->name##_next)
169#define LIST_FOREACH_SAFE(name,i,n,head) \
170 for ((i) = (head); (i) && (((n) = (i)->name##_next), 1); (i) = (n))
171#define LIST_FOREACH_BEFORE(name,i,p) \
172 for ((i) = (p)->name##_prev; (i); (i) = (i)->name##_prev)
173#define LIST_FOREACH_AFTER(name,i,p) \
174 for ((i) = (p)->name##_next; (i); (i) = (i)->name##_next)
175#define LIST_FOREACH_OTHERS(name,i,p) \
176 for (({ \
177 (i) = (p); \
178 while ((i) && (i)->name##_prev) \
179 (i) = (i)->name##_prev; \
180 if ((i) == (p)) \
181 (i) = (p)->name##_next; \
182 }); \
183 (i); \
184 (i) = (i)->name##_next == (p) ? (p)->name##_next : (i)->name##_next)
185#define LIST_LOOP_BUT_ONE(name,i,head,p) \
186 for ((i) = (p)->name##_next ? (p)->name##_next : (head); \
187 (i) != (p); \
188 (i) = (i)->name##_next ? (i)->name##_next : (head))
189
190#define LIST_IS_EMPTY(head) \
191 (!(head))
192#define LIST_JOIN(name,a,b) \
193 do { \
194 assert(b); \
195 if (!(a)) \
196 (a) = (b); \
197 else { \
198 typeof(*(a)) *_head = (b), *_tail; \
199 LIST_FIND_TAIL(name, (a), _tail); \
200 _tail->name##_next = _head; \
201 _head->name##_prev = _tail; \
202 } \
203 (b) = NULL; \
204 } while (false)
205
206// src/basic/strv.h
207#define STRV_FOREACH(s, l) YACFE_ITERATOR
208#define STRV_FOREACH_BACKWARDS(s, l) YACFE_ITERATOR
209#define STRV_FOREACH_PAIR(x, y, l) YACFE_ITERATOR
210
211// src/basic/socket-util.h
212#define CMSG_BUFFER_TYPE(size) \
213 union { \
214 struct cmsghdr cmsghdr; \
215 uint8_t buf[size]; \
216 uint8_t align_check[(size) >= CMSG_SPACE(0) && \
217 (size) == CMSG_ALIGN(size) ? 1 : -1]; \
218 }
219
220// src/libsystemd/sd-device/device-util.h
221#define FOREACH_DEVICE_PROPERTY(device, key, value) YACFE_ITERATOR
222#define FOREACH_DEVICE_TAG(device, tag) YACFE_ITERATOR
223#define FOREACH_DEVICE_CURRENT_TAG(device, tag) YACFE_ITERATOR
224#define FOREACH_DEVICE_SYSATTR(device, attr) YACFE_ITERATOR
225#define FOREACH_DEVICE_DEVLINK(device, devlink) YACFE_ITERATOR
226#define FOREACH_DEVICE(enumerator, device) YACFE_ITERATOR
227#define FOREACH_SUBSYSTEM(enumerator, device) YACFE_ITERATOR
228
229// src/basic/dirent-util.h
230#define FOREACH_DIRENT(de, d, on_error) YACFE_ITERATOR
231#define FOREACH_DIRENT_ALL(de, d, on_error) YACFE_ITERATOR