utf: module string 2
[scilab.git] / scilab / modules / string / src / c / strsplit.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2009 - 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.1-en.txt
10 *
11 */
12 /*----------------------------------------------------------------------------*/
13 #include <string.h>
14 #include "strsplit.h"
15 #include "sci_malloc.h"
16 #include "freeArrayOfString.h"
17 #include "charEncoding.h"
18 /*----------------------------------------------------------------------------*/
19 wchar_t **wide_strsplit(wchar_t * wcstringToSplit, double *indices, int sizeIndices, strsplit_error *ierr)
20 {
21     wchar_t **splitted = NULL;
22     *ierr = STRSPLIT_NO_ERROR;
23
24     if (wcstringToSplit)
25     {
26         int lengthToCopy = 0;
27         int lenString = (int)wcslen(wcstringToSplit);
28         int i = 0, j = 0;
29         wchar_t* wcStrDest = NULL;
30         wchar_t* wcStrSrc = NULL;
31
32         for (i = 0; i < sizeIndices; i++)
33         {
34             /* Check 2nd input matrix position */
35             if (((int)indices[i] <= 0) || ((int)indices[i] >= lenString))
36             {
37                 *ierr = STRSPLIT_INCORRECT_VALUE_ERROR;
38                 return NULL;
39             }
40
41             /* check 2nd input order */
42             if (sizeIndices > 1)
43             {
44                 if (i < (sizeIndices - 1))
45                 {
46                     if ((int)indices[i] >(int)indices[i + 1])
47                     {
48                         *ierr = STRSPLIT_INCORRECT_ORDER_ERROR;
49                         return NULL;
50                     }
51                 }
52             }
53         }
54
55         splitted = (wchar_t**)MALLOC(sizeof(wchar_t*) * (sizeIndices + 1));
56         if (splitted == NULL)
57         {
58             *ierr = STRSPLIT_MEMORY_ALLOCATION_ERROR;
59             return NULL;
60         }
61
62         for (i = 0; i < sizeIndices; i++)
63         {
64
65             if (i == 0)
66             {
67                 lengthToCopy = (int)indices[i];
68             }
69             else
70             {
71                 lengthToCopy = (int)indices[i] - (int)indices[i - 1];
72             }
73
74             splitted[i] = (wchar_t*)MALLOC(sizeof(wchar_t) * (lengthToCopy + 1));
75             wcStrDest = splitted[i];
76
77             if (splitted[i] == NULL)
78             {
79                 freeArrayOfWideString(splitted, sizeIndices);
80                 *ierr = STRSPLIT_MEMORY_ALLOCATION_ERROR;
81                 return NULL;
82             }
83             wcStrSrc = &wcstringToSplit[j];
84             memcpy(wcStrDest, wcStrSrc, lengthToCopy * sizeof(wchar_t));
85             wcStrDest[lengthToCopy] = 0;
86
87             j = (int)indices[i];
88         }
89
90         lengthToCopy = lenString - (int)indices[sizeIndices - 1];
91         splitted[sizeIndices] = (wchar_t*)MALLOC(sizeof(wchar_t) * (lengthToCopy + 1));
92         wcStrDest = splitted[sizeIndices];
93
94         if (splitted[sizeIndices] == NULL)
95         {
96             freeArrayOfWideString(splitted, sizeIndices + 1);
97             *ierr = STRSPLIT_MEMORY_ALLOCATION_ERROR;
98             return NULL;
99         }
100
101         wcStrSrc = &wcstringToSplit[j];
102         memcpy(wcStrDest, wcStrSrc, lengthToCopy * sizeof(wchar_t));
103         wcStrDest[lengthToCopy] = 0;
104     }
105     return splitted;
106 }
107
108 char** strsplit(const char* stringToSplit, double *indices, int sizeIndices, strsplit_error *ierr)
109 {
110     wchar_t* w = to_wide_string(stringToSplit);
111     wchar_t** o = wide_strsplit(w, indices, sizeIndices, ierr);
112     if (*ierr == STRSPLIT_NO_ERROR)
113     {
114         char** output = (char**)MALLOC(sizeof(char*) * (sizeIndices + 1));
115         for (int i = 0; i < sizeIndices + 1; ++i)
116         {
117             output[i] = wide_string_to_UTF8(o[i]);
118         }
119
120         freeArrayOfWideString(o, sizeIndices + 1);
121         return output;
122     }
123
124     return NULL;
125 }
126 /*----------------------------------------------------------------------------*/