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:
committed by
Iker Pedrosa
parent
9c39b13194
commit
ce4c4d4ad5
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user