diff options
author | Michael Haggerty <mhagger@alum.mit.edu> | 2012-09-12 16:04:44 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-09-12 11:43:25 -0700 |
commit | eb5f0c7a616531a024a582b72ca6d8775ff98d46 (patch) | |
tree | 1c791a163140cb2988c7d2049ce706ad93e0c23d /test-string-list.c | |
parent | ff919f965d20d003e3882c70de667f41a86349ac (diff) | |
download | git-eb5f0c7a616531a024a582b72ca6d8775ff98d46.tar.gz git-eb5f0c7a616531a024a582b72ca6d8775ff98d46.tar.xz |
string_list: add a new function, filter_string_list()
This function allows entries that don't match a specified criterion to
be discarded from a string_list while preserving the order of the
remaining entries.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'test-string-list.c')
-rw-r--r-- | test-string-list.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/test-string-list.c b/test-string-list.c index cdc3cf3a7..702276c1f 100644 --- a/test-string-list.c +++ b/test-string-list.c @@ -1,6 +1,20 @@ #include "cache.h" #include "string-list.h" +/* + * Parse an argument into a string list. arg should either be a + * ':'-separated list of strings, or "-" to indicate an empty string + * list (as opposed to "", which indicates a string list containing a + * single empty string). list->strdup_strings must be set. + */ +void parse_string_list(struct string_list *list, const char *arg) +{ + if (!strcmp(arg, "-")) + return; + + (void)string_list_split(list, arg, ':', -1); +} + void write_list(const struct string_list *list) { int i; @@ -8,6 +22,25 @@ void write_list(const struct string_list *list) printf("[%d]: \"%s\"\n", i, list->items[i].string); } +void write_list_compact(const struct string_list *list) +{ + int i; + if (!list->nr) + printf("-\n"); + else { + printf("%s", list->items[0].string); + for (i = 1; i < list->nr; i++) + printf(":%s", list->items[i].string); + printf("\n"); + } +} + +int prefix_cb(struct string_list_item *item, void *cb_data) +{ + const char *prefix = (const char *)cb_data; + return !prefixcmp(item->string, prefix); +} + int main(int argc, char **argv) { if (argc == 5 && !strcmp(argv[1], "split")) { @@ -39,6 +72,21 @@ int main(int argc, char **argv) return 0; } + if (argc == 4 && !strcmp(argv[1], "filter")) { + /* + * Retain only the items that have the specified prefix. + * Arguments: list|- prefix + */ + struct string_list list = STRING_LIST_INIT_DUP; + const char *prefix = argv[3]; + + parse_string_list(&list, argv[2]); + filter_string_list(&list, 0, prefix_cb, (void *)prefix); + write_list_compact(&list); + string_list_clear(&list, 0); + return 0; + } + fprintf(stderr, "%s: unknown function name: %s\n", argv[0], argv[1] ? argv[1] : "(there was none)"); return 1; |