1
0
Fork 0

Autocomplete accent and case insensitive

This commit is contained in:
James Booth 2017-03-25 01:40:20 +00:00
parent b19e02db91
commit b5e0106526
4 changed files with 74 additions and 1 deletions

View File

@ -330,10 +330,17 @@ autocomplete_param_no_with_func(const char *const input, char *command, int arg_
static gchar*
_search_from(Autocomplete ac, GSList *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->data, ac->search_str, strlen(ac->search_str)) == 0) {
if (strncmp(curr_lower, search_str_lower, strlen(search_str_lower)) == 0) {
// set pointer to last found
ac->last_found = curr;
@ -347,16 +354,22 @@ _search_from(Autocomplete ac, GSList *curr, gboolean quote)
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_slist_next(curr);
}
g_free(search_str_lower);
return NULL;
}

View File

@ -117,3 +117,55 @@ void add_two_same_updates(void **state)
autocomplete_clear(ac);
g_slist_free_full(result, g_free);
}
void complete_accented_with_accented(void **state)
{
Autocomplete ac = autocomplete_new();
autocomplete_add(ac, "èâîô");
char *result = autocomplete_complete(ac, "èâ", TRUE);
assert_string_equal("èâîô", result);
autocomplete_clear(ac);
}
void complete_accented_with_base(void **state)
{
Autocomplete ac = autocomplete_new();
autocomplete_add(ac, "èâîô");
char *result = autocomplete_complete(ac, "ea", TRUE);
assert_string_equal("èâîô", result);
autocomplete_clear(ac);
}
void complete_both_with_accented(void **state)
{
Autocomplete ac = autocomplete_new();
autocomplete_add(ac, "eaooooo");
autocomplete_add(ac, "èâîô");
char *result1 = autocomplete_complete(ac, "èâ", TRUE);
char *result2 = autocomplete_complete(ac, result1, TRUE);
assert_string_equal("èâîô", result2);
autocomplete_clear(ac);
}
void complete_both_with_base(void **state)
{
Autocomplete ac = autocomplete_new();
autocomplete_add(ac, "eaooooo");
autocomplete_add(ac, "èâîô");
char *result1 = autocomplete_complete(ac, "ea", TRUE);
char *result2 = autocomplete_complete(ac, result1, TRUE);
assert_string_equal("èâîô", result2);
autocomplete_clear(ac);
}

View File

@ -8,3 +8,7 @@ void add_two_and_complete_returns_second(void **state);
void add_two_adds_two(void **state);
void add_two_same_adds_one(void **state);
void add_two_same_updates(void **state);
void complete_accented_with_accented(void **state);
void complete_accented_with_base(void **state);
void complete_both_with_accented(void **state);
void complete_both_with_base(void **state);

View File

@ -90,6 +90,10 @@ int main(int argc, char* argv[]) {
unit_test(add_two_adds_two),
unit_test(add_two_same_adds_one),
unit_test(add_two_same_updates),
unit_test(complete_accented_with_accented),
unit_test(complete_accented_with_base),
unit_test(complete_both_with_accented),
unit_test(complete_both_with_base),
unit_test(create_jid_from_null_returns_null),
unit_test(create_jid_from_empty_string_returns_null),