From cb8c1a0d7073eee491d000b35a62bb91d39de414 Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Mon, 2 Mar 2026 21:24:00 +0100 Subject: [PATCH] add replace function --- src/rename.c | 33 +++++++++++++++++++++++++++++++++ src/rename.h | 2 ++ tests/rename_tests.c | 13 +++++++++++++ 3 files changed, 48 insertions(+) diff --git a/src/rename.c b/src/rename.c index 13ac556..35d6646 100644 --- a/src/rename.c +++ b/src/rename.c @@ -177,4 +177,37 @@ void rename_revert(const char* src, char* dst) dst[dst_count++] = src[i]; } } +} + +char* replace(const 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]; + } + } + + return output; } \ No newline at end of file diff --git a/src/rename.h b/src/rename.h index 76334eb..90c2f19 100644 --- a/src/rename.h +++ b/src/rename.h @@ -40,4 +40,6 @@ void rename_lower(const char* src, char* dst); void rename_string(const char* src, char* dst); void rename_revert(const char* src, char* dst); +char* replace(const char* src, const char* pattern, const char* replace_str); + #endif \ No newline at end of file diff --git a/tests/rename_tests.c b/tests/rename_tests.c index 346db23..a6e052c 100644 --- a/tests/rename_tests.c +++ b/tests/rename_tests.c @@ -267,6 +267,18 @@ void four_byte_wide_character() assert_int_equal(length, 3); } +void replace_string() +{ + const char* input = "Hello Max!"; + + char* output = replace(input, "Max", "World"); + + assert_string_equal(output, "Hello World!"); + + free(output); + output = NULL; +} + int main() { const struct CMUnitTest tests[] = { @@ -294,6 +306,7 @@ int main() 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) }; return cmocka_run_group_tests(tests, setup_group, teardown_group); -- 2.47.3