Skip to content

Commit 818618c

Browse files
committed
Merge branch 'sj/string-list-typefix' into seen
Code and test clean-up around string-list API. Comments? * sj/string-list-typefix: u-string-list: move "remove duplicates" test to "u-string-list.c" u-string-list: move "filter string" test to "u-string-list.c" u-string-list: move "test_split_in_place" to "u-string-list.c" u-string-list: move "test_split" into "u-string-list.c" string-list: enable sign compare warnings check string-list: return index directly when inserting an existing element string-list: remove unused "insert_at" parameter from add_entry string-list: fix sign compare warnings for loop iterator
2 parents 604e1f0 + 641cbf0 commit 818618c

File tree

6 files changed

+255
-267
lines changed

6 files changed

+255
-267
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1374,6 +1374,7 @@ CLAR_TEST_SUITES += u-reftable-table
13741374
CLAR_TEST_SUITES += u-reftable-tree
13751375
CLAR_TEST_SUITES += u-strbuf
13761376
CLAR_TEST_SUITES += u-strcmp-offset
1377+
CLAR_TEST_SUITES += u-string-list
13771378
CLAR_TEST_SUITES += u-strvec
13781379
CLAR_TEST_SUITES += u-trailer
13791380
CLAR_TEST_SUITES += u-urlmatch-normalization

string-list.c

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#define DISABLE_SIGN_COMPARE_WARNINGS
2-
31
#include "git-compat-util.h"
42
#include "string-list.h"
53

@@ -17,19 +15,19 @@ void string_list_init_dup(struct string_list *list)
1715

