about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2017-03-25 01:40:20 +0000
committerJames Booth <boothj5@gmail.com>2017-03-25 01:40:20 +0000
commitb5e0106526fc4a22219c4978209df05981e115fd (patch)
tree023e59a5cb94e9860c6c05b5393a57e214bf801e
parentb19e02db91b6fc1fc56242953f1c48c4d84a1e8b (diff)
downloadprofani-tty-b5e0106526fc4a22219c4978209df05981e115fd.tar.gz
Autocomplete accent and case insensitive
-rw-r--r--src/tools/autocomplete.c15
-rw-r--r--tests/unittests/test_autocomplete.c52
-rw-r--r--tests/unittests/test_autocomplete.h4
-rw-r--r--tests/unittests/unittests.c4
4 files changed, 74 insertions, 1 deletions
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),