It wraps snprintf(3) so that it performs some steps that one might
forget, or might be prone to accidents:
- It calculates the size of the destination buffer, and makes sure it's
an array (otherwise, using sizeof(s) would be very bad).
- It calculates if there's truncation or an error, returning -1 if so.
BTW, this macro doesn't have any issues of double evaluation, because
sizeof() doesn't evaluate its argument (unless it's a VLA, but then the
static_assert(3) within NITEMS() makes sure VLAs are not allowed).
This macro is very similar to STRTCPY(), defined in
<lib/string/strtcpy.h>.
Signed-off-by: Alejandro Colomar <alx@kernel.org>
#include "attr.h"
#include "defines.h"
+#include "sizeof.h"
+
+
+#define SNPRINTF(s, fmt, ...) \
+({ \
+ size_t sz_, len_; \
+ \
+ sz_ = NITEMS(s); \
+ len_ = snprintf(s, sz_, fmt __VA_OPT__(,) __VA_ARGS__); \
+ \
+ (len_ >= sz_) ? -1 : len_; \
+})
format_attr(printf, 2, 3)