1816
/* if there is no exact match, point to the index where the entry could be
1917
* inserted */
20-
static int get_entry_index(const struct string_list *list, const char *string,
21-
int *exact_match)
18+
static size_t get_entry_index(const struct string_list *list, const char *string,
19+
int *exact_match)
2220
{
23-
int left = -1, right = list->nr;
21+
size_t left = 0, right = list->nr;
2422
compare_strings_fn cmp = list->cmp ? list->cmp : strcmp;
2523

26-
while (left + 1 < right) {
27-
int middle = left + (right - left) / 2;
24+
while (left < right) {
25+
size_t middle = left + (right - left) / 2;
2826
int compare = cmp(string, list->items[middle].string);
2927
if (compare < 0)
3028
right = middle;
3129
else if (compare > 0)
32-
left = middle;
30+
left = middle + 1;
3331
else {
3432
*exact_match = 1;
3533
return middle;
@@ -40,14 +38,13 @@ static int get_entry_index(const struct string_list *list, const char *string,
4038
return right;
4139
}
4240

43-
/* returns -1-index if already exists */
44-
static int add_entry(int insert_at, struct string_list *list, const char *string)
41+
static size_t add_entry(struct string_list *list, const char *string)
4542
{
4643
int exact_match = 0;
47-
int index = insert_at != -1 ? insert_at : get_entry_index(list, string, &exact_match);
44+
size_t index = get_entry_index(list, string, &exact_match);
4845

4946
if (exact_match)
50-
return -1 - index;
47+
return index;
5148

5249
ALLOC_GROW(list->items, list->nr+1, list->alloc);
5350
if (index < list->nr)
@@ -63,10 +60,7 @@ static int add_entry(int insert_at, struct string_list *list, const char *string
6360

6461
struct string_list_item *string_list_insert(struct string_list *list, const char *string)
6562
{
66-
int index = add_entry(-1, list, string);
67-
68-
if (index < 0)
69-
index = -1 - index;
63+
size_t index = add_entry(list, string);
7064

7165
return list->items + index;
7266
}
@@ -116,9 +110,9 @@ struct string_list_item *string_list_lookup(struct string_list *list, const char
116110
void string_list_remove_duplicates(struct string_list *list, int free_util)
117111
{
118112
if (list->nr > 1) {
119-
int src, dst;
113+
size_t dst = 1;
120114
compare_strings_fn cmp = list->cmp ? list->cmp : strcmp;
121-
for (src = dst = 1; src < list->nr; src++) {
115+
for (size_t src = 1; src < list->nr; src++) {
122116
if (!cmp(list->items[dst - 1].string, list->items[src].string)) {
123117
if (list->strdup_strings)
124118
free(list->items[src].string);
@@ -134,8 +128,8 @@ void string_list_remove_duplicates(struct string_list *list, int free_util)
134128
int for_each_string_list(struct string_list *list,
135129
string_list_each_func_t fn, void *cb_data)
136130
{
137-
int i, ret = 0;
138-
for (i = 0; i < list->nr; i++)
131+
int ret = 0;
132+
for (size_t i = 0; i < list->nr; i++)
139133
if ((ret = fn(&list->items[i], cb_data)))
140134
break;
141135
return ret;
@@ -144,8 +138,8 @@ int for_each_string_list(struct string_list *list,
144138
void filter_string_list(struct string_list *list, int free_util,
145139
string_list_each_func_t want, void *cb_data)
146140
{
147-
int src, dst = 0;
148-
for (src = 0; src < list->nr; src++) {
141+
size_t dst = 0;
142+
for (size_t src = 0; src < list->nr; src++) {
149143
if (want(&list->items[src], cb_data)) {
150144
list->items[dst++] = list->items[src];
151145
} else {
@@ -171,13 +165,12 @@ void string_list_remove_empty_items(struct string_list *list, int free_util)
171165
void string_list_clear(struct string_list *list, int free_util)
172166
{
173167
if (list->items) {
174-
int i;
175168
if (list->strdup_strings) {
176-
for (i = 0; i < list->nr; i++)
169+
for (size_t i = 0; i < list->nr; i++)
177170
free(list->items[i].string);
178171
}
179172
if (free_util) {
180-
for (i = 0; i < list->nr; i++)
173+
for (size_t i = 0; i < list->nr; i++)
181174
free(list->items[i].util);
182175
}
183176
free(list->items);
@@ -189,13 +182,12 @@ void string_list_clear(struct string_list *list, int free_util)
189182
void string_list_clear_func(struct string_list *list, string_list_clear_func_t clearfunc)
190183
{
191184
if (list->items) {
192-
int i;
193185
if (clearfunc) {
194-
for (i = 0; i < list->nr; i++)
186+
for (size_t i = 0; i < list->nr; i++)
195187
clearfunc(list->items[i].util, list->items[i].string);
196188
}
197189
if (list->strdup_strings) {
198-
for (i = 0; i < list->nr; i++)
190+
for (size_t i = 0; i < list->nr; i++)
199191
free(list->items[i].string);
200192
}
201193
free(list->items);

t/helper/test-string-list.c

Lines changed: 0 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,105 +1,9 @@
1-
#define DISABLE_SIGN_COMPARE_WARNINGS
2-
31
#include "test-tool.h"
42
#include "strbuf.h"
53
#include "string-list.h"
64

7-
/*
8-
* Parse an argument into a string list. arg should either be a
9-
* ':'-separated list of strings, or "-" to indicate an empty string
10-
* list (as opposed to "", which indicates a string list containing a
11-
* single empty string). list->strdup_strings must be set.
12-
*/
13-
static void parse_string_list(struct string_list *list, const char *arg)
14-
{
15-
if (!strcmp(arg, "-"))
16-
return;
17-
18-
(void)string_list_split(list, arg, ':', -1);
19-
}
20-
21-
static void write_list(const struct string_list *list)
22-
{
23-
int i;
24-
for (i = 0; i < list->nr; i++)
25-
printf("[%d]: \"%s\"\n", i, list->items[i].string);
26-
}
27-
28-
static void write_list_compact(const struct string_list *list)
29-
{
30-
int i;
31-
if (!list->nr)
32-
printf("-\n");
33-
else {
34-
printf("%s", list->items[0].string);
35-
for (i = 1; i < list->nr; i++)
36-
printf(":%s", list->items[i].string);
37-
printf("\n");
38-
}
39-
}
40-
41-
static int prefix_cb(struct string_list_item *item, void *cb_data)
42-
{
43-
const char *prefix = (const char *)cb_data;
44-
return starts_with(item->string, prefix);
45-
}
46-
475
int cmd__string_list(int argc, const char **argv)
486
{
49-
if (argc == 5 && !strcmp(argv[1], "split")) {
50-
struct string_list list = STRING_LIST_INIT_DUP;
51-
int i;
52-
const char *s = argv[2];
53-
int delim = *argv[3];
54-
int maxsplit = atoi(argv[4]);
55-
56-
i = string_list_split(&list, s, delim, maxsplit);
57-
printf("%d\n", i);
58-
write_list(&list);
59-
string_list_clear(&list, 0);
60-
return 0;
61-
}
62-
63-
if (argc == 5 && !strcmp(argv[1], "split_in_place")) {
64-
struct string_list list = STRING_LIST_INIT_NODUP;
65-
int i;
66-
char *s = xstrdup(argv[2]);
67-
const char *delim = argv[3];
68-
int maxsplit = atoi(argv[4]);
69-
70-
i = string_list_split_in_place(&list, s, delim, maxsplit);
71-
printf("%d\n", i);
72-
write_list(&list);
73-
string_list_clear(&list, 0);
74-
free(s);
75-
return 0;
76-
}
77-
78-
if (argc == 4 && !strcmp(argv[1], "filter")) {
79-
/*
80-
* Retain only the items that have the specified prefix.
81-
* Arguments: list|- prefix
82-
*/
83-
struct string_list list = STRING_LIST_INIT_DUP;
84-
const char *prefix = argv[3];
85-
86-
parse_string_list(&list, argv[2]);
87-
filter_string_list(&list, 0, prefix_cb, (void *)prefix);
88-
write_list_compact(&list);
89-
string_list_clear(&list, 0);
90-
return 0;
91-
}
92-
93-
if (argc == 3 && !strcmp(argv[1], "remove_duplicates")) {
94-
struct string_list list = STRING_LIST_INIT_DUP;
95-
96-
parse_string_list(&list, argv[2]);
97-
string_list_remove_duplicates(&list, 0);
98-
write_list_compact(&list);
99-
string_list_clear(&list, 0);
100-
return 0;
101-
}
102-
1037
if (argc == 2 && !strcmp(argv[1], "sort")) {
1048
struct string_list list = STRING_LIST_INIT_NODUP;
1059
struct strbuf sb = STRBUF_INIT;

t/meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ clar_test_suites = [
1919
'unit-tests/u-reftable-tree.c',
2020
'unit-tests/u-strbuf.c',
2121
'unit-tests/u-strcmp-offset.c',
22+
'unit-tests/u-string-list.c',
2223
'unit-tests/u-strvec.c',
2324
'unit-tests/u-trailer.c',
2425
'unit-tests/u-urlmatch-normalization.c',
@@ -105,7 +106,6 @@ integration_tests = [
105106
't0060-path-utils.sh',
106107
't0061-run-command.sh',
107108
't0062-revision-walking.sh',
108-
't0063-string-list.sh',
109109
't0066-dir-iterator.sh',
110110
't0067-parse_pathspec_file.sh',
111111
't0068-for-each-repo.sh',

0 commit comments

Comments
 (0)