From b25a5d9a5b9b786b118068cece225709a499597f Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Fri, 27 Feb 2026 16:51:37 +0100 Subject: [PATCH] add wide char length detect --- src/rename.c | 13 +++++++++++++ src/rename.h | 1 + tests/rename_tests.c | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/src/rename.c b/src/rename.c index 60ccc46..e017bc7 100644 --- a/src/rename.c +++ b/src/rename.c @@ -3,6 +3,19 @@ #include #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); diff --git a/src/rename.h b/src/rename.h index 1378b53..86d9d43 100644 --- a/src/rename.h +++ b/src/rename.h @@ -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); diff --git a/tests/rename_tests.c b/tests/rename_tests.c index 1c7e340..94b7132 100644 --- a/tests/rename_tests.c +++ b/tests/rename_tests.c @@ -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); -- 2.47.3