new upstream release (3.3.0); modify package compatibility for Stretch
[ossec-hids.git] / src / shared / custom_output_search_replace.c
index 5fd6319..0a844b7 100644 (file)
 #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;
 }