lib/string/sprintf.h: Add SNPRINTF() macro

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>
This commit is contained in:
Alejandro Colomar
2023-08-26 12:11:59 +02:00
committed by Iker Pedrosa
parent 9c39b13194
commit ce4c4d4ad5
+12
View File
@@ -16,6 +16,18 @@
#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)