#include "shared.h"
-char * searchAndReplace2(char* orig, char* search, char*value)
-{
- char *p;
- size_t total_len = strlen(orig);
- size_t token_len = strlen(search);
- size_t value_len = strlen(value);
-
- int inx_start = 0;
- char * tmp = NULL;
- int tmp_offset = 0;
- int total_bytes_allocated = 0;
- int from = 0;
- p = strstr(orig, search);
- if(p==NULL)
- {
- os_strdup(orig,tmp);
-
- return tmp;
- }
- if (value==NULL)
- {
- value="";
- }
- inx_start = p - orig;
-
- while (p != NULL)
- {
- if (inx_start > 0)
- {
- if (tmp == NULL)
- {
- int len_to_add = (inx_start);
-
- tmp = (char*) malloc(sizeof(char) * len_to_add);
- total_bytes_allocated += len_to_add;
-
- strncpy(tmp, orig + tmp_offset, inx_start);
- tmp_offset = inx_start;
- }
-
- total_bytes_allocated += value_len;
- tmp = (char*) realloc(tmp, total_bytes_allocated);
-
- strncpy(tmp + tmp_offset, value, value_len);
- tmp_offset += value_len;
-
- p = strstr(orig + inx_start + token_len, search);
- if(p!=NULL)
- {
- inx_start = p - orig;
- from = inx_start + token_len;
- if (inx_start - tmp_offset > 0)
- {
- total_bytes_allocated += inx_start - from;
- tmp = (char*) realloc(tmp, total_bytes_allocated);
- strncpy(tmp + tmp_offset, orig + from, inx_start - from);
- tmp_offset += inx_start - from;
- }
- }//No more coincidences.
- else
- {
- from = inx_start + token_len;
- }
+char *searchAndReplace(const char *orig, const char *search, const char *value)
+{
+ char *p;
+ const size_t orig_len = strlen(orig);
+ const size_t search_len = strlen(search);
+ const size_t value_len = strlen(value);
+
+ size_t inx_start;
+ char *tmp = NULL;
+ size_t tmp_offset = 0;
+ size_t total_bytes_allocated = 1;
+ size_t from;
+
+ /* Check for any match */
+ p = strstr(orig, search);
+ if (p == NULL) {
+ os_strdup(orig, tmp);
+
+ return tmp;
}
- }
- if ((from < total_len) && from>0)
- {
- total_bytes_allocated += total_len - from;//((from - (int)token_len) + (int)value_len);
- tmp = (char*) realloc(tmp, total_bytes_allocated+1);
- strncpy(tmp + tmp_offset, orig + from, total_len - from);
- }
- tmp[total_bytes_allocated]='\0';
-
- return tmp;
-}
-#include "shared.h"
-char * searchAndReplace(char* orig, char* search, char*value)
-{
- char *p;
- size_t total_len = strlen(orig);
- size_t token_len = strlen(search);
- size_t value_len = strlen(value);
-
- int inx_start = 0;
- char * tmp = NULL;
- int tmp_offset = 0;
- int total_bytes_allocated = 0;
- int from = 0;
- p = strstr(orig, search);
- if(p==NULL)
- {
- os_strdup(orig,tmp);
+ inx_start = (size_t) (p - orig);
+ from = inx_start + search_len;
- return tmp;
- }
- if (value==NULL)
- {
- value="";
- }
- inx_start = p - orig;
-
- while (p != NULL)
- {
- if (inx_start > 0)
- {
- if (tmp == NULL)
- {
- int len_to_add = (inx_start);
-
- tmp = (char*) malloc(sizeof(char) * len_to_add);
- total_bytes_allocated += len_to_add;
-
- strncpy(tmp, orig + tmp_offset, inx_start);
+ /* Copy content before first match, if any */
+ if (inx_start > 0) {
+ total_bytes_allocated = inx_start + 1;
+ tmp = (char *) malloc(sizeof(char) * total_bytes_allocated);
+ strncpy(tmp, orig, inx_start);
tmp_offset = inx_start;
- }
-
- total_bytes_allocated += value_len;
- tmp = (char*) realloc(tmp, total_bytes_allocated);
-
- strncpy(tmp + tmp_offset, value, value_len);
- tmp_offset += value_len;
+ }
+ while (p != NULL) {
+ /* Copy replacement */
+ total_bytes_allocated += value_len;
+ os_realloc(tmp, total_bytes_allocated, tmp);
+
+ strncpy(tmp + tmp_offset, value, value_len);
+ tmp_offset += value_len;
+
+ /* Search for further occurrences */
+ p = strstr(orig + inx_start + search_len, search);
+ if (p != NULL) {
+ size_t inx_start2 = (size_t) (p - orig);
+
+ /* Copy content between matches, if any */
+ if (inx_start2 > from) {
+ size_t gap = inx_start2 - from;
+ total_bytes_allocated += gap;
+ os_realloc(tmp, total_bytes_allocated, tmp);
+ strncpy(tmp + tmp_offset, orig + from, gap);
+ tmp_offset += gap;
+ }
+
+ inx_start = inx_start2;
+ }
- p = strstr(orig + inx_start + token_len, search);
+ /* Set position for copying content after last match */
+ from = inx_start + search_len;
+ }
- if(p!=NULL)
- {
- inx_start = p - orig;
- from = inx_start + token_len;
- if (inx_start - tmp_offset > 0)
- {
- total_bytes_allocated += inx_start - from;
- tmp = (char*) realloc(tmp, total_bytes_allocated);
- strncpy(tmp + tmp_offset, orig + from, inx_start - from);
- tmp_offset += inx_start - from;
- }
- }//No more coincidences.
- else
- {
- from = inx_start + token_len;
- }
+ /* Copy content after last match, if any */
+ if ((from < orig_len) && from > 0) {
+ total_bytes_allocated += orig_len - from;
+ os_realloc(tmp, total_bytes_allocated, tmp);
+ strncpy(tmp + tmp_offset, orig + from, orig_len - from);
}
- }
- if ((from < total_len) && from>0)
- {
- total_bytes_allocated += total_len - from;//((from - (int)token_len) + (int)value_len);
- tmp = (char*) realloc(tmp, total_bytes_allocated+1);
- strncpy(tmp + tmp_offset, orig + from, total_len - from);
- }
- tmp[total_bytes_allocated]='\0';
+ tmp[total_bytes_allocated - 1] = '\0';
- return tmp;
+ return tmp;
}
-//escape newlines characters. Returns a new allocated string.
-char* escape_newlines(char *orig)
+/* Escape newline characters. Returns a new allocated string. */
+char *escape_newlines(const char *orig)
{
- const char *ptr;
- char *ret, *retptr;
- int size;
-
- ptr = orig;
- size = 1;
- while (*ptr)
- {
- if ((*ptr == '\n') ||(*ptr == '\r'))
- size += 2;
- else
- size += 1;
- ptr++;
- }
-
- ret = malloc (size);
- ptr = orig;
- retptr = ret;
- while (*ptr) {
- if (*ptr == '\n') {
- *retptr = '\\';
- *(retptr+1) = 'n';
- retptr += 2;
- }
- else if (*ptr == '\r') {
- *retptr = '\\';
- *(retptr+1) = 'n';
- retptr += 2;
+ const char *ptr;
+ char *ret, *retptr;
+ size_t size;
+
+ ptr = orig;
+ size = 1;
+ while (*ptr) {
+ if ((*ptr == '\n') || (*ptr == '\r')) {
+ size += 2;
+ } else {
+ size += 1;
+ }
+ ptr++;
}
- else {
- *retptr = *ptr;
- retptr ++;
+
+ ret = (char *) malloc (size);
+ ptr = orig;
+ retptr = ret;
+ while (*ptr) {
+ if (*ptr == '\n') {
+ *retptr = '\\';
+ *(retptr + 1) = 'n';
+ retptr += 2;
+ } else if (*ptr == '\r') {
+ *retptr = '\\';
+ *(retptr + 1) = 'n';
+ retptr += 2;
+ } else {
+ *retptr = *ptr;
+ retptr ++;
+ }
+ ptr++;
}
- ptr++;
- }
- *retptr = '\0';
+ *retptr = '\0';
- return ret;
+ return ret;
}