]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
string-util: make strjoin() just a special case of strextend()
authorLennart Poettering <lennart@poettering.net>
Wed, 15 Jan 2025 08:31:35 +0000 (09:31 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 15 Jan 2025 09:51:53 +0000 (10:51 +0100)
The functions are very similar, let's make them the same. If the first
argument to strextend() is NULL instead of extending a string we'll
allocate a fresh one and return that.

src/basic/string-util.c
src/basic/string-util.h

index 5621ffc768fd2d1738f0fe6d558ed8a6453a2e97..5e4f57a5b138da073d17661f5d29fe2765505f84 100644 (file)
@@ -77,38 +77,6 @@ char* strnappend(const char *s, const char *suffix, size_t b) {
         return r;
 }
 
-char* strjoin_real(const char *x, ...) {
-        va_list ap;
-        size_t l = 1;
-        char *r, *p;
-
-        va_start(ap, x);
-        for (const char *t = x; t; t = va_arg(ap, const char *)) {
-                size_t n;
-
-                n = strlen(t);
-                if (n > SIZE_MAX - l) {
-                        va_end(ap);
-                        return NULL;
-                }
-                l += n;
-        }
-        va_end(ap);
-
-        p = r = new(char, l);
-        if (!r)
-                return NULL;
-
-        va_start(ap, x);
-        for (const char *t = x; t; t = va_arg(ap, const char *))
-                p = stpcpy(p, t);
-        va_end(ap);
-
-        *p = 0;
-
-        return r;
-}
-
 char* strstrip(char *s) {
         if (!s)
                 return NULL;
@@ -843,12 +811,14 @@ char* strip_tab_ansi(char **ibuf, size_t *_isz, size_t highlight[2]) {
 }
 
 char* strextend_with_separator_internal(char **x, const char *separator, ...) {
+        _cleanup_free_ char *buffer = NULL;
         size_t f, l, l_separator;
         bool need_separator;
         char *nr, *p;
         va_list ap;
 
-        assert(x);
+        if (!x)
+                x = &buffer;
 
         l = f = strlen_ptr(*x);
 
@@ -856,8 +826,7 @@ char* strextend_with_separator_internal(char **x, const char *separator, ...) {
         l_separator = strlen_ptr(separator);
 
         va_start(ap, separator);
-        for (;;) {
-                const char *t;
+        for (const char *t;;) {
                 size_t n;
 
                 t = va_arg(ap, const char *);
@@ -906,9 +875,13 @@ char* strextend_with_separator_internal(char **x, const char *separator, ...) {
         va_end(ap);
 
         assert(p == nr + l);
-
         *p = 0;
 
+        /* If no buffer to extend was passed in return the start of the buffer */
+        if (buffer)
+                return TAKE_PTR(buffer);
+
+        /* Otherwise we extended the buffer: return the end */
         return p;
 }
 
index a1592b6e6db458c765b08ebd31e10331efd2cf99..1bcb1c40e320dabc5d7f4e32034d8758eb87ee42 100644 (file)
@@ -108,8 +108,7 @@ char* first_word(const char *s, const char *word) _pure_;
 
 char* strnappend(const char *s, const char *suffix, size_t length);
 
-char* strjoin_real(const char *x, ...) _sentinel_;
-#define strjoin(a, ...) strjoin_real((a), __VA_ARGS__, NULL)
+#define strjoin(a, ...) strextend_with_separator_internal(NULL, NULL, a, __VA_ARGS__, NULL)
 
 #define strjoina(a, ...)                                                \
         ({                                                              \