From: Yu Watanabe Date: Fri, 31 Oct 2025 13:08:35 +0000 (+0900) Subject: string-util: introduce strextendv_with_separator() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=69350ee3e34a7fb8f39e3963eec2bc7ae2d4bf55;p=thirdparty%2Fsystemd.git string-util: introduce strextendv_with_separator() --- diff --git a/src/basic/string-util.c b/src/basic/string-util.c index 425f9742375..0fe72342c7f 100644 --- a/src/basic/string-util.c +++ b/src/basic/string-util.c @@ -793,12 +793,11 @@ char* strip_tab_ansi(char **ibuf, size_t *_isz, size_t highlight[2]) { return *ibuf; } -char* strextend_with_separator_internal(char **x, const char *separator, ...) { +char* strextendv_with_separator(char **x, const char *separator, va_list ap) { _cleanup_free_ char *buffer = NULL; size_t f, l, l_separator; bool need_separator; char *nr, *p; - va_list ap; if (!x) x = &buffer; @@ -808,11 +807,12 @@ char* strextend_with_separator_internal(char **x, const char *separator, ...) { need_separator = !isempty(*x); l_separator = strlen_ptr(separator); - va_start(ap, separator); + va_list aq; + va_copy(aq, ap); for (const char *t;;) { size_t n; - t = va_arg(ap, const char *); + t = va_arg(aq, const char *); if (!t) break; if (t == POINTER_MAX) @@ -824,14 +824,14 @@ char* strextend_with_separator_internal(char **x, const char *separator, ...) { n += l_separator; if (n >= SIZE_MAX - l) { - va_end(ap); + va_end(aq); return NULL; } l += n; need_separator = true; } - va_end(ap); + va_end(aq); need_separator = !isempty(*x); @@ -842,7 +842,6 @@ char* strextend_with_separator_internal(char **x, const char *separator, ...) { *x = nr; p = nr + f; - va_start(ap, separator); for (;;) { const char *t; @@ -859,7 +858,6 @@ char* strextend_with_separator_internal(char **x, const char *separator, ...) { need_separator = true; } - va_end(ap); assert(p == nr + l); *p = 0; @@ -872,6 +870,17 @@ char* strextend_with_separator_internal(char **x, const char *separator, ...) { return p; } +char* strextend_with_separator_internal(char **x, const char *separator, ...) { + va_list ap; + char *ret; + + va_start(ap, separator); + ret = strextendv_with_separator(x, separator, ap); + va_end(ap); + + return ret; +} + int strextendf_with_separator(char **x, const char *separator, const char *format, ...) { size_t m, a, l_separator; va_list ap; diff --git a/src/basic/string-util.h b/src/basic/string-util.h index 79e87c89140..c90134e5cd7 100644 --- a/src/basic/string-util.h +++ b/src/basic/string-util.h @@ -169,6 +169,7 @@ char* strreplace(const char *text, const char *old_string, const char *new_strin char* strip_tab_ansi(char **ibuf, size_t *_isz, size_t highlight[2]); +char* strextendv_with_separator(char **x, const char *separator, va_list ap); char* strextend_with_separator_internal(char **x, const char *separator, ...) _sentinel_; #define strextend_with_separator(x, separator, ...) strextend_with_separator_internal(x, separator, __VA_ARGS__, NULL) #define strextend(x, ...) strextend_with_separator_internal(x, NULL, __VA_ARGS__, NULL)