]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/stdio-util.h
tree-wide: remove Lennart's copyright lines
[thirdparty/systemd.git] / src / basic / stdio-util.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #pragma once
3
4 #include <printf.h>
5 #include <stdarg.h>
6 #include <stdio.h>
7 #include <sys/types.h>
8
9 #include "macro.h"
10
11 #define snprintf_ok(buf, len, fmt, ...) \
12 ((size_t) snprintf(buf, len, fmt, __VA_ARGS__) < (len))
13
14 #define xsprintf(buf, fmt, ...) \
15 assert_message_se(snprintf_ok(buf, ELEMENTSOF(buf), fmt, __VA_ARGS__), "xsprintf: " #buf "[] must be big enough")
16
17 #define VA_FORMAT_ADVANCE(format, ap) \
18 do { \
19 int _argtypes[128]; \
20 size_t _i, _k; \
21 _k = parse_printf_format((format), ELEMENTSOF(_argtypes), _argtypes); \
22 assert(_k < ELEMENTSOF(_argtypes)); \
23 for (_i = 0; _i < _k; _i++) { \
24 if (_argtypes[_i] & PA_FLAG_PTR) { \
25 (void) va_arg(ap, void*); \
26 continue; \
27 } \
28 \
29 switch (_argtypes[_i]) { \
30 case PA_INT: \
31 case PA_INT|PA_FLAG_SHORT: \
32 case PA_CHAR: \
33 (void) va_arg(ap, int); \
34 break; \
35 case PA_INT|PA_FLAG_LONG: \
36 (void) va_arg(ap, long int); \
37 break; \
38 case PA_INT|PA_FLAG_LONG_LONG: \
39 (void) va_arg(ap, long long int); \
40 break; \
41 case PA_WCHAR: \
42 (void) va_arg(ap, wchar_t); \
43 break; \
44 case PA_WSTRING: \
45 case PA_STRING: \
46 case PA_POINTER: \
47 (void) va_arg(ap, void*); \
48 break; \
49 case PA_FLOAT: \
50 case PA_DOUBLE: \
51 (void) va_arg(ap, double); \
52 break; \
53 case PA_DOUBLE|PA_FLAG_LONG_DOUBLE: \
54 (void) va_arg(ap, long double); \
55 break; \
56 default: \
57 assert_not_reached("Unknown format string argument."); \
58 } \
59 } \
60 } while (false)