Merge branch 'km/config-grammofix'
[git] / t / helper / test-string-list.c
1 #include "cache.h"
2 #include "string-list.h"
3
4 /*
5  * Parse an argument into a string list.  arg should either be a
6  * ':'-separated list of strings, or "-" to indicate an empty string
7  * list (as opposed to "", which indicates a string list containing a
8  * single empty string).  list->strdup_strings must be set.
9  */
10 static void parse_string_list(struct string_list *list, const char *arg)
11 {
12         if (!strcmp(arg, "-"))
13                 return;
14
15         (void)string_list_split(list, arg, ':', -1);
16 }
17
18 static void write_list(const struct string_list *list)
19 {
20         int i;
21         for (i = 0; i < list->nr; i++)
22                 printf("[%d]: \"%s\"\n", i, list->items[i].string);
23 }
24
25 static void write_list_compact(const struct string_list *list)
26 {
27         int i;
28         if (!list->nr)
29                 printf("-\n");
30         else {
31                 printf("%s", list->items[0].string);
32                 for (i = 1; i < list->nr; i++)
33                         printf(":%s", list->items[i].string);
34                 printf("\n");
35         }
36 }
37
38 static int prefix_cb(struct string_list_item *item, void *cb_data)
39 {
40         const char *prefix = (const char *)cb_data;
41         return starts_with(item->string, prefix);
42 }
43
44 int cmd_main(int argc, const char **argv)
45 {
46         if (argc == 5 && !strcmp(argv[1], "split")) {
47                 struct string_list list = STRING_LIST_INIT_DUP;
48                 int i;
49                 const char *s = argv[2];
50                 int delim = *argv[3];
51                 int maxsplit = atoi(argv[4]);
52
53                 i = string_list_split(&list, s, delim, maxsplit);
54                 printf("%d\n", i);
55                 write_list(&list);
56                 string_list_clear(&list, 0);
57                 return 0;
58         }
59
60         if (argc == 5 && !strcmp(argv[1], "split_in_place")) {
61                 struct string_list list = STRING_LIST_INIT_NODUP;
62                 int i;
63                 char *s = xstrdup(argv[2]);
64                 int delim = *argv[3];
65                 int maxsplit = atoi(argv[4]);
66
67                 i = string_list_split_in_place(&list, s, delim, maxsplit);
68                 printf("%d\n", i);
69                 write_list(&list);
70                 string_list_clear(&list, 0);
71                 free(s);
72                 return 0;
73         }
74
75         if (argc == 4 && !strcmp(argv[1], "filter")) {
76                 /*
77                  * Retain only the items that have the specified prefix.
78                  * Arguments: list|- prefix
79                  */
80                 struct string_list list = STRING_LIST_INIT_DUP;
81                 const char *prefix = argv[3];
82
83                 parse_string_list(&list, argv[2]);
84                 filter_string_list(&list, 0, prefix_cb, (void *)prefix);
85                 write_list_compact(&list);
86                 string_list_clear(&list, 0);
87                 return 0;
88         }
89
90         if (argc == 3 && !strcmp(argv[1], "remove_duplicates")) {
91                 struct string_list list = STRING_LIST_INIT_DUP;
92
93                 parse_string_list(&list, argv[2]);
94                 string_list_remove_duplicates(&list, 0);
95                 write_list_compact(&list);
96                 string_list_clear(&list, 0);
97                 return 0;
98         }
99
100         if (argc == 2 && !strcmp(argv[1], "sort")) {
101                 struct string_list list = STRING_LIST_INIT_NODUP;
102                 struct strbuf sb = STRBUF_INIT;
103                 struct string_list_item *item;
104
105                 strbuf_read(&sb, 0, 0);
106
107                 /*
108                  * Split by newline, but don't create a string_list item
109                  * for the empty string after the last separator.
110                  */
111                 if (sb.buf[sb.len - 1] == '\n')
112                         strbuf_setlen(&sb, sb.len - 1);
113                 string_list_split_in_place(&list, sb.buf, '\n', -1);
114
115                 string_list_sort(&list);
116
117                 for_each_string_list_item(item, &list)
118                         puts(item->string);
119
120                 string_list_clear(&list, 0);
121                 strbuf_release(&sb);
122                 return 0;
123         }
124
125         fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
126                 argv[1] ? argv[1] : "(there was none)");
127         return 1;
128 }