string-list: optionally omit empty string pieces in string_list_split*()

Teach the unified split_string() machinery a new flag bit,
STRING_LIST_SPLIT_NONEMPTY, to cause empty split pieces to be
omitted from the resulting string list.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
main
Junio C Hamano 2025-08-01 15:04:22 -07:00
parent f3a303aef0
commit 27531efa41
3 changed files with 20 additions and 0 deletions

View File

@ -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);

View File

@ -289,6 +289,8 @@ enum {
* it to the list
*/
STRING_LIST_SPLIT_TRIM = (1 << 0),
/* omit adding empty string piece to the resulting list */
STRING_LIST_SPLIT_NONEMPTY = (1 << 1),
};

int string_list_split_f(struct string_list *, const char *string,

View File

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