4 char *searchAndReplace(const char *orig, const char *search, const char *value)
7 const size_t orig_len = strlen(orig);
8 const size_t search_len = strlen(search);
9 const size_t value_len = strlen(value);
13 size_t tmp_offset = 0;
14 size_t total_bytes_allocated = 1;
17 /* Check for any match */
18 p = strstr(orig, search);
25 inx_start = (size_t) (p - orig);
26 from = inx_start + search_len;
28 /* Copy content before first match, if any */
30 total_bytes_allocated = inx_start + 1;
31 tmp = (char *) malloc(sizeof(char) * total_bytes_allocated);
32 strncpy(tmp, orig, inx_start);
33 tmp_offset = inx_start;
37 /* Copy replacement */
38 total_bytes_allocated += value_len;
39 os_realloc(tmp, total_bytes_allocated, tmp);
41 strncpy(tmp + tmp_offset, value, value_len);
42 tmp_offset += value_len;
44 /* Search for further occurrences */
45 p = strstr(orig + inx_start + search_len, search);
47 size_t inx_start2 = (size_t) (p - orig);
49 /* Copy content between matches, if any */
50 if (inx_start2 > from) {
51 size_t gap = inx_start2 - from;
52 total_bytes_allocated += gap;
53 os_realloc(tmp, total_bytes_allocated, tmp);
54 strncpy(tmp + tmp_offset, orig + from, gap);
58 inx_start = inx_start2;
61 /* Set position for copying content after last match */
62 from = inx_start + search_len;
65 /* Copy content after last match, if any */
66 if ((from < orig_len) && from > 0) {
67 total_bytes_allocated += orig_len - from;
68 os_realloc(tmp, total_bytes_allocated, tmp);
69 strncpy(tmp + tmp_offset, orig + from, orig_len - from);
72 tmp[total_bytes_allocated - 1] = '\0';
77 /* Escape newline characters. Returns a new allocated string. */
78 char *escape_newlines(const char *orig)
87 if ((*ptr == '\n') || (*ptr == '\r')) {
95 ret = (char *) malloc (size);
103 } else if (*ptr == '\r') {