]> gitweb.hhaalo.de Git - mv_none_space.git/commitdiff
count pattern into extra method
authorBastian Dehn <hhaalo@arcor.de>
Thu, 12 Mar 2026 19:14:14 +0000 (20:14 +0100)
committerBastian Dehn <hhaalo@arcor.de>
Thu, 12 Mar 2026 19:14:14 +0000 (20:14 +0100)
src/rename.c

index da3b2b5a1be62472b7a2a37f4cb45f55584dd22f..a2e573cde9d340087534f7cd4ec0bcb23f44a73e 100644 (file)
@@ -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;