Skip to content

Commit e8a32e7

Browse files
shejialuogitster
authored andcommitted
string-list: replace negative index encoding with "exact_match" parameter
The "string_list_find_insert_index()" function is used to determine the correct insertion index for a new string within the string list. The function also doubles up to convey if the string is already existing in the list, this is done by returning a negative index "-1 -index". Users are expected to decode this information. This approach has several limitations: 1. It requires the callers to look into the detail of the function to understand how to decode the negative index encoding. 2. Using int for indices can cause overflow issues when dealing with large string lists. To address these limitations, change the function to return size_t for the index value and use a separate bool parameter to indicate whether the index refers to an existing entry or an insertion point. In some cases, the callers of "string_list_find_insert_index" only need the index position and don't care whether an exact match is found. However, "get_entry_index" currently requires a non-NULL "exact_match" parameter, forcing these callers to declare unnecessary variables. Let's allow callers to pass NULL for the "exact_match" parameter when they don't need this information, reducing unnecessary variable declarations in calling code. Signed-off-by: shejialuo <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 03ef776 commit e8a32e7

File tree

5 files changed

+15
-17
lines changed

5 files changed

+15
-17
lines changed

add-interactive.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,16 +221,17 @@ static void find_unique_prefixes(struct prefix_item_list *list)
221221

222222
static ssize_t find_unique(const char *string, struct prefix_item_list *list)
223223
{
224-
int index = string_list_find_insert_index(&list->sorted, string, 1);
224+
bool exact_match;
225+
int index = string_list_find_insert_index(&list->sorted, string, &exact_match);
225226
struct string_list_item *item;
226227

227228
if (list->items.nr != list->sorted.nr)
228229
BUG("prefix_item_list in inconsistent state (%"PRIuMAX
229230
" vs %"PRIuMAX")",
230231
(uintmax_t)list->items.nr, (uintmax_t)list->sorted.nr);
231232

232-
if (index < 0)
233-
item = list->sorted.items[-1 - index].util;
233+
if (exact_match)
234+
item = list->sorted.items[index].util;
234235
else if (index > 0 &&
235236
starts_with(list->sorted.items[index - 1].string, string))
236237
return -1;

mailmap.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -243,10 +243,9 @@ void clear_mailmap(struct string_list *map)
243243
static struct string_list_item *lookup_prefix(struct string_list *map,
244244
const char *string, size_t len)
245245
{
246-
int i = string_list_find_insert_index(map, string, 1);
247-
if (i < 0) {
248-
/* exact match */
249-
i = -1 - i;
246+
bool exact_match;
247+
int i = string_list_find_insert_index(map, string, &exact_match);
248+
if (exact_match) {
250249
if (!string[len])
251250
return &map->items[i];
252251
/*

refs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1699,7 +1699,7 @@ const char *find_descendant_ref(const char *dirname,
16991699
* with dirname (remember, dirname includes the trailing
17001700
* slash) and is not in skip, then we have a conflict.
17011701
*/
1702-
for (pos = string_list_find_insert_index(extras, dirname, 0);
1702+
for (pos = string_list_find_insert_index(extras, dirname, NULL);
17031703
pos < extras->nr; pos++) {
17041704
const char *extra_refname = extras->items[pos].string;
17051705

string-list.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@ static size_t get_entry_index(const struct string_list *list, const char *string
2929
else if (compare > 0)
3030
left = middle + 1;
3131
else {
32-
*exact_match = true;
32+
if (exact_match)
33+
*exact_match = true;
3334
return middle;
3435
}
3536
}
3637

37-
*exact_match = false;
38+
if (exact_match)
39+
*exact_match = false;
3840
return right;
3941
}
4042

@@ -90,13 +92,9 @@ bool string_list_has_string(const struct string_list *list, const char *string)
9092
}
9193

9294
int string_list_find_insert_index(const struct string_list *list, const char *string,
93-
int negative_existing_index)
95+
bool *exact_match)
9496
{
95-
bool exact_match;
96-
int index = get_entry_index(list, string, &exact_match);
97-
if (exact_match)
98-
index = -1 - (negative_existing_index ? index : 0);
99-
return index;
97+
return get_entry_index(list, string, exact_match);
10098
}
10199

102100
struct string_list_item *string_list_lookup(struct string_list *list, const char *string)

string-list.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ void string_list_remove_empty_items(struct string_list *list, int free_util);
174174
/** Determine if the string_list has a given string or not. */
175175
bool string_list_has_string(const struct string_list *list, const char *string);
176176
int string_list_find_insert_index(const struct string_list *list, const char *string,
177-
int negative_existing_index);
177+
bool *exact_match);
178178

179179
/**
180180
* Insert a new element to the string_list. The returned pointer can

0 commit comments

Comments
 (0)