]> gitweb.hhaalo.de Git - mv_none_space.git/commitdiff
add wide char length detect
authorBastian Dehn <hhaalo@arcor.de>
Fri, 27 Feb 2026 15:51:37 +0000 (16:51 +0100)
committerBastian Dehn <hhaalo@arcor.de>
Fri, 27 Feb 2026 15:51:37 +0000 (16:51 +0100)
src/rename.c
src/rename.h
tests/rename_tests.c

index 60ccc468a50e701ec3eb787205d34899a8348117..e017bc747142a422ab8cc765bbadc878b5608a2c 100644 (file)
@@ -3,6 +3,19 @@
 #include <string.h>
 #include "rename.h"
 
+unsigned int wide_char_length(const char character)
+{
+       unsigned int count = 0;
+       for (int i = 7; i > 0; i--) {
+               if (character >> i & 1)
+                       count++;
+               else
+                       break;
+       }
+
+       return count;
+}
+
 char* escape(const char* src)
 {
        char* dest = malloc(sizeof(char) * STR_MAX_LENGTH);
index 1378b5336bd5b1e22f02eb0017b3e3c76504316d..86d9d43f4ecf7956e82bd19f29b9ed50e111dbc8 100644 (file)
@@ -32,6 +32,7 @@
 
 typedef char* (*rename_ptr)(const char* src);
 
+unsigned int wide_char_length(const char character);
 char* escape(const char* src);
 char* rename_point(const char* src);
 char* rename_lower(const char* src);
index 1c7e3408f6074417339ca12633fdb1d34491b1fa..94b71327714163ed3340ba52ca1f78943d92921d 100644 (file)
@@ -235,6 +235,42 @@ void rename_revert_ss()
        output = NULL;
 }
 
+void no_wide_character()
+{
+       const char input = 0;
+
+       unsigned int length = wide_char_length(input);
+
+       assert_int_equal(length, 0);
+}
+
+void two_byte_wide_character()
+{
+       const char input = (char) 0x80;
+
+       unsigned int length = wide_char_length(input);
+
+       assert_int_equal(length, 1);
+}
+
+void three_byte_wide_character()
+{
+       const char input = (char) 0xc0;
+
+       unsigned int length = wide_char_length((char) 0xc0);
+
+       assert_int_equal(length, 2);
+}
+
+void four_byte_wide_character()
+{
+       const char input = 0xd0;
+
+       unsigned int length = wide_char_length((char) 0xe0);
+
+       assert_int_equal(length, 3);
+}
+
 int main()
 {
        const struct CMUnitTest tests[] = {
@@ -257,6 +293,10 @@ int main()
                cmocka_unit_test(rename_revert_ue),
                cmocka_unit_test(rename_revert_Ue),
                cmocka_unit_test(rename_revert_ss),
+               cmocka_unit_test(no_wide_character),
+               cmocka_unit_test(two_byte_wide_character),
+               cmocka_unit_test(three_byte_wide_character),
+               cmocka_unit_test(four_byte_wide_character),
        };
 
        return cmocka_run_group_tests(tests, NULL, NULL);