From 30465f8b44e79fe0cf0c8c3a6bf1b8805d3ffb0c Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Thu, 12 Mar 2026 20:14:14 +0100 Subject: [PATCH] count pattern into extra method --- src/rename.c | 58 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/src/rename.c b/src/rename.c index da3b2b5..a2e573c 100644 --- a/src/rename.c +++ b/src/rename.c @@ -17,41 +17,53 @@ char* strdup(const char* str) return value; } -char* replace(char** src, const char* pattern, const char* replace_str) +uint8_t _count_pattern(const char* src, const char* pattern) { - const size_t len = strlen(*src); - const size_t plen = strlen(pattern); + const size_t length = strlen(src); + const size_t pattern_length = strlen(pattern); - uint32_t count = 0; - for (uint32_t i = 0; i < len; i++) { - if (strncmp(*src + i, pattern, plen) == 0) + uint8_t count = 0; + for (uint8_t i = 0; i < length; i++) { + if (strncmp(&src[i], pattern, pattern_length) == 0) count++; } + return count; +} + +char* replace(char** src, const char* pattern, const char* replace_str) +{ + uint8_t count = _count_pattern(*src, pattern); if (count == 0) return *src; - 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); + const size_t src_length = strlen(*src); + const size_t pattern_length = strlen(pattern); + const size_t replace_length = strlen(replace_str); + + const size_t diff_length = (replace_length - pattern_length) * count; + const size_t output_length = src_length + diff_length + 1; + + char* output = malloc(output_length); if (output == NULL) return NULL; - memset(output, 0, outlen); - - uint32_t inpos = 0; - uint32_t outpos = 0; - for (uint32_t i = 0; i < len; i++) { - if (strncmp(*src + i, pattern, plen) == 0) { - memcpy(&output[outpos], *src + inpos, i - inpos); - outpos += i - inpos; - memcpy(&output[outpos], replace_str, rlen); - inpos = i + plen; - i += plen - 1; - outpos += rlen; + memset(output, 0, output_length); + + uint32_t in_pos = 0; + uint32_t out_pos = 0; + for (uint32_t i = 0; i < src_length; i++) { + if (strncmp(*src + i, pattern, pattern_length) == 0) { + memcpy(&output[out_pos], *src + in_pos, i - in_pos); + out_pos += i - in_pos; + + memcpy(&output[out_pos], replace_str, replace_length); + out_pos += replace_length; + in_pos = i + pattern_length; + + i += pattern_length - 1; } } - memcpy(&output[outpos], *src + inpos, len - inpos + 1); + memcpy(&output[out_pos], *src + in_pos, src_length - in_pos + 1); free(*src); *src = NULL; -- 2.47.3