]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/macro.h
journalctl: add --output-fields= to --help text (#7443)
[thirdparty/systemd.git] / src / basic / macro.h
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
c2f1db8f 2#pragma once
60918275 3
a7334b09
LP
4/***
5 This file is part of systemd.
6
7 Copyright 2010 Lennart Poettering
8
9 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
12 (at your option) any later version.
13
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 17 Lesser General Public License for more details.
a7334b09 18
5430f7f2 19 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21***/
22
c31e1495 23#include <inttypes.h>
c01ff965 24#include <stdbool.h>
afc5dbf3 25#include <sys/param.h>
27d13af7 26#include <sys/sysmacros.h>
afc5dbf3 27#include <sys/types.h>
60918275 28
44b601bc 29#define _printf_(a,b) __attribute__ ((format (printf, a, b)))
26e9e10b
ZJS
30#ifdef __clang__
31# define _alloc_(...)
32#else
33# define _alloc_(...) __attribute__ ((alloc_size(__VA_ARGS__)))
34#endif
93a46b0b 35#define _sentinel_ __attribute__ ((sentinel))
93a46b0b
LP
36#define _unused_ __attribute__ ((unused))
37#define _destructor_ __attribute__ ((destructor))
38#define _pure_ __attribute__ ((pure))
39#define _const_ __attribute__ ((const))
40#define _deprecated_ __attribute__ ((deprecated))
41#define _packed_ __attribute__ ((packed))
42#define _malloc_ __attribute__ ((malloc))
43#define _weak_ __attribute__ ((weak))
44#define _likely_(x) (__builtin_expect(!!(x),1))
45#define _unlikely_(x) (__builtin_expect(!!(x),0))
40473a70
LP
46#define _public_ __attribute__ ((visibility("default")))
47#define _hidden_ __attribute__ ((visibility("hidden")))
ad780f19 48#define _weakref_(x) __attribute__((weakref(#x)))
19d1e4ee 49#define _alignas_(x) __attribute__((aligned(__alignof(x))))
dfb33a97 50#define _cleanup_(x) __attribute__((cleanup(x)))
4831981d 51#define _fallthrough_ __attribute__((fallthrough))
60918275 52
7ebe131a
LP
53/* Temporarily disable some warnings */
54#define DISABLE_WARNING_DECLARATION_AFTER_STATEMENT \
55 _Pragma("GCC diagnostic push"); \
56 _Pragma("GCC diagnostic ignored \"-Wdeclaration-after-statement\"")
57
bcfce235
LP
58#define DISABLE_WARNING_FORMAT_NONLITERAL \
59 _Pragma("GCC diagnostic push"); \
60 _Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\"")
61
f0f2e63b
LP
62#define DISABLE_WARNING_MISSING_PROTOTYPES \
63 _Pragma("GCC diagnostic push"); \
64 _Pragma("GCC diagnostic ignored \"-Wmissing-prototypes\"")
65
8fca4e30
LP
66#define DISABLE_WARNING_NONNULL \
67 _Pragma("GCC diagnostic push"); \
68 _Pragma("GCC diagnostic ignored \"-Wnonnull\"")
69
d442e2ec
DH
70#define DISABLE_WARNING_SHADOW \
71 _Pragma("GCC diagnostic push"); \
72 _Pragma("GCC diagnostic ignored \"-Wshadow\"")
73
df99a9ef
ZJS
74#define DISABLE_WARNING_INCOMPATIBLE_POINTER_TYPES \
75 _Pragma("GCC diagnostic push"); \
76 _Pragma("GCC diagnostic ignored \"-Wincompatible-pointer-types\"")
77
7ebe131a
LP
78#define REENABLE_WARNING \
79 _Pragma("GCC diagnostic pop")
80
49e5de64
ZJS
81/* automake test harness */
82#define EXIT_TEST_SKIP 77
83
bef2733f
LP
84#define XSTRINGIFY(x) #x
85#define STRINGIFY(x) XSTRINGIFY(x)
86
ab9cbe34
LS
87#define XCONCATENATE(x, y) x ## y
88#define CONCATENATE(x, y) XCONCATENATE(x, y)
89
fb835651
DH
90#define UNIQ_T(x, uniq) CONCATENATE(__unique_prefix_, CONCATENATE(x, uniq))
91#define UNIQ __COUNTER__
92
13b498f9
TJ
93/* builtins */
94#if __SIZEOF_INT__ == 4
95#define BUILTIN_FFS_U32(x) __builtin_ffs(x);
96#elif __SIZEOF_LONG__ == 4
97#define BUILTIN_FFS_U32(x) __builtin_ffsl(x);
98#else
99#error "neither int nor long are four bytes long?!?"
100#endif
101
60918275 102/* Rounds up */
9be9c7cf
LP
103
104#define ALIGN4(l) (((l) + 3) & ~3)
105#define ALIGN8(l) (((l) + 7) & ~7)
106
107#if __SIZEOF_POINTER__ == 8
108#define ALIGN(l) ALIGN8(l)
109#elif __SIZEOF_POINTER__ == 4
110#define ALIGN(l) ALIGN4(l)
111#else
112#error "Wut? Pointers are neither 4 nor 8 bytes long?"
113#endif
114
5f86c1f4
LP
115#define ALIGN_PTR(p) ((void*) ALIGN((unsigned long) (p)))
116#define ALIGN4_PTR(p) ((void*) ALIGN4((unsigned long) (p)))
117#define ALIGN8_PTR(p) ((void*) ALIGN8((unsigned long) (p)))
e86b80b8 118
37f85e66 119static inline size_t ALIGN_TO(size_t l, size_t ali) {
120 return ((l + ali - 1) & ~(ali - 1));
22be093f
LP
121}
122
5f86c1f4 123#define ALIGN_TO_PTR(p, ali) ((void*) ALIGN_TO((unsigned long) (p), (ali)))
49aa47c7 124
625e870b
DH
125/* align to next higher power-of-2 (except for: 0 => 0, overflow => 0) */
126static inline unsigned long ALIGN_POWER2(unsigned long u) {
127 /* clz(0) is undefined */
128 if (u == 1)
129 return 1;
130
131 /* left-shift overflow is undefined */
132 if (__builtin_clzl(u - 1UL) < 1)
133 return 0;
134
135 return 1UL << (sizeof(u) * 8 - __builtin_clzl(u - 1UL));
136}
137
7f39a210
MS
138#define ELEMENTSOF(x) \
139 __extension__ (__builtin_choose_expr( \
140 !__builtin_types_compatible_p(typeof(x), typeof(&*(x))), \
141 sizeof(x)/sizeof((x)[0]), \
142 (void)0))
bbc98d32
KS
143/*
144 * container_of - cast a member of a structure out to the containing structure
145 * @ptr: the pointer to the member.
146 * @type: the type of the container struct this is embedded in.
147 * @member: the name of the member within the struct.
bbc98d32 148 */
fb835651
DH
149#define container_of(ptr, type, member) __container_of(UNIQ, (ptr), type, member)
150#define __container_of(uniq, ptr, type, member) \
fa70beaa 151 __extension__ ({ \
fb835651
DH
152 const typeof( ((type*)0)->member ) *UNIQ_T(A, uniq) = (ptr); \
153 (type*)( (char *)UNIQ_T(A, uniq) - offsetof(type,member) ); \
154 })
bbc98d32 155
9607d947 156#undef MAX
667a0377
DH
157#define MAX(a, b) __MAX(UNIQ, (a), UNIQ, (b))
158#define __MAX(aq, a, bq, b) \
fdcba430 159 __extension__ ({ \
667a0377
DH
160 const typeof(a) UNIQ_T(A, aq) = (a); \
161 const typeof(b) UNIQ_T(B, bq) = (b); \
162 UNIQ_T(A,aq) > UNIQ_T(B,bq) ? UNIQ_T(A,aq) : UNIQ_T(B,bq); \
163 })
60918275 164
7242d742
DH
165/* evaluates to (void) if _A or _B are not constant or of different types */
166#define CONST_MAX(_A, _B) \
167 __extension__ (__builtin_choose_expr( \
168 __builtin_constant_p(_A) && \
169 __builtin_constant_p(_B) && \
170 __builtin_types_compatible_p(typeof(_A), typeof(_B)), \
171 ((_A) > (_B)) ? (_A) : (_B), \
172 (void)0))
173
40a1eebd
DH
174/* takes two types and returns the size of the larger one */
175#define MAXSIZE(A, B) (sizeof(union _packed_ { typeof(A) a; typeof(B) b; }))
176
fdcba430
DH
177#define MAX3(x,y,z) \
178 __extension__ ({ \
179 const typeof(x) _c = MAX(x,y); \
180 MAX(_c, z); \
9607d947 181 })
3b63d2d3 182
9607d947 183#undef MIN
667a0377
DH
184#define MIN(a, b) __MIN(UNIQ, (a), UNIQ, (b))
185#define __MIN(aq, a, bq, b) \
fdcba430 186 __extension__ ({ \
667a0377
DH
187 const typeof(a) UNIQ_T(A, aq) = (a); \
188 const typeof(b) UNIQ_T(B, bq) = (b); \
189 UNIQ_T(A,aq) < UNIQ_T(B,bq) ? UNIQ_T(A,aq) : UNIQ_T(B,bq); \
190 })
60918275 191
fdcba430
DH
192#define MIN3(x,y,z) \
193 __extension__ ({ \
194 const typeof(x) _c = MIN(x,y); \
195 MIN(_c, z); \
7df23077
DH
196 })
197
667a0377
DH
198#define LESS_BY(a, b) __LESS_BY(UNIQ, (a), UNIQ, (b))
199#define __LESS_BY(aq, a, bq, b) \
fdcba430 200 __extension__ ({ \
667a0377
DH
201 const typeof(a) UNIQ_T(A, aq) = (a); \
202 const typeof(b) UNIQ_T(B, bq) = (b); \
203 UNIQ_T(A,aq) > UNIQ_T(B,bq) ? UNIQ_T(A,aq) - UNIQ_T(B,bq) : 0; \
204 })
348ced90 205
667a0377
DH
206#undef CLAMP
207#define CLAMP(x, low, high) __CLAMP(UNIQ, (x), UNIQ, (low), UNIQ, (high))
208#define __CLAMP(xq, x, lowq, low, highq, high) \
60918275 209 __extension__ ({ \
667a0377
DH
210 const typeof(x) UNIQ_T(X,xq) = (x); \
211 const typeof(low) UNIQ_T(LOW,lowq) = (low); \
212 const typeof(high) UNIQ_T(HIGH,highq) = (high); \
213 UNIQ_T(X,xq) > UNIQ_T(HIGH,highq) ? \
214 UNIQ_T(HIGH,highq) : \
215 UNIQ_T(X,xq) < UNIQ_T(LOW,lowq) ? \
216 UNIQ_T(LOW,lowq) : \
217 UNIQ_T(X,xq); \
218 })
60918275 219
180a60bc
DH
220/* [(x + y - 1) / y] suffers from an integer overflow, even though the
221 * computation should be possible in the given type. Therefore, we use
222 * [x / y + !!(x % y)]. Note that on "Real CPUs" a division returns both the
223 * quotient and the remainder, so both should be equally fast. */
224#define DIV_ROUND_UP(_x, _y) \
225 __extension__ ({ \
226 const typeof(_x) __x = (_x); \
227 const typeof(_y) __y = (_y); \
228 (__x / __y + !!(__x % __y)); \
229 })
230
34c38d2a 231#define assert_message_se(expr, message) \
dd8f71ee 232 do { \
93a46b0b 233 if (_unlikely_(!(expr))) \
34c38d2a
MS
234 log_assert_failed(message, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
235 } while (false)
236
237#define assert_se(expr) assert_message_se(expr, #expr)
dd8f71ee
LP
238
239/* We override the glibc assert() here. */
240#undef assert
241#ifdef NDEBUG
9ed794a3 242#define assert(expr) do {} while (false)
dd8f71ee 243#else
34c38d2a 244#define assert(expr) assert_message_se(expr, #expr)
dd8f71ee 245#endif
60918275 246
dd8f71ee
LP
247#define assert_not_reached(t) \
248 do { \
b7f33638 249 log_assert_failed_unreachable(t, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
dd8f71ee 250 } while (false)
60918275 251
f791c684 252#if defined(static_assert)
7ebe131a
LP
253/* static_assert() is sometimes defined in a way that trips up
254 * -Wdeclaration-after-statement, hence let's temporarily turn off
255 * this warning around it. */
256#define assert_cc(expr) \
257 DISABLE_WARNING_DECLARATION_AFTER_STATEMENT; \
258 static_assert(expr, #expr); \
259 REENABLE_WARNING
f791c684 260#else
7ebe131a
LP
261#define assert_cc(expr) \
262 DISABLE_WARNING_DECLARATION_AFTER_STATEMENT; \
6825a04d 263 struct CONCATENATE(_assert_struct_, __COUNTER__) { \
7ebe131a
LP
264 char x[(expr) ? 0 : -1]; \
265 }; \
266 REENABLE_WARNING
f791c684 267#endif
60918275 268
34c38d2a
MS
269#define assert_log(expr, message) ((_likely_(expr)) \
270 ? (true) \
271 : (log_assert_failed_return(message, __FILE__, __LINE__, __PRETTY_FUNCTION__), false))
366e6411 272
80514f9c
LP
273#define assert_return(expr, r) \
274 do { \
34c38d2a 275 if (!assert_log(expr, #expr)) \
80514f9c 276 return (r); \
18387b59
LP
277 } while (false)
278
aa029628
TG
279#define assert_return_errno(expr, r, err) \
280 do { \
34c38d2a 281 if (!assert_log(expr, #expr)) { \
aa029628
TG
282 errno = err; \
283 return (r); \
284 } \
285 } while (false)
286
a3dc3547
KS
287#define PTR_TO_INT(p) ((int) ((intptr_t) (p)))
288#define INT_TO_PTR(u) ((void *) ((intptr_t) (u)))
60918275 289#define PTR_TO_UINT(p) ((unsigned int) ((uintptr_t) (p)))
a3dc3547 290#define UINT_TO_PTR(u) ((void *) ((uintptr_t) (u)))
60918275 291
a3dc3547
KS
292#define PTR_TO_LONG(p) ((long) ((intptr_t) (p)))
293#define LONG_TO_PTR(u) ((void *) ((intptr_t) (u)))
c6c18be3 294#define PTR_TO_ULONG(p) ((unsigned long) ((uintptr_t) (p)))
a3dc3547 295#define ULONG_TO_PTR(u) ((void *) ((uintptr_t) (u)))
c6c18be3 296
a3dc3547
KS
297#define PTR_TO_INT32(p) ((int32_t) ((intptr_t) (p)))
298#define INT32_TO_PTR(u) ((void *) ((intptr_t) (u)))
299#define PTR_TO_UINT32(p) ((uint32_t) ((uintptr_t) (p)))
300#define UINT32_TO_PTR(u) ((void *) ((uintptr_t) (u)))
60918275 301
a3dc3547
KS
302#define PTR_TO_INT64(p) ((int64_t) ((intptr_t) (p)))
303#define INT64_TO_PTR(u) ((void *) ((intptr_t) (u)))
304#define PTR_TO_UINT64(p) ((uint64_t) ((uintptr_t) (p)))
305#define UINT64_TO_PTR(u) ((void *) ((uintptr_t) (u)))
c6c18be3 306
74b2466e
LP
307#define PTR_TO_SIZE(p) ((size_t) ((uintptr_t) (p)))
308#define SIZE_TO_PTR(u) ((void *) ((uintptr_t) (u)))
309
a9c55a88
LP
310#define CHAR_TO_STR(x) ((char[2]) { x, 0 })
311
034c6ed7
LP
312#define char_array_0(x) x[sizeof(x)-1] = 0;
313
fa70beaa
LP
314/* Returns the number of chars needed to format variables of the
315 * specified type as a decimal string. Adds in extra space for a
b7ce6b59
LP
316 * negative '-' prefix (hence works correctly on signed
317 * types). Includes space for the trailing NUL. */
fa70beaa 318#define DECIMAL_STR_MAX(type) \
5bcb0f2b 319 (2+(sizeof(type) <= 1 ? 3 : \
fa70beaa
LP
320 sizeof(type) <= 2 ? 5 : \
321 sizeof(type) <= 4 ? 10 : \
322 sizeof(type) <= 8 ? 20 : sizeof(int[-2*(sizeof(type) > 8)])))
323
0d1dbeb3
LP
324#define DECIMAL_STR_WIDTH(x) \
325 ({ \
326 typeof(x) _x_ = (x); \
327 unsigned ans = 1; \
328 while (_x_ /= 10) \
329 ans++; \
330 ans; \
331 })
332
264ad849
LP
333#define SET_FLAG(v, flag, b) \
334 (v) = (b) ? ((v) | (flag)) : ((v) & ~(flag))
335
d5b26d50
DM
336#define CASE_F(X) case X:
337#define CASE_F_1(CASE, X) CASE_F(X)
338#define CASE_F_2(CASE, X, ...) CASE(X) CASE_F_1(CASE, __VA_ARGS__)
339#define CASE_F_3(CASE, X, ...) CASE(X) CASE_F_2(CASE, __VA_ARGS__)
340#define CASE_F_4(CASE, X, ...) CASE(X) CASE_F_3(CASE, __VA_ARGS__)
341#define CASE_F_5(CASE, X, ...) CASE(X) CASE_F_4(CASE, __VA_ARGS__)
342#define CASE_F_6(CASE, X, ...) CASE(X) CASE_F_5(CASE, __VA_ARGS__)
343#define CASE_F_7(CASE, X, ...) CASE(X) CASE_F_6(CASE, __VA_ARGS__)
344#define CASE_F_8(CASE, X, ...) CASE(X) CASE_F_7(CASE, __VA_ARGS__)
345#define CASE_F_9(CASE, X, ...) CASE(X) CASE_F_8(CASE, __VA_ARGS__)
346#define CASE_F_10(CASE, X, ...) CASE(X) CASE_F_9(CASE, __VA_ARGS__)
347#define CASE_F_11(CASE, X, ...) CASE(X) CASE_F_10(CASE, __VA_ARGS__)
348#define CASE_F_12(CASE, X, ...) CASE(X) CASE_F_11(CASE, __VA_ARGS__)
349#define CASE_F_13(CASE, X, ...) CASE(X) CASE_F_12(CASE, __VA_ARGS__)
350#define CASE_F_14(CASE, X, ...) CASE(X) CASE_F_13(CASE, __VA_ARGS__)
351#define CASE_F_15(CASE, X, ...) CASE(X) CASE_F_14(CASE, __VA_ARGS__)
352#define CASE_F_16(CASE, X, ...) CASE(X) CASE_F_15(CASE, __VA_ARGS__)
353#define CASE_F_17(CASE, X, ...) CASE(X) CASE_F_16(CASE, __VA_ARGS__)
354#define CASE_F_18(CASE, X, ...) CASE(X) CASE_F_17(CASE, __VA_ARGS__)
355#define CASE_F_19(CASE, X, ...) CASE(X) CASE_F_18(CASE, __VA_ARGS__)
356#define CASE_F_20(CASE, X, ...) CASE(X) CASE_F_19(CASE, __VA_ARGS__)
357
358#define GET_CASE_F(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,NAME,...) NAME
359#define FOR_EACH_MAKE_CASE(...) \
360 GET_CASE_F(__VA_ARGS__,CASE_F_20,CASE_F_19,CASE_F_18,CASE_F_17,CASE_F_16,CASE_F_15,CASE_F_14,CASE_F_13,CASE_F_12,CASE_F_11, \
361 CASE_F_10,CASE_F_9,CASE_F_8,CASE_F_7,CASE_F_6,CASE_F_5,CASE_F_4,CASE_F_3,CASE_F_2,CASE_F_1) \
362 (CASE_F,__VA_ARGS__)
363
364#define IN_SET(x, ...) \
365 ({ \
366 bool _found = false; \
367 /* If the build breaks in the line below, you need to extend the case macros */ \
368 static _unused_ char _static_assert__macros_need_to_be_extended[20 - sizeof((int[]){__VA_ARGS__})/sizeof(int)]; \
369 switch(x) { \
370 FOR_EACH_MAKE_CASE(__VA_ARGS__) \
371 _found = true; \
372 break; \
373 default: \
374 break; \
375 } \
376 _found; \
cabb7806
LP
377 })
378
35aa04e9
LP
379#define SWAP_TWO(x, y) do { \
380 typeof(x) _t = (x); \
381 (x) = (y); \
382 (y) = (_t); \
383 } while (false)
384
919ce0b7
SL
385/* Define C11 thread_local attribute even on older gcc compiler
386 * version */
ec202eae
SL
387#ifndef thread_local
388/*
389 * Don't break on glibc < 2.16 that doesn't define __STDC_NO_THREADS__
390 * see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53769
391 */
392#if __STDC_VERSION__ >= 201112L && !(defined(__STDC_NO_THREADS__) || (defined(__GNU_LIBRARY__) && __GLIBC__ == 2 && __GLIBC_MINOR__ < 16))
393#define thread_local _Thread_local
394#else
395#define thread_local __thread
396#endif
397#endif
cabb7806 398
919ce0b7
SL
399/* Define C11 noreturn without <stdnoreturn.h> and even on older gcc
400 * compiler versions */
401#ifndef noreturn
402#if __STDC_VERSION__ >= 201112L
403#define noreturn _Noreturn
404#else
405#define noreturn __attribute__((noreturn))
406#endif
407#endif
408
a2341f68
ZJS
409#define DEFINE_TRIVIAL_CLEANUP_FUNC(type, func) \
410 static inline void func##p(type *p) { \
411 if (*p) \
412 func(*p); \
413 } \
414 struct __useless_struct_to_allow_trailing_semicolon__
415
dd8f71ee 416#include "log.h"