diff --git a/add-interactive.c b/add-interactive.c index 6ffe64c38d..68fc09547d 100644 --- a/add-interactive.c +++ b/add-interactive.c @@ -244,7 +244,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; + size_t index = string_list_find_insert_index(&list->sorted, string, &exact_match); struct string_list_item *item; if (list->items.nr != list->sorted.nr) @@ -252,8 +253,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; diff --git a/mailmap.c b/mailmap.c index 56c72102d9..37fd158a51 100644 --- a/mailmap.c +++ b/mailmap.c @@ -1,5 +1,4 @@ #define USE_THE_REPOSITORY_VARIABLE -#define DISABLE_SIGN_COMPARE_WARNINGS #include "git-compat-util.h" #include "environment.h" @@ -243,10 +242,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; + size_t i = string_list_find_insert_index(map, string, &exact_match); + if (exact_match) { if (!string[len]) return &map->items[i]; /* @@ -267,7 +265,7 @@ static struct string_list_item *lookup_prefix(struct string_list *map, * overlong key would be inserted, which must come after the * real location of the key if one exists. */ - while (0 <= --i && i < map->nr) { + while (i-- && i < map->nr) { int cmp = strncasecmp(map->items[i].string, string, len); if (cmp < 0) /* diff --git a/refs.c b/refs.c index c83e3d7a4d..965381367e 100644 --- a/refs.c +++ b/refs.c @@ -3,7 +3,6 @@ */ #define USE_THE_REPOSITORY_VARIABLE -#define DISABLE_SIGN_COMPARE_WARNINGS #include "git-compat-util.h" #include "advice.h" @@ -1714,8 +1713,6 @@ const char *find_descendant_ref(const char *dirname, const struct string_list *extras, const struct string_list *skip) { - int pos; - if (!extras) return NULL; @@ -1725,7 +1722,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 (size_t pos = string_list_find_insert_index(extras, dirname, NULL); pos < extras->nr; pos++) { const char *extra_refname = extras->items[pos].string; @@ -2414,7 +2411,7 @@ static int run_transaction_hook(struct ref_transaction *transaction, struct child_process proc = CHILD_PROCESS_INIT; struct strbuf buf = STRBUF_INIT; const char *hook; - int ret = 0, i; + int ret = 0; hook = find_hook(transaction->ref_store->repo, "reference-transaction"); if (!hook) @@ -2431,7 +2428,7 @@ static int run_transaction_hook(struct ref_transaction *transaction, sigchain_push(SIGPIPE, SIG_IGN); - for (i = 0; i < transaction->nr; i++) { + for (size_t i = 0; i < transaction->nr; i++) { struct ref_update *update = transaction->updates[i]; if (update->flags & REF_LOG_ONLY) @@ -2824,9 +2821,7 @@ void ref_transaction_for_each_queued_update(struct ref_transaction *transaction, ref_transaction_for_each_queued_update_fn cb, void *cb_data) { - int i; - - for (i = 0; i < transaction->nr; i++) { + for (size_t i = 0; i < transaction->nr; i++) { struct ref_update *update = transaction->updates[i]; cb(update->refname, diff --git a/string-list.c b/string-list.c index 343cf1ca90..08dc00984c 100644 --- a/string-list.c +++ b/string-list.c @@ -16,7 +16,7 @@ void string_list_init_dup(struct string_list *list) /* if there is no exact match, point to the index where the entry could be * inserted */ static size_t get_entry_index(const struct string_list *list, const char *string, - int *exact_match) + bool *exact_match) { size_t left = 0, right = list->nr; compare_strings_fn cmp = list->cmp ? list->cmp : strcmp; @@ -29,18 +29,20 @@ static size_t get_entry_index(const struct string_list *list, const char *string else if (compare > 0) left = middle + 1; else { - *exact_match = 1; + if (exact_match) + *exact_match = true; return middle; } } - *exact_match = 0; + if (exact_match) + *exact_match = false; return right; } static size_t add_entry(struct string_list *list, const char *string) { - int exact_match = 0; + bool exact_match; size_t index = get_entry_index(list, string, &exact_match); if (exact_match) @@ -68,7 +70,7 @@ struct string_list_item *string_list_insert(struct string_list *list, const char void string_list_remove(struct string_list *list, const char *string, int free_util) { - int exact_match; + bool exact_match; int i = get_entry_index(list, string, &exact_match); if (exact_match) { @@ -82,26 +84,23 @@ void string_list_remove(struct string_list *list, const char *string, } } -int string_list_has_string(const struct string_list *list, const char *string) +bool string_list_has_string(const struct string_list *list, const char *string) { - int exact_match; + bool exact_match; get_entry_index(list, string, &exact_match); return exact_match; } -int string_list_find_insert_index(const struct string_list *list, const char *string, - int negative_existing_index) +size_t string_list_find_insert_index(const struct string_list *list, const char *string, + bool *exact_match) { - int 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) { - int exact_match, i = get_entry_index(list, string, &exact_match); + bool exact_match; + size_t i = get_entry_index(list, string, &exact_match); if (!exact_match) return NULL; return list->items + i; diff --git a/string-list.h b/string-list.h index 2b438c7733..fa6ba07853 100644 --- a/string-list.h +++ b/string-list.h @@ -172,9 +172,15 @@ void string_list_remove_empty_items(struct string_list *list, int free_util); /* Use these functions only on sorted lists: */ /** Determine if the string_list has a given string or not. */ -int 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 string_list_has_string(const struct string_list *list, const char *string); + +/** + * Find the index at which a new element should be inserted into the + * string_list to maintain sorted order. If exact_match is not NULL, + * it will be set to true if the string already exists in the list. + */ +size_t string_list_find_insert_index(const struct string_list *list, const char *string, + bool *exact_match); /** * Insert a new element to the string_list. The returned pointer can