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;