From: Yu Watanabe Date: Fri, 31 Oct 2025 13:19:31 +0000 (+0900) Subject: strv: introduce strv_extend_joined() and strv_extend_joined_with_size() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=19bbcd35d71d48cfdea95537802c8a0d97e17be6;p=thirdparty%2Fsystemd.git strv: introduce strv_extend_joined() and strv_extend_joined_with_size() --- diff --git a/src/basic/strv.c b/src/basic/strv.c index 4f61a42114f..a19e05edc3d 100644 --- a/src/basic/strv.c +++ b/src/basic/strv.c @@ -921,6 +921,18 @@ int strv_extendf_with_size(char ***l, size_t *n, const char *format, ...) { return strv_consume_with_size(l, n, x); } +int strv_extend_joined_with_size_sentinel(char ***l, size_t *n, ...) { + va_list ap; + + va_start(ap, n); + char *x = strextendv_with_separator(/* x= */ NULL, /* separator=*/ NULL, ap); + va_end(ap); + if (!x) + return -ENOMEM; + + return strv_consume_with_size(l, n, x); +} + char* startswith_strv(const char *s, char * const *l) { STRV_FOREACH(i, l) { char *found = startswith(s, *i); diff --git a/src/basic/strv.h b/src/basic/strv.h index 11338951584..7b0923a6983 100644 --- a/src/basic/strv.h +++ b/src/basic/strv.h @@ -59,6 +59,10 @@ int strv_extend_many_internal(char ***l, const char *value, ...); int strv_extendf_with_size(char ***l, size_t *n, const char *format, ...) _printf_(3,4); #define strv_extendf(l, ...) strv_extendf_with_size(l, NULL, __VA_ARGS__) +int strv_extend_joined_with_size_sentinel(char ***l, size_t *n, ...) _sentinel_; +#define strv_extend_joined_with_size(l, n, ...) strv_extend_joined_with_size_sentinel(l, n, __VA_ARGS__, NULL) +#define strv_extend_joined(l, ...) strv_extend_joined_with_size(l, NULL, __VA_ARGS__) + int strv_push_with_size(char ***l, size_t *n, char *value); static inline int strv_push(char ***l, char *value) { return strv_push_with_size(l, NULL, value); diff --git a/src/test/test-strv.c b/src/test/test-strv.c index 49558850d61..b3468b1cfac 100644 --- a/src/test/test-strv.c +++ b/src/test/test-strv.c @@ -762,6 +762,30 @@ TEST(strv_extendf_with_size) { ASSERT_STREQ(a[1], "test3 bar foo 128"); } +TEST(strv_extend_joined) { + _cleanup_strv_free_ char **a = NULL; + + ASSERT_OK(strv_extend_joined(&a, "hoge")); + ASSERT_OK(strv_extend_joined(&a, "aaa", "bbb", "ccc")); + + ASSERT_EQ(strv_length(a), 2u); + ASSERT_STREQ(a[0], "hoge"); + ASSERT_STREQ(a[1], "aaabbbccc"); +} + +TEST(strv_extend_joined_with_size) { + _cleanup_strv_free_ char **a = NULL; + size_t n = 0; + + ASSERT_OK(strv_extend_joined_with_size(&a, &n, "hoge")); + ASSERT_OK(strv_extend_joined_with_size(&a, &n, "aaa", "bbb", "ccc")); + + ASSERT_EQ(n, 2u); + ASSERT_EQ(strv_length(a), n); + ASSERT_STREQ(a[0], "hoge"); + ASSERT_STREQ(a[1], "aaabbbccc"); +} + TEST(strv_foreach) { _cleanup_strv_free_ char **a; unsigned i = 0;