glib-aux: add nm_str_buf_append_printfv()

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1321
(cherry picked from commit d5b31a05e6)
(cherry picked from commit 6c2c3fdfcc)
This commit is contained in:
Thomas Haller 2022-07-29 10:54:01 +02:00
parent dfbdf3d477
commit bfcc6a7537
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
2 changed files with 29 additions and 9 deletions

View file

@ -5828,9 +5828,9 @@ _nm_str_buf_ensure_size(NMStrBuf *strbuf, gsize new_size, gboolean reserve_exact
} }
void void
nm_str_buf_append_printf(NMStrBuf *strbuf, const char *format, ...) nm_str_buf_append_printfv(NMStrBuf *strbuf, const char *format, va_list args)
{ {
va_list args; va_list args_copy;
gsize available; gsize available;
int l; int l;
@ -5840,12 +5840,12 @@ nm_str_buf_append_printf(NMStrBuf *strbuf, const char *format, ...)
nm_assert(available < G_MAXULONG); nm_assert(available < G_MAXULONG);
va_start(args, format); va_copy(args_copy, args);
l = g_vsnprintf(strbuf->_priv_allocated > 0 ? &strbuf->_priv_str[strbuf->_priv_len] : NULL, l = g_vsnprintf(strbuf->_priv_allocated > 0 ? &strbuf->_priv_str[strbuf->_priv_len] : NULL,
available, available,
format, format,
args); args_copy);
va_end(args); va_end(args_copy);
nm_assert(l >= 0); nm_assert(l >= 0);
nm_assert(l < G_MAXINT); nm_assert(l < G_MAXINT);
@ -5860,9 +5860,9 @@ nm_str_buf_append_printf(NMStrBuf *strbuf, const char *format, ...)
nm_str_buf_maybe_expand(strbuf, l2, FALSE); nm_str_buf_maybe_expand(strbuf, l2, FALSE);
va_start(args, format); va_copy(args_copy, args);
l = g_vsnprintf(&strbuf->_priv_str[strbuf->_priv_len], l2, format, args); l = g_vsnprintf(&strbuf->_priv_str[strbuf->_priv_len], l2, format, args_copy);
va_end(args); va_end(args_copy);
nm_assert(l >= 0); nm_assert(l >= 0);
nm_assert((gsize) l == l2 - 1u); nm_assert((gsize) l == l2 - 1u);

View file

@ -291,7 +291,27 @@ nm_str_buf_append0(NMStrBuf *strbuf, const char *str)
return nm_str_buf_append_len0(strbuf, str, strlen(str)); return nm_str_buf_append_len0(strbuf, str, strlen(str));
} }
void nm_str_buf_append_printf(NMStrBuf *strbuf, const char *format, ...) _nm_printf(2, 3); void nm_str_buf_append_printfv(NMStrBuf *strbuf, const char *format, va_list args) _nm_printf(2, 0);
/* Warning, this is not a function-like macro. That is, you must
* evaluate it in a place where you would otherwise call va_start(). */
#define nm_str_buf_append_printfv_eval(strbuf, format, va_start_last) \
({ \
NMStrBuf *const _strbuf = (strbuf); \
va_list _ap; \
\
va_start(_ap, (va_start_last)); \
nm_str_buf_append_printfv(_strbuf, (format), _ap); \
va_end(_ap); \
\
_strbuf; \
})
static inline void _nm_printf(2, 3)
nm_str_buf_append_printf(NMStrBuf *strbuf, const char *format, ...)
{
nm_str_buf_append_printfv_eval(strbuf, format, format);
}
static inline void static inline void
nm_str_buf_ensure_trailing_c(NMStrBuf *strbuf, char ch) nm_str_buf_ensure_trailing_c(NMStrBuf *strbuf, char ch)