about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2015-01-17 21:09:40 +0000
committerJames Booth <boothj5@gmail.com>2015-01-17 21:09:40 +0000
commitba89297382a40ea8f63f73d756dc1ad67a0b1aaa (patch)
tree3f434417237a05f8a91f7921bc73f7a31043eb26
parent4ac11ddcd69a00fff6430e92d79f0e1e56430c77 (diff)
downloadprofani-tty-ba89297382a40ea8f63f73d756dc1ad67a0b1aaa.tar.gz
Added utf8_display_len
-rw-r--r--src/common.c22
-rw-r--r--src/common.h1
-rw-r--r--src/ui/inputwin.c27
-rw-r--r--tests/test_common.c43
-rw-r--r--tests/test_common.h6
-rw-r--r--tests/testsuite.c6
6 files changed, 82 insertions, 23 deletions
diff --git a/src/common.c b/src/common.c
index 0f7693e9..7638da31 100644
--- a/src/common.c
+++ b/src/common.c
@@ -202,6 +202,28 @@ str_contains(const char str[], int size, char ch)
     return 0;
 }
 
+int
+utf8_display_len(const char * const str)
+{
+    if (!str) {
+        return 0;
+    }
+
+    int len = 0;
+    gchar *curr = g_utf8_offset_to_pointer(str, 0);
+    while (*curr != '\0') {
+        gunichar curru = g_utf8_get_char(curr);
+        if (g_unichar_iswide(curru)) {
+            len += 2;
+        } else {
+            len ++;
+        }
+        curr = g_utf8_next_char(curr);
+    }
+
+    return len;
+}
+
 char *
 prof_getline(FILE *stream)
 {
diff --git a/src/common.h b/src/common.h
index 4e00e275..26d4a99a 100644
--- a/src/common.h
+++ b/src/common.h
@@ -104,6 +104,7 @@ gboolean mkdir_recursive(const char *dir);
 char * str_replace(const char *string, const char *substr,
     const char *replacement);
 int str_contains(const char str[], int size, char ch);
+int utf8_display_len(const char * const str);
 char * prof_getline(FILE *stream);
 char* release_get_latest(void);
 gboolean release_is_new(char *found_version);
diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c
index f9562473..85ddc79a 100644
--- a/src/ui/inputwin.c
+++ b/src/ui/inputwin.c
@@ -92,7 +92,6 @@ static int _printable(const wint_t ch);
 static void _clear_input(void);
 static void _go_to_end(void);
 static void _delete_previous_word(void);
-static int _get_display_length(void);
 
 void
 create_input_window(void)
@@ -145,7 +144,7 @@ inp_block(void)
 char *
 inp_read(int *key_type, wint_t *ch)
 {
-    int display_size = _get_display_length();
+    int display_size = utf8_display_len(input);
 
     // echo off, and get some more input
     noecho();
@@ -260,24 +259,6 @@ inp_put_back(void)
     _inp_win_update_virtual();
 }
 
-static int
-_get_display_length(void)
-{
-    int len = 0;
-    gchar *curr = g_utf8_offset_to_pointer(input, 0);
-    while (*curr != '\0') {
-        gunichar curru = g_utf8_get_char(curr);
-        if (g_unichar_iswide(curru)) {
-            len += 2;
-        } else {
-            len ++;
-        }
-        curr = g_utf8_next_char(curr);
-    }
-
-    return len;
-}
-
 void
 inp_replace_input(const char * const new_input)
 {
@@ -322,7 +303,7 @@ _handle_edit(int key_type, const wint_t ch)
     char *next = NULL;
     int inp_x = getcurx(inp_win);
     int next_ch;
-    int display_size = _get_display_length();
+    int display_size = utf8_display_len(input);
 
     // CTRL-LEFT
     if ((key_type == KEY_CODE_YES) && (ch == 547 || ch == 545 || ch == 544 || ch == 540 || ch == 539) && (inp_x > 0)) {
@@ -608,7 +589,7 @@ static void
 _handle_backspace(void)
 {
     int inp_x = getcurx(inp_win);
-    int display_size = _get_display_length();
+    int display_size = utf8_display_len(input);
     roster_reset_search_attempts();
     if (display_size > 0) {
 
@@ -784,7 +765,7 @@ _delete_previous_word(void)
 static void
 _go_to_end(void)
 {
-    int display_size = _get_display_length();
+    int display_size = utf8_display_len(input);
     wmove(inp_win, 0, display_size);
     if (display_size > cols-2) {
         pad_start = display_size - cols + 1;
diff --git a/tests/test_common.c b/tests/test_common.c
index bac03cfd..0c4530a0 100644
--- a/tests/test_common.c
+++ b/tests/test_common.c
@@ -544,3 +544,46 @@ void test_p_sha1_hash7(void **state)
 
     assert_string_equal(result, "bNfKVfqEOGmzlH8M+e8FYTB46SU=");
 }
+
+void utf8_display_len_null_str(void **state)
+{
+    int result = utf8_display_len(NULL);
+
+    assert_int_equal(0, result);
+}
+
+void utf8_display_len_1_non_wide(void **state)
+{
+    int result = utf8_display_len("1");
+
+    assert_int_equal(1, result);
+}
+
+void utf8_display_len_1_wide(void **state)
+{
+    int result = utf8_display_len("四");
+
+    assert_int_equal(2, result);
+}
+
+void utf8_display_len_non_wide(void **state)
+{
+    int result = utf8_display_len("123456789abcdef");
+
+    assert_int_equal(15, result);
+}
+
+void utf8_display_len_wide(void **state)
+{
+    int result = utf8_display_len("12三四56");
+
+    assert_int_equal(8, result);
+}
+
+void utf8_display_len_all_wide(void **state)
+{
+    int result = utf8_display_len("ひらがな");
+
+    assert_int_equal(8, result);
+}
+
diff --git a/tests/test_common.h b/tests/test_common.h
index 8b5128fd..1866e73d 100644
--- a/tests/test_common.h
+++ b/tests/test_common.h
@@ -46,3 +46,9 @@ void test_p_sha1_hash5(void **state);
 void test_p_sha1_hash6(void **state);
 void test_p_sha1_hash6(void **state);
 void test_p_sha1_hash7(void **state);
+void utf8_display_len_null_str(void **state);
+void utf8_display_len_1_non_wide(void **state);
+void utf8_display_len_1_wide(void **state);
+void utf8_display_len_non_wide(void **state);
+void utf8_display_len_wide(void **state);
+void utf8_display_len_all_wide(void **state);
\ No newline at end of file
diff --git a/tests/testsuite.c b/tests/testsuite.c
index 32d298cf..cf511c59 100644
--- a/tests/testsuite.c
+++ b/tests/testsuite.c
@@ -85,6 +85,12 @@ int main(int argc, char* argv[]) {
         unit_test(test_p_sha1_hash5),
         unit_test(test_p_sha1_hash6),
         unit_test(test_p_sha1_hash7),
+        unit_test(utf8_display_len_null_str),
+        unit_test(utf8_display_len_1_non_wide),
+        unit_test(utf8_display_len_1_wide),
+        unit_test(utf8_display_len_non_wide),
+        unit_test(utf8_display_len_wide),
+        unit_test(utf8_display_len_all_wide),
 
         unit_test(clear_empty),
         unit_test(reset_after_create),