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;
}
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);
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 *);
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;
}
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, ...) \
({ \