diff options
author | Thomas Haller <thaller@redhat.com> | 2022-07-29 10:54:01 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2022-09-29 15:49:10 +0200 |
commit | 6c2c3fdfccd320e883c31b34ebe14564105a5e3d (patch) | |
tree | 1457deba7bf61ffe20173e6a336911523e322efb | |
parent | c744607c60187ebecfa20fb549b51f72cb7ee50e (diff) | |
download | NetworkManager-6c2c3fdfccd320e883c31b34ebe14564105a5e3d.tar.gz |
glib-aux: add nm_str_buf_append_printfv()
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1321
(cherry picked from commit d5b31a05e637dd5e37e8754abfb958ead5e25773)
-rw-r--r-- | src/libnm-glib-aux/nm-shared-utils.c | 16 | ||||
-rw-r--r-- | src/libnm-glib-aux/nm-str-buf.h | 22 |
2 files changed, 29 insertions, 9 deletions
diff --git a/src/libnm-glib-aux/nm-shared-utils.c b/src/libnm-glib-aux/nm-shared-utils.c index 0f5d782e99..70db29f2b1 100644 --- a/src/libnm-glib-aux/nm-shared-utils.c +++ b/src/libnm-glib-aux/nm-shared-utils.c @@ -5879,9 +5879,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; @@ -5891,12 +5891,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); @@ -5911,9 +5911,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); diff --git a/src/libnm-glib-aux/nm-str-buf.h b/src/libnm-glib-aux/nm-str-buf.h index 9a3c5baf42..652bc96b25 100644 --- a/src/libnm-glib-aux/nm-str-buf.h +++ b/src/libnm-glib-aux/nm-str-buf.h @@ -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) |