new upstream release (3.3.0); modify package compatibility for Stretch
[ossec-hids.git] / src / shared / custom_output_search_replace.c
1 #include "shared.h"
2
3
4 char *searchAndReplace(const char *orig, const char *search, const char *value)
5 {
6     char *p;
7     const size_t orig_len = strlen(orig);
8     const size_t search_len = strlen(search);
9     const size_t value_len = strlen(value);
10
11     size_t inx_start;
12     char *tmp = NULL;
13     size_t tmp_offset = 0;
14     size_t total_bytes_allocated = 1;
15     size_t from;
16
17     /* Check for any match */
18     p = strstr(orig, search);
19     if (p == NULL) {
20         os_strdup(orig, tmp);
21
22         return tmp;
23     }
24
25     inx_start = (size_t) (p - orig);
26     from = inx_start + search_len;
27
28     /* Copy content before first match, if any */
29     if (inx_start > 0) {
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;
34     }
35
36     while (p != NULL) {
37         /* Copy replacement */
38         total_bytes_allocated += value_len;
39         os_realloc(tmp, total_bytes_allocated, tmp);
40
41         strncpy(tmp + tmp_offset, value, value_len);
42         tmp_offset += value_len;
43
44         /* Search for further occurrences */
45         p = strstr(orig + inx_start + search_len, search);
46         if (p != NULL) {
47             size_t inx_start2 = (size_t) (p - orig);
48
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);
55                 tmp_offset += gap;
56             }
57
58             inx_start = inx_start2;
59         }
60
61         /* Set position for copying content after last match */
62         from = inx_start + search_len;
63     }
64
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);
70     }
71
72     tmp[total_bytes_allocated - 1] = '\0';
73
74     return tmp;
75 }
76
77 /* Escape newline characters. Returns a new allocated string. */
78 char *escape_newlines(const char *orig)
79 {
80     const char *ptr;
81     char *ret, *retptr;
82     size_t size;
83
84     ptr = orig;
85     size = 1;
86     while (*ptr) {
87         if ((*ptr == '\n') || (*ptr == '\r')) {
88             size += 2;
89         } else {
90             size += 1;
91         }
92         ptr++;
93     }
94
95     ret = (char *) malloc (size);
96     ptr = orig;
97     retptr = ret;
98     while (*ptr) {
99         if (*ptr == '\n') {
100             *retptr = '\\';
101             *(retptr + 1) = 'n';
102             retptr += 2;
103         } else if (*ptr == '\r') {
104             *retptr = '\\';
105             *(retptr + 1) = 'n';
106             retptr += 2;
107         } else {
108             *retptr = *ptr;
109             retptr ++;
110         }
111         ptr++;
112     }
113     *retptr = '\0';
114
115     return ret;
116 }