]> gitweb.hhaalo.de Git - mv_none_space.git/commitdiff
add replace function
authorBastian Dehn <hhaalo@arcor.de>
Mon, 2 Mar 2026 20:24:00 +0000 (21:24 +0100)
committerBastian Dehn <hhaalo@arcor.de>
Mon, 2 Mar 2026 20:24:00 +0000 (21:24 +0100)
src/rename.c
src/rename.h
tests/rename_tests.c

index 13ac5563bfd3bebc9a615aeecaac94c7d674bd68..35d6646e2c13542b975e0184e2bf0263505e0c71 100644 (file)
@@ -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
index 76334eb7bbeca9e33360181203a215c1c904df5a..90c2f194da3aa46fd417049a51b58ec4173a289f 100644 (file)
@@ -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
index 346db23f5f333979f6562680262e5f919a1ac398..a6e052c7ba8a6a6066d05e94681cffc398631290 100644 (file)
@@ -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);