summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2022-07-29 10:54:01 +0200
committerThomas Haller <thaller@redhat.com>2022-09-29 15:49:10 +0200
commit6c2c3fdfccd320e883c31b34ebe14564105a5e3d (patch)
tree1457deba7bf61ffe20173e6a336911523e322efb
parentc744607c60187ebecfa20fb549b51f72cb7ee50e (diff)
downloadNetworkManager-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.c16
-rw-r--r--src/libnm-glib-aux/nm-str-buf.h22
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)