glib-aux: add nm_str_buf_append_printfv()

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

View file

@ -5907,9 +5907,9 @@ _nm_str_buf_ensure_size(NMStrBuf *strbuf, gsize new_size, gboolean reserve_exact
}
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;
int l;
@ -5919,12 +5919,12 @@ nm_str_buf_append_printf(NMStrBuf *strbuf, const char *format, ...)
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,
available,
format,
args);
va_end(args);
args_copy);
va_end(args_copy);
nm_assert(l >= 0);
nm_assert(l < G_MAXINT);
@ -5939,9 +5939,9 @@ nm_str_buf_append_printf(NMStrBuf *strbuf, const char *format, ...)
nm_str_buf_maybe_expand(strbuf, l2, FALSE);
va_start(args, format);
l = g_vsnprintf(&strbuf->_priv_str[strbuf->_priv_len], l2, format, args);
va_end(args);
va_copy(args_copy, args);
l = g_vsnprintf(&strbuf->_priv_str[strbuf->_priv_len], l2, format, args_copy);
va_end(args_copy);
nm_assert(l >= 0);
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));
}
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
nm_str_buf_ensure_trailing_c(NMStrBuf *strbuf, char ch)