1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-09-22 19:45:54 -04:00

autocomplete: remove duplicate code in search functions

_search_next and _search_prev where exactly the same except taking the
nex/prev from the list.
Use one function with a direction argument.
This commit is contained in:
Michael Vetter 2021-03-11 22:24:27 +01:00
parent e3133ed98f
commit 638a50f8d1

View File

@ -44,6 +44,11 @@
#include "tools/parser.h" #include "tools/parser.h"
#include "ui/ui.h" #include "ui/ui.h"
typedef enum {
PREVIOUS,
NEXT
} search_direction;
struct autocomplete_t struct autocomplete_t
{ {
GList* items; GList* items;
@ -51,8 +56,7 @@ struct autocomplete_t
gchar* search_str; gchar* search_str;
}; };
static gchar* _search_next(Autocomplete ac, GList* curr, gboolean quote); static gchar* _search(Autocomplete ac, GList* curr, gboolean quote, search_direction direction);
static gchar* _search_prev(Autocomplete ac, GList* curr, gboolean quote);
Autocomplete Autocomplete
autocomplete_new(void) autocomplete_new(void)
@ -258,7 +262,7 @@ autocomplete_complete(Autocomplete ac, const gchar* search_str, gboolean quote,
} }
ac->search_str = strdup(search_str); ac->search_str = strdup(search_str);
found = _search_next(ac, ac->items, quote); found = _search(ac, ac->items, quote, NEXT);
return found; return found;
@ -266,13 +270,13 @@ autocomplete_complete(Autocomplete ac, const gchar* search_str, gboolean quote,
} else { } else {
if (previous) { if (previous) {
// search from here-1 to beginning // search from here-1 to beginning
found = _search_prev(ac, g_list_previous(ac->last_found), quote); found = _search(ac, g_list_previous(ac->last_found), quote, PREVIOUS);
if (found) { if (found) {
return found; return found;
} }
} else { } else {
// search from here+1 to end // search from here+1 to end
found = _search_next(ac, g_list_next(ac->last_found), quote); found = _search(ac, g_list_next(ac->last_found), quote, NEXT);
if (found) { if (found) {
return found; return found;
} }
@ -280,13 +284,13 @@ autocomplete_complete(Autocomplete ac, const gchar* search_str, gboolean quote,
if (previous) { if (previous) {
// search from end // search from end
found = _search_prev(ac, g_list_last(ac->items), quote); found = _search(ac, g_list_last(ac->items), quote, PREVIOUS);
if (found) { if (found) {
return found; return found;
} }
} else { } else {
// search from beginning // search from beginning
found = _search_next(ac, ac->items, quote); found = _search(ac, ac->items, quote, NEXT);
if (found) { if (found) {
return found; return found;
} }
@ -409,7 +413,7 @@ autocomplete_remove_older_than_max_reverse(Autocomplete ac, int maxsize)
} }
static gchar* static gchar*
_search_next(Autocomplete ac, GList* curr, gboolean quote) _search(Autocomplete ac, GList* curr, gboolean quote, search_direction direction)
{ {
gchar* search_str_ascii = g_str_to_ascii(ac->search_str, NULL); gchar* search_str_ascii = g_str_to_ascii(ac->search_str, NULL);
gchar* search_str_lower = g_ascii_strdown(search_str_ascii, -1); gchar* search_str_lower = g_ascii_strdown(search_str_ascii, -1);
@ -448,54 +452,12 @@ _search_next(Autocomplete ac, GList* curr, gboolean quote)
} }
g_free(curr_lower); g_free(curr_lower);
curr = g_list_next(curr);
}
g_free(search_str_lower); if (direction == PREVIOUS) {
return NULL; curr = g_list_previous(curr);
} } else {
curr = g_list_next(curr);
static gchar*
_search_prev(Autocomplete ac, GList* curr, gboolean quote)
{
gchar* search_str_ascii = g_str_to_ascii(ac->search_str, NULL);
gchar* search_str_lower = g_ascii_strdown(search_str_ascii, -1);
g_free(search_str_ascii);
while (curr) {
gchar* curr_ascii = g_str_to_ascii(curr->data, NULL);
gchar* curr_lower = g_ascii_strdown(curr_ascii, -1);
g_free(curr_ascii);
// match found
if (strncmp(curr_lower, search_str_lower, strlen(search_str_lower)) == 0) {
// set pointer to last found
ac->last_found = curr;
// if contains space, quote before returning
if (quote && g_strrstr(curr->data, " ")) {
GString* quoted = g_string_new("\"");
g_string_append(quoted, curr->data);
g_string_append(quoted, "\"");
gchar* result = quoted->str;
g_string_free(quoted, FALSE);
g_free(search_str_lower);
g_free(curr_lower);
return result;
// otherwise just return the string
} else {
g_free(search_str_lower);
g_free(curr_lower);
return strdup(curr->data);
}
} }
g_free(curr_lower);
curr = g_list_previous(curr);
} }
g_free(search_str_lower); g_free(search_str_lower);