[PATCH v2 6/7] string-list: optionally omit empty string pieces in string_list_split*()
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jul 31, 2025, 22:46 UTC
- Message-ID
- <20250731224607.3942417-7-gitster@pobox.com>
- In-Reply-To
- <20250731224607.3942417-1-gitster@pobox.com>
Teach the unified split_string() machinery a new flag bit, STRING_LIST_SPLIT_NONEMPTY, to cause empty split pieces omitted from the resulting string list.
Signed-off-by: Junio C Hamano <gitster@pobox.com> --- string-list.c | 3 +++ string-list.h | 3 +++ t/unit-tests/u-string-list.c | 15 +++++++++++++++ 3 files changed, 21 insertions(+)
diff --git a/string-list.c b/string-list.c index 86a309f8fb..343cf1ca90 100644 --- a/string-list.c +++ b/string-list.c @@ -294,6 +294,9 @@ static int append_one(struct string_list *list, break; } + if ((flags & STRING_LIST_SPLIT_NONEMPTY) && (end <= p)) + return 0; + if (in_place) { *((char *)end) = '\0'; string_list_append(list, p); diff --git a/string-list.h b/string-list.h index ee9922af67..0f73064fd1 100644 --- a/string-list.h +++ b/string-list.h @@ -285,6 +285,9 @@ int string_list_split_in_place(struct string_list *list, char *string, /* trim() resulting string piece before adding it to the list */ #define STRING_LIST_SPLIT_TRIM 01 +/* omit adding empty string piece to the resulting list */ +#define STRING_LIST_SPLIT_NONEMPTY 02 + int string_list_split_f(struct string_list *, const char *string, const char *delim, int maxsplit, unsigned flags); diff --git a/t/unit-tests/u-string-list.c b/t/unit-tests/u-string-list.c index daa9307e45..a2457d7b1e 100644 --- a/t/unit-tests/u-string-list.c +++ b/t/unit-tests/u-string-list.c @@ -92,6 +92,13 @@ void test_string_list__split_f(void) "foo", "bar", "baz", NULL); t_string_list_split_f(" a b c ", " ", 1, STRING_LIST_SPLIT_TRIM, "a", "b c", NULL); + t_string_list_split_f("::foo::bar:baz:", ":", -1, STRING_LIST_SPLIT_NONEMPTY, + "foo", "bar", "baz", NULL); + t_string_list_split_f("foo:baz", ":", -1, STRING_LIST_SPLIT_NONEMPTY, + "foo", "baz", NULL); + t_string_list_split_f("foo :: : baz", ":", -1, + STRING_LIST_SPLIT_NONEMPTY | STRING_LIST_SPLIT_TRIM, + "foo", "baz", NULL); } static void t_string_list_split_in_place_f(const char *data_, const char *delim, @@ -125,6 +132,14 @@ void test_string_list__split_in_place_f(void) "foo", "bar", "baz", NULL); t_string_list_split_in_place_f(" a b c ", " ", 1, STRING_LIST_SPLIT_TRIM, "a", "b c", NULL); + t_string_list_split_in_place_f("::foo::bar:baz:", ":", -1, + STRING_LIST_SPLIT_NONEMPTY, + "foo", "bar", "baz", NULL); + t_string_list_split_in_place_f("foo:baz", ":", -1, STRING_LIST_SPLIT_NONEMPTY, + "foo", "baz", NULL); + t_string_list_split_in_place_f("foo :: : baz", ":", -1, + STRING_LIST_SPLIT_NONEMPTY | STRING_LIST_SPLIT_TRIM, + "foo", "baz", NULL); } void test_string_list__split(void)
-- 2.50.1-618-g45d530d26b