#include "rename.h"
-uint8_t _replace_two_byte_wide_char(const char* wide_char, char* dst)
+char* replace(char** src, const char* pattern, const char* replace_str)
{
- switch (wide_char[1]) {
- case WIDE_CHAR_a:
- dst[0] = 'a';
- dst[1] = 'e';
- break;
- case WIDE_CHAR_A:
- dst[0] = 'A';
- dst[1] = 'e';
- break;
- case WIDE_CHAR_o:
- dst[0] = 'o';
- dst[1] = 'e';
- break;
- case WIDE_CHAR_O:
- dst[0] = 'O';
- dst[1] = 'e';
- break;
- case WIDE_CHAR_u:
- dst[0] = 'u';
- dst[1] = 'e';
- break;
- case WIDE_CHAR_U:
- dst[0] = 'U';
- dst[1] = 'e';
- break;
- case WIDE_CHAR_SS:
- dst[0] = 's';
- dst[1] = 's';
- break;
- default:
- dst[0] = wide_char[0];
- dst[1] = wide_char[1];
- break;
- }
-
- return 2;
-}
+ const size_t len = strlen(*src);
+ const size_t plen = strlen(pattern);
-uint8_t _replace_char(const char character, char* dest)
-{
- switch (character) {
- case SPACE:
- *dest = '_';
- break;
- default:
- *dest = character;
- break;
+ uint32_t count = 0;
+ for (uint32_t i = 0; i < len; i++) {
+ if (strncmp(*src + i, pattern, plen) == 0)
+ count++;
}
- return 1;
-}
+ const size_t rlen = strlen(replace_str);
+ const size_t difflen = count * (rlen - plen);
+ const size_t outlen = len + difflen + 1;
+ char* output = malloc(outlen);
+ if (output == NULL)
+ return NULL;
+ memset(output, 0, outlen);
-uint8_t wide_char_length(const char character)
-{
- uint8_t count = 0;
- for (uint8_t i = 7; i > 0; i--) {
- if (character >> i & 1)
- count++;
- else
- break;
+ uint32_t outi = 0;
+ for (uint32_t i = 0; i < len; i++) {
+ if (strncmp(*src + i, pattern, plen) == 0) {
+ memcpy(&output[outi], replace_str, rlen);
+ i += plen - 1;
+ outi += rlen;
+ } else {
+ output[outi++] = (*src)[i];
+ }
}
- return count;
+ free(*src);
+ *src = NULL;
+ return output;
}
void escape(const char* src, char* dst)
}
}
-char* replace(char** src, const char* pattern, const char* replace_str)
-{
- const size_t len = strlen(*src);
- const size_t plen = strlen(pattern);
-
- uint32_t count = 0;
- for (uint32_t i = 0; i < len; i++) {
- if (strncmp(*src + i, pattern, plen) == 0)
- count++;
- }
-
- const size_t rlen = strlen(replace_str);
- const size_t difflen = count * (rlen - plen);
- const size_t outlen = len + difflen + 1;
- char* output = malloc(outlen);
- if (output == NULL)
- return NULL;
- memset(output, 0, outlen);
-
- uint32_t outi = 0;
- for (uint32_t i = 0; i < len; i++) {
- if (strncmp(*src + i, pattern, plen) == 0) {
- memcpy(&output[outi], replace_str, rlen);
- i += plen - 1;
- outi += rlen;
- } else {
- output[outi++] = (*src)[i];
- }
- }
-
- free(*src);
- *src = NULL;
- return output;
-}
\ No newline at end of file
assert_string_equal(output, "Gruß");
}
-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(input);
-
- assert_int_equal(length, 2);
-}
-
-void four_byte_wide_character()
-{
- const char input = (char) 0xe0;
-
- unsigned int length = wide_char_length(input);
-
- assert_int_equal(length, 3);
-}
-
void replace_string()
{
char* input = malloc(sizeof(char) * 11);
cmocka_unit_test_setup(rename_revert_ue, setup),
cmocka_unit_test_setup(rename_revert_Ue, setup),
cmocka_unit_test_setup(rename_revert_ss, setup),
- 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),
cmocka_unit_test(replace_string)
};