tidy up your spreadsheet module
[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  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12 #include <string.h>
13 #ifndef _MSC_VER
14 #include <stddef.h>
15 #endif
16 #include "csv_strsubst.h"
17 #include "MALLOC.h"
18 #ifdef _MSC_VER
19 #include "strdup_windows.h"
20 #endif
21 // =============================================================================
22 char *csv_strsubst(const char *input_string, const char *string_to_search, const char *replacement_string)
23 {
24     char *result = NULL, *r = NULL;
25     const char *p = NULL, *q = NULL;
26
27     size_t string_to_searchlen = 0;
28     size_t count = 0, resultlen = 0, replacement_stringlen = 0;
29
30     if (input_string == NULL)
31     {
32         return NULL;
33     }
34     if (string_to_search == NULL)
35     {
36         return strdup(input_string);
37     }
38     if (replacement_string == NULL)
39     {
40         return strdup(input_string);
41     }
42
43     string_to_searchlen = strlen(string_to_search);
44     replacement_stringlen = strlen(replacement_string);
45
46     if (string_to_searchlen != replacement_stringlen)
47     {
48         for (count = 0, p = input_string; (q = strstr(p, string_to_search)) != NULL; p = q + string_to_searchlen)
49         {
50             count++;
51         }
52         resultlen = p - input_string + strlen(p) + count * (replacement_stringlen - string_to_searchlen);
53     }
54     else
55     {
56         resultlen = strlen(input_string);
57     }
58
59     if (resultlen + 1 > 0)
60     {
61         result = (char*)CALLOC(resultlen + 1, sizeof(char));
62     }
63     if (result)
64     {
65         for (r = result, p = input_string; (q = strstr(p, string_to_search)) != NULL; p = q + string_to_searchlen)
66         {
67
68             ptrdiff_t l = q - p;
69             memcpy(r, p, l);
70             r += l;
71             memcpy(r, replacement_string, replacement_stringlen);
72             r += replacement_stringlen;
73         }
74         strcpy(r, p);
75     }
76
77     return result;
78 }
79 // =============================================================================