From b5e0106526fc4a22219c4978209df05981e115fd Mon Sep 17 00:00:00 2001 From: James Booth Date: Sat, 25 Mar 2017 01:40:20 +0000 Subject: Autocomplete accent and case insensitive --- src/tools/autocomplete.c | 15 ++++++++++- tests/unittests/test_autocomplete.c | 52 +++++++++++++++++++++++++++++++++++++ tests/unittests/test_autocomplete.h | 4 +++ tests/unittests/unittests.c | 4 +++ 4 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/tools/autocomplete.c b/src/tools/autocomplete.c index b3c49610..87e82848 100644 --- a/src/tools/autocomplete.c +++ b/src/tools/autocomplete.c @@ -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; } diff --git a/tests/unittests/test_autocomplete.c b/tests/unittests/test_autocomplete.c index 2fd68b51..10f95be8 100644 --- a/tests/unittests/test_autocomplete.c +++ b/tests/unittests/test_autocomplete.c @@ -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); +} diff --git a/tests/unittests/test_autocomplete.h b/tests/unittests/test_autocomplete.h index 4ad327c0..a16e4db3 100644 --- a/tests/unittests/test_autocomplete.h +++ b/tests/unittests/test_autocomplete.h @@ -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); diff --git a/tests/unittests/unittests.c b/tests/unittests/unittests.c index 71bdf1b1..d59a5ed0 100644 --- a/tests/unittests/unittests.c +++ b/tests/unittests/unittests.c @@ -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), -- cgit 1.4.1-2-gfad0