]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/macro.h
TODO: update
[thirdparty/systemd.git] / src / shared / macro.h
CommitLineData
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 24#include <assert.h>
6a39419f 25#include <sys/param.h>
60918275 26#include <sys/types.h>
c31e1495
LP
27#include <sys/uio.h>
28#include <inttypes.h>
60918275 29
93a46b0b
LP
30#define _printf_attr_(a,b) __attribute__ ((format (printf, a, b)))
31#define _sentinel_ __attribute__ ((sentinel))
32#define _noreturn_ __attribute__((noreturn))
33#define _unused_ __attribute__ ((unused))
34#define _destructor_ __attribute__ ((destructor))
35#define _pure_ __attribute__ ((pure))
36#define _const_ __attribute__ ((const))
37#define _deprecated_ __attribute__ ((deprecated))
38#define _packed_ __attribute__ ((packed))
39#define _malloc_ __attribute__ ((malloc))
40#define _weak_ __attribute__ ((weak))
41#define _likely_(x) (__builtin_expect(!!(x),1))
42#define _unlikely_(x) (__builtin_expect(!!(x),0))
40473a70
LP
43#define _public_ __attribute__ ((visibility("default")))
44#define _hidden_ __attribute__ ((visibility("hidden")))
ad780f19 45#define _weakref_(x) __attribute__((weakref(#x)))
9a60da28 46#define _introspect_(x) __attribute__((section("introspect." x)))
19d1e4ee 47#define _alignas_(x) __attribute__((aligned(__alignof(x))))
60918275 48
49e5de64
ZJS
49/* automake test harness */
50#define EXIT_TEST_SKIP 77
51
bef2733f
LP
52#define XSTRINGIFY(x) #x
53#define STRINGIFY(x) XSTRINGIFY(x)
54
60918275 55/* Rounds up */
37f85e66 56#define ALIGN(l) ALIGN_TO((l), sizeof(void*))
57static inline size_t ALIGN_TO(size_t l, size_t ali) {
58 return ((l + ali - 1) & ~(ali - 1));
22be093f
LP
59}
60
60918275
LP
61#define ELEMENTSOF(x) (sizeof(x)/sizeof((x)[0]))
62
bbc98d32
KS
63/*
64 * container_of - cast a member of a structure out to the containing structure
65 * @ptr: the pointer to the member.
66 * @type: the type of the container struct this is embedded in.
67 * @member: the name of the member within the struct.
68 *
69 */
fa70beaa
LP
70#define container_of(ptr, type, member) \
71 __extension__ ({ \
72 const typeof( ((type *)0)->member ) *__mptr = (ptr); \
73 (type *)( (char *)__mptr - offsetof(type,member) ); \
74 })
bbc98d32 75
9607d947
CR
76#undef MAX
77#define MAX(a,b) \
78 __extension__ ({ \
79 typeof(a) _a = (a); \
80 typeof(b) _b = (b); \
81 _a > _b ? _a : _b; \
60918275
LP
82 })
83
9607d947
CR
84#define MAX3(x,y,z) \
85 __extension__ ({ \
86 typeof(x) _c = MAX(x,y); \
87 MAX(_c, z); \
88 })
3b63d2d3 89
9607d947 90#undef MIN
60918275
LP
91#define MIN(a,b) \
92 __extension__ ({ \
93 typeof(a) _a = (a); \
94 typeof(b) _b = (b); \
95 _a < _b ? _a : _b; \
96 })
97
907809fc 98#ifndef CLAMP
60918275
LP
99#define CLAMP(x, low, high) \
100 __extension__ ({ \
101 typeof(x) _x = (x); \
102 typeof(low) _low = (low); \
103 typeof(high) _high = (high); \
104 ((_x > _high) ? _high : ((_x < _low) ? _low : _x)); \
105 })
907809fc 106#endif
60918275 107
dd8f71ee
LP
108#define assert_se(expr) \
109 do { \
93a46b0b 110 if (_unlikely_(!(expr))) \
b7f33638 111 log_assert_failed(#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
dd8f71ee
LP
112 } while (false) \
113
114/* We override the glibc assert() here. */
115#undef assert
116#ifdef NDEBUG
117#define assert(expr) do {} while(false)
118#else
119#define assert(expr) assert_se(expr)
120#endif
60918275 121
dd8f71ee
LP
122#define assert_not_reached(t) \
123 do { \
b7f33638 124 log_assert_failed_unreachable(t, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
dd8f71ee 125 } while (false)
60918275 126
f791c684
LP
127#if defined(static_assert)
128#define assert_cc(expr) \
129 do { \
130 static_assert(expr, #expr); \
60918275 131 } while (false)
f791c684
LP
132#else
133#define assert_cc(expr) \
134 do { \
135 switch (0) { \
136 case 0: \
137 case !!(expr): \
138 ; \
139 } \
140 } while (false)
141#endif
60918275
LP
142
143#define PTR_TO_UINT(p) ((unsigned int) ((uintptr_t) (p)))
144#define UINT_TO_PTR(u) ((void*) ((uintptr_t) (u)))
145
146#define PTR_TO_UINT32(p) ((uint32_t) ((uintptr_t) (p)))
147#define UINT32_TO_PTR(u) ((void*) ((uintptr_t) (u)))
148
c6c18be3
LP
149#define PTR_TO_ULONG(p) ((unsigned long) ((uintptr_t) (p)))
150#define ULONG_TO_PTR(u) ((void*) ((uintptr_t) (u)))
151
60918275
LP
152#define PTR_TO_INT(p) ((int) ((intptr_t) (p)))
153#define INT_TO_PTR(u) ((void*) ((intptr_t) (u)))
154
155#define TO_INT32(p) ((int32_t) ((intptr_t) (p)))
156#define INT32_TO_PTR(u) ((void*) ((intptr_t) (u)))
157
c6c18be3
LP
158#define PTR_TO_LONG(p) ((long) ((intptr_t) (p)))
159#define LONG_TO_PTR(u) ((void*) ((intptr_t) (u)))
160
476fe607
LP
161#define memzero(x,l) (memset((x), 0, (l)))
162#define zero(x) (memzero(&(x), sizeof(x)))
163
a9c55a88
LP
164#define CHAR_TO_STR(x) ((char[2]) { x, 0 })
165
034c6ed7
LP
166#define char_array_0(x) x[sizeof(x)-1] = 0;
167
bff7c062 168#define IOVEC_SET_STRING(i, s) \
2fa086a8 169 do { \
bff7c062
LP
170 struct iovec *_i = &(i); \
171 char *_s = (char *)(s); \
172 _i->iov_base = _s; \
173 _i->iov_len = strlen(_s); \
9b3c575e 174 } while(false)
2fa086a8 175
c31e1495
LP
176static inline size_t IOVEC_TOTAL_SIZE(const struct iovec *i, unsigned n) {
177 unsigned j;
178 size_t r = 0;
179
180 for (j = 0; j < n; j++)
181 r += i[j].iov_len;
182
183 return r;
184}
185
186static inline size_t IOVEC_INCREMENT(struct iovec *i, unsigned n, size_t k) {
187 unsigned j;
188
189 for (j = 0; j < n; j++) {
190 size_t sub;
191
192 if (_unlikely_(k <= 0))
193 break;
194
195 sub = MIN(i[j].iov_len, k);
196 i[j].iov_len -= sub;
197 i[j].iov_base = (uint8_t*) i[j].iov_base + sub;
198 k -= sub;
199 }
200
201 return k;
202}
203
2fbe635a
LP
204#define _cleanup_free_ __attribute__((cleanup(freep)))
205#define _cleanup_fclose_ __attribute__((cleanup(fclosep)))
e985665d 206#define _cleanup_pclose_ __attribute__((cleanup(pclosep)))
e67f47e5 207#define _cleanup_close_ __attribute__((cleanup(closep)))
a05f97b3 208#define _cleanup_closedir_ __attribute__((cleanup(closedirp)))
25ea79fe 209#define _cleanup_umask_ __attribute__((cleanup(umaskp)))
bac3c8ee 210#define _cleanup_set_free_ __attribute__((cleanup(set_freep)))
e3ded78b 211#define _cleanup_set_free_free_ __attribute__((cleanup(set_free_freep)))
6d0274f1 212#define _cleanup_strv_free_ __attribute__((cleanup(strv_freep)))
763c7aa2 213#define _cleanup_journal_close_ __attribute__((cleanup(journal_closep)))
2fbe635a 214
cecd32f6
LP
215#define VA_FORMAT_ADVANCE(format, ap) \
216do { \
217 int _argtypes[128]; \
963ddb91
LP
218 size_t _i, _k; \
219 _k = parse_printf_format((format), ELEMENTSOF(_argtypes), _argtypes); \
cecd32f6 220 assert(_k < ELEMENTSOF(_argtypes)); \
963ddb91
LP
221 for (_i = 0; _i < _k; _i++) { \
222 if (_argtypes[_i] & PA_FLAG_PTR) { \
223 (void) va_arg(ap, void*); \
224 continue; \
225 } \
226 \
227 switch (_argtypes[_i]) { \
228 case PA_INT: \
229 case PA_INT|PA_FLAG_SHORT: \
230 case PA_CHAR: \
231 (void) va_arg(ap, int); \
232 break; \
233 case PA_INT|PA_FLAG_LONG: \
234 (void) va_arg(ap, long int); \
235 break; \
236 case PA_INT|PA_FLAG_LONG_LONG: \
237 (void) va_arg(ap, long long int); \
238 break; \
239 case PA_WCHAR: \
240 (void) va_arg(ap, wchar_t); \
241 break; \
242 case PA_WSTRING: \
243 case PA_STRING: \
244 case PA_POINTER: \
245 (void) va_arg(ap, void*); \
246 break; \
247 case PA_FLOAT: \
248 case PA_DOUBLE: \
249 (void) va_arg(ap, double); \
250 break; \
251 case PA_DOUBLE|PA_FLAG_LONG_DOUBLE: \
252 (void) va_arg(ap, long double); \
253 break; \
254 default: \
255 assert_not_reached("Unknown format string argument."); \
256 } \
257 } \
258} while(false)
259
fa70beaa
LP
260/* Returns the number of chars needed to format variables of the
261 * specified type as a decimal string. Adds in extra space for a
262 * negative '-' prefix. */
263
264#define DECIMAL_STR_MAX(type) \
265 (1+(sizeof(type) <= 1 ? 3 : \
266 sizeof(type) <= 2 ? 5 : \
267 sizeof(type) <= 4 ? 10 : \
268 sizeof(type) <= 8 ? 20 : sizeof(int[-2*(sizeof(type) > 8)])))
269
dd8f71ee 270#include "log.h"