]> git.ipfire.org Git - thirdparty/git.git/commitdiff
string-list: replace negative index encoding with "exact_match" parameter
authorshejialuo <shejialuo@gmail.com>
Mon, 6 Oct 2025 06:32:31 +0000 (14:32 +0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 6 Oct 2025 16:11:07 +0000 (09:11 -0700)
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>
add-interactive.c
mailmap.c
refs.c
string-list.c
string-list.h

index 3e692b47eca0a3f6b664743eaa6c12d47082ceed..7c0fd3d218f2b87bf79ab39cbc05c565716626b2 100644 (file)
@@ -221,7 +221,8 @@ static void find_unique_prefixes(struct prefix_item_list *list)
 
 static ssize_t find_unique(const char *string, struct prefix_item_list *list)
 {
-       int index = string_list_find_insert_index(&list->sorted, string, 1);
+       bool exact_match;
+       int index = string_list_find_insert_index(&list->sorted, string, &exact_match);
        struct string_list_item *item;
 
        if (list->items.nr != list->sorted.nr)
@@ -229,8 +230,8 @@ static ssize_t find_unique(const char *string, struct prefix_item_list *list)
                    " vs %"PRIuMAX")",
                    (uintmax_t)list->items.nr, (uintmax_t)list->sorted.nr);
 
-       if (index < 0)
-               item = list->sorted.items[-1 - index].util;
+       if (exact_match)
+               item = list->sorted.items[index].util;
        else if (index > 0 &&
                 starts_with(list->sorted.items[index - 1].string, string))
                return -1;
index 56c72102d9e39461adc3f2795f10da70b535c03b..58a4484963c6e9725a54899ea3c1bc0a71c1ba4a 100644 (file)
--- a/mailmap.c
+++ b/mailmap.c
@@ -243,10 +243,9 @@ void clear_mailmap(struct string_list *map)
 static struct string_list_item *lookup_prefix(struct string_list *map,
                                              const char *string, size_t len)
 {
-       int i = string_list_find_insert_index(map, string, 1);
-       if (i < 0) {
-               /* exact match */
-               i = -1 - i;
+       bool exact_match;
+       int i = string_list_find_insert_index(map, string, &exact_match);
+       if (exact_match) {
                if (!string[len])
                        return &map->items[i];
                /*
diff --git a/refs.c b/refs.c
index 4ff55cf24f68ee90e73de04f823c36bf536882bd..f1ff5bf8467f303d6214f1574eb315307d5cc794 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -1699,7 +1699,7 @@ const char *find_descendant_ref(const char *dirname,
         * with dirname (remember, dirname includes the trailing
         * slash) and is not in skip, then we have a conflict.
         */
-       for (pos = string_list_find_insert_index(extras, dirname, 0);
+       for (pos = string_list_find_insert_index(extras, dirname, NULL);
             pos < extras->nr; pos++) {
                const char *extra_refname = extras->items[pos].string;
 
index d8da3dd41482dd4ccb1afa04fde22ea5b2f3d113..c589ab5a2cf079de8d1e0c82cdff823eadd4a0a2 100644 (file)
@@ -29,12 +29,14 @@ static size_t get_entry_index(const struct string_list *list, const char *string
                else if (compare > 0)
                        left = middle + 1;
                else {
-                       *exact_match = true;
+                       if (exact_match)
+                               *exact_match = true;
                        return middle;
                }
        }
 
-       *exact_match = false;
+       if (exact_match)
+               *exact_match = false;
        return right;
 }
 
@@ -90,13 +92,9 @@ bool string_list_has_string(const struct string_list *list, const char *string)
 }
 
 int string_list_find_insert_index(const struct string_list *list, const char *string,
-                                 int negative_existing_index)
+                                 bool *exact_match)
 {
-       bool exact_match;
-       int index = get_entry_index(list, string, &exact_match);
-       if (exact_match)
-               index = -1 - (negative_existing_index ? index : 0);
-       return index;
+       return get_entry_index(list, string, exact_match);
 }
 
 struct string_list_item *string_list_lookup(struct string_list *list, const char *string)
index bc7f38022ec51e90cb1fd401b43d32edb8679ea4..8830ce671d4fa6b5d07f7fc8cca58497cf657a04 100644 (file)
@@ -174,7 +174,7 @@ void string_list_remove_empty_items(struct string_list *list, int free_util);
 /** Determine if the string_list has a given string or not. */
 bool string_list_has_string(const struct string_list *list, const char *string);
 int string_list_find_insert_index(const struct string_list *list, const char *string,
-                                 int negative_existing_index);
+                                 bool *exact_match);
 
 /**
  * Insert a new element to the string_list. The returned pointer can