From: Yu Watanabe Date: Fri, 31 Oct 2025 12:57:37 +0000 (+0900) Subject: strv: introduce strv_extendf_with_size() X-Git-Tag: v259-rc1~203^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3c66f40262c5e2e1be916ced122a1e03107b430a;p=thirdparty%2Fsystemd.git strv: introduce strv_extendf_with_size() --- diff --git a/src/basic/strv.c b/src/basic/strv.c index 37f4bd44f3f..4f61a42114f 100644 --- a/src/basic/strv.c +++ b/src/basic/strv.c @@ -906,7 +906,7 @@ void strv_print_full(char * const *l, const char *prefix) { printf("%s%s\n", strempty(prefix), *s); } -int strv_extendf(char ***l, const char *format, ...) { +int strv_extendf_with_size(char ***l, size_t *n, const char *format, ...) { va_list ap; char *x; int r; @@ -918,7 +918,7 @@ int strv_extendf(char ***l, const char *format, ...) { if (r < 0) return -ENOMEM; - return strv_consume(l, x); + return strv_consume_with_size(l, n, x); } char* startswith_strv(const char *s, char * const *l) { diff --git a/src/basic/strv.h b/src/basic/strv.h index b358ab4c2b8..11338951584 100644 --- a/src/basic/strv.h +++ b/src/basic/strv.h @@ -56,7 +56,8 @@ static inline int strv_extend(char ***l, const char *value) { int strv_extend_many_internal(char ***l, const char *value, ...); #define strv_extend_many(l, ...) strv_extend_many_internal(l, __VA_ARGS__, POINTER_MAX) -int strv_extendf(char ***l, const char *format, ...) _printf_(2,3); +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_push_with_size(char ***l, size_t *n, char *value); static inline int strv_push(char ***l, char *value) { diff --git a/src/test/test-strv.c b/src/test/test-strv.c index 88505993cdd..49558850d61 100644 --- a/src/test/test-strv.c +++ b/src/test/test-strv.c @@ -749,6 +749,19 @@ TEST(strv_extendf) { ASSERT_STREQ(b[0], "test3 bar foo 128"); } +TEST(strv_extendf_with_size) { + _cleanup_strv_free_ char **a = NULL; + size_t n = 0; + + ASSERT_OK(strv_extendf_with_size(&a, &n, "test2 %s %d %s", "foo", 128, "bar")); + ASSERT_OK(strv_extendf_with_size(&a, &n, "test3 %s %s %d", "bar", "foo", 128)); + + ASSERT_EQ(n, 2u); + ASSERT_EQ(strv_length(a), n); + ASSERT_STREQ(a[0], "test2 foo 128 bar"); + ASSERT_STREQ(a[1], "test3 bar foo 128"); +} + TEST(strv_foreach) { _cleanup_strv_free_ char **a; unsigned i = 0;