// SPDX-FileCopyrightText: 2025, Alejandro Colomar // SPDX-License-Identifier: BSD-3-Clause #ifndef SHADOW_INCLUDE_LIB_STRING_SPRINTF_APRINTF_H_ #define SHADOW_INCLUDE_LIB_STRING_SPRINTF_APRINTF_H_ #include "config.h" #include #include #include #include #include "attr.h" #include "exit_if_null.h" // exit-on-error allocate print formatted #define xaprintf(...) exit_if_null(aprintf(__VA_ARGS__)) ATTR_MALLOC(free) format_attr(printf, 1, 2) inline char *aprintf(const char *restrict fmt, ...); ATTR_MALLOC(free) format_attr(printf, 1, 0) inline char *vaprintf(const char *restrict fmt, va_list ap); // allocate print formatted // Like asprintf(3), but simpler; omit the length. inline char * aprintf(const char *restrict fmt, ...) { char *p; va_list ap; va_start(ap, fmt); p = vaprintf(fmt, ap); va_end(ap); return p; } // Like vasprintf(3), but simpler; omit the length. inline char * vaprintf(const char *restrict fmt, va_list ap) { char *p; if (vasprintf(&p, fmt, ap) == -1) return NULL; return p; } #endif // include guard