]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/stdio-util.h
54640314346c724886eda347f990be588b7d0ff7
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
10 static inline char* snprintf_ok(char *buf
, size_t len
, const char *format
, ...) {
15 r
= vsnprintf(buf
, len
, format
, ap
);
18 return r
>= 0 && (size_t) r
< len
? buf
: NULL
;
21 #define xsprintf(buf, fmt, ...) \
22 assert_message_se(snprintf_ok(buf, ELEMENTSOF(buf), fmt, ##__VA_ARGS__), "xsprintf: " #buf "[] must be big enough")
24 #define VA_FORMAT_ADVANCE(format, ap) \
28 /* See https://github.com/google/sanitizers/issues/992 */ \
29 if (HAS_FEATURE_MEMORY_SANITIZER) \
30 memset(_argtypes, 0, sizeof(_argtypes)); \
31 _k = parse_printf_format((format), ELEMENTSOF(_argtypes), _argtypes); \
32 assert(_k < ELEMENTSOF(_argtypes)); \
33 for (_i = 0; _i < _k; _i++) { \
34 if (_argtypes[_i] & PA_FLAG_PTR) { \
35 (void) va_arg(ap, void*); \
39 switch (_argtypes[_i]) { \
41 case PA_INT|PA_FLAG_SHORT: \
43 (void) va_arg(ap, int); \
45 case PA_INT|PA_FLAG_LONG: \
46 (void) va_arg(ap, long int); \
48 case PA_INT|PA_FLAG_LONG_LONG: \
49 (void) va_arg(ap, long long int); \
52 (void) va_arg(ap, wchar_t); \
57 (void) va_arg(ap, void*); \
61 (void) va_arg(ap, double); \
63 case PA_DOUBLE|PA_FLAG_LONG_DOUBLE: \
64 (void) va_arg(ap, long double); \
67 assert_not_reached(); \