string-util: introduce strextendv_with_separator()

This commit is contained in:
Yu Watanabe
2025-10-31 22:08:35 +09:00
parent 3c66f40262
commit 69350ee3e3
2 changed files with 18 additions and 8 deletions

View 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;

View 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)