Git fork

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 <shejialuo@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

authored by

shejialuo and committed by
Junio C Hamano
e8a32e76 03ef7762

+15 -17
+4 -3
add-interactive.c
··· 221 221 222 222 static ssize_t find_unique(const char *string, struct prefix_item_list *list) 223 223 { 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); 225 226 struct string_list_item *item; 226 227 227 228 if (list->items.nr != list->sorted.nr) ··· 229 230 " vs %"PRIuMAX")", 230 231 (uintmax_t)list->items.nr, (uintmax_t)list->sorted.nr); 231 232 232 - if (index < 0) 233 - item = list->sorted.items[-1 - index].util; 233 + if (exact_match) 234 + item = list->sorted.items[index].util; 234 235 else if (index > 0 && 235 236 starts_with(list->sorted.items[index - 1].string, string)) 236 237 return -1;
+3 -4
mailmap.c
··· 243 243 static struct string_list_item *lookup_prefix(struct string_list *map, 244 244 const char *string, size_t len) 245 245 { 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) { 250 249 if (!string[len]) 251 250 return &map->items[i]; 252 251 /*
+1 -1
refs.c
··· 1699 1699 * with dirname (remember, dirname includes the trailing 1700 1700 * slash) and is not in skip, then we have a conflict. 1701 1701 */ 1702 - for (pos = string_list_find_insert_index(extras, dirname, 0); 1702 + for (pos = string_list_find_insert_index(extras, dirname, NULL); 1703 1703 pos < extras->nr; pos++) { 1704 1704 const char *extra_refname = extras->items[pos].string; 1705 1705
+6 -8
string-list.c
··· 29 29 else if (compare > 0) 30 30 left = middle + 1; 31 31 else { 32 - *exact_match = true; 32 + if (exact_match) 33 + *exact_match = true; 33 34 return middle; 34 35 } 35 36 } 36 37 37 - *exact_match = false; 38 + if (exact_match) 39 + *exact_match = false; 38 40 return right; 39 41 } 40 42 ··· 90 92 } 91 93 92 94 int string_list_find_insert_index(const struct string_list *list, const char *string, 93 - int negative_existing_index) 95 + bool *exact_match) 94 96 { 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); 100 98 } 101 99 102 100 struct string_list_item *string_list_lookup(struct string_list *list, const char *string)
+1 -1
string-list.h
··· 174 174 /** Determine if the string_list has a given string or not. */ 175 175 bool string_list_has_string(const struct string_list *list, const char *string); 176 176 int string_list_find_insert_index(const struct string_list *list, const char *string, 177 - int negative_existing_index); 177 + bool *exact_match); 178 178 179 179 /** 180 180 * Insert a new element to the string_list. The returned pointer can