]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
string-util: introduce strextendv_with_separator()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 31 Oct 2025 13:08:35 +0000 (22:08 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 31 Oct 2025 15:58:42 +0000 (00:58 +0900)
src/basic/string-util.c
src/basic/string-util.h

index 425f9742375a9511b8fd2c45af64b5b2ba05d7fc..0fe72342c7feefd0377ca6539410706b62ab3740 100644 (file)
@@ -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;
index 79e87c89140e07dac42b62c69b44804afa62af04..c90134e5cd7eb0269aa4b140faba4b39d672dd6f 100644 (file)
@@ -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)