* Bug 16365 fixed: median(m,'r'|'c') was wrong after 5dc990
[scilab.git] / scilab / modules / spreadsheet / src / c / csv_strsubst.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010-2011 - DIGITEO - Allan CORNET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15 #include <string.h>
16 #ifndef _MSC_VER
17 #include <stddef.h>
18 #endif
19 #include "csv_strsubst.h"
20 #include "sci_malloc.h"
21 #include "os_strdup.h"
22 // =============================================================================
23 char *csv_strsubst(const char *input_string, const char *string_to_search, const char *replacement_string)
24 {
25     char *result = NULL, *r = NULL;
26     const char *p = NULL, *q = NULL;
27
28     size_t string_to_searchlen = 0;
29     size_t count = 0, resultlen = 0, replacement_stringlen = 0;
30
31     if (input_string == NULL)
32     {
33         return NULL;
34     }
35     if (string_to_search == NULL)
36     {
37         return os_strdup(input_string);
38     }
39     if (replacement_string == NULL)
40     {
41         return os_strdup(input_string);
42     }
43
44     string_to_searchlen = strlen(string_to_search);
45     replacement_stringlen = strlen(replacement_string);
46
47     if (string_to_searchlen != replacement_stringlen)
48     {
49         for (count = 0, p = input_string; (q = strstr(p, string_to_search)) != NULL; p = q + string_to_searchlen)
50         {
51             count++;
52         }
53         resultlen = p - input_string + strlen(p) + count * (replacement_stringlen - string_to_searchlen);
54     }
55     else
56     {
57         resultlen = strlen(input_string);
58     }
59
60     if (resultlen + 1 > 0)
61     {
62         result = (char*)CALLOC(resultlen + 1, sizeof(char));
63     }
64     if (result)
65     {
66         for (r = result, p = input_string; (q = strstr(p, string_to_search)) != NULL; p = q + string_to_searchlen)
67         {
68
69             ptrdiff_t l = q - p;
70             memcpy(r, p, l);
71             r += l;
72             memcpy(r, replacement_string, replacement_stringlen);
73             r += replacement_stringlen;
74         }
75         strcpy(r, p);
76     }
77
78     return result;
79 }
80 // =============================================================================