Coverity #1321243, #1321246, #1321242, #1321236, #1321239, #1321238, #1097871, #13212...
[scilab.git] / scilab / modules / matio / src / cpp / GetCharVariable.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Vincent COUVERT
4  * Copyright (C) 2010 - DIGITEO - Yann COLLETTE
5  * Copyright (C) 2010 - DIGITEO - Vincent COUVERT
6  * Copyright (C) 2015 - Scilab Enterprises - Sylvain GENIN
7  *
8  * Copyright (C) 2012 - 2016 - Scilab Enterprises
9  *
10  * This file is hereby licensed under the terms of the GNU GPL v2.0,
11  * pursuant to article 5.3.4 of the CeCILL v.2.1.
12  * This file was originally licensed under the terms of the CeCILL v2.1,
13  * and continues to be available under such terms.
14  * For more information, see the COPYING file which you should have received
15  * along with this program.
16  *
17  */
18
19 #include "GetMatlabVariable.hxx"
20 #include "ConvertSciVarToMatVar.hxx"
21
22 extern "C"
23 {
24 #include <string.h>
25 #include "api_scilab.h"
26 #include "sci_types.h"
27 #include "freeArrayOfString.h"
28 #include "sci_malloc.h"
29 #include "localization.h"
30 }
31
32 matvar_t *GetCharVariable(void *pvApiCtx, int iVar, const char *name, int * parent, int item_position)
33 {
34     types::GatewayStruct* pGS = (types::GatewayStruct*)pvApiCtx;
35     types::typed_list in = *pGS->m_pIn;
36
37     if (in[iVar - 1]->isString() == false)
38     {
39         Scierror(999, _("%s: Wrong type for first input argument: string expected.\n"), "GetCharVariable");
40         return NULL;
41     }
42
43     types::String* pStr = in[iVar - 1]->getAs<types::String>();
44
45     return GetCharMatVar(pStr, name);
46 }
47
48 matvar_t* GetCharMatVar(types::String* pStr, const char* name)
49 {
50     int Dims = pStr->getDims();
51     int* pDims = pStr->getDimsArray();
52     matvar_t * pMatVarOut = NULL;
53     int iLen = 0;
54
55     if (Dims > 2)
56     {
57         Scierror(999, _("%s: 2D array of strings saving is not implemented.\n"), "GetCharMatVar");
58         return NULL;
59     }
60
61     if (pDims[1] != 1)
62     {
63         if (pDims[0] != 1)
64         {
65             Scierror(999, _("%s: 2D array of strings saving is not implemented.\n"), "GetCharMatVar");
66         }
67         else
68         {
69             Scierror(999, _("%s: Row array of strings saving is not implemented.\n"), "GetCharMatVar");
70         }
71         return NULL;
72     }
73
74
75     char* pcName = NULL;
76     iLen = wcslen(pStr->get(0));
77
78     for (int i = 1; i < pStr->getSize(); ++i)
79     {
80         pcName = wide_string_to_UTF8(pStr->get(i));
81         if (iLen != strlen(pcName))
82         {
83             Scierror(999, _("%s: Column array of strings with different lengths saving is not implemented.\n"), "GetCharMatVar");
84             FREE(pcName);
85             return NULL;
86         }
87         FREE(pcName);
88     }
89
90     size_t* psize_t = (size_t*)MALLOC(Dims * sizeof(size_t));
91     if (psize_t == NULL)
92     {
93         Scierror(999, _("%s: No more memory.\n"), "GetCharMatVar");
94         return NULL;
95     }
96
97     /* Reorder characters */
98     char* pstMatData = NULL;
99     if (iLen != 0)
100     {
101
102         char** ppcName = (char**)MALLOC(sizeof(char*) * pDims[0] * pDims[1]);
103         if (ppcName == NULL)
104         {
105             FREE(psize_t);
106             Scierror(999, _("%s: No more memory.\n"), "GetCharMatVar");
107             return NULL;
108         }
109
110         pstMatData = (char*)MALLOC(sizeof(char) * pDims[0] * iLen);
111         if (pstMatData == NULL)
112         {
113             FREE(ppcName);
114             FREE(psize_t);
115             Scierror(999, _("%s: No more memory.\n"), "GetCharMatVar");
116             return NULL;
117         }
118
119         for (int i = 0; i < pDims[0]; ++i)
120         {
121             ppcName[i] = wide_string_to_UTF8(pStr->get(i));
122             if (ppcName[i] == NULL)
123             {
124                 for (int idelete = 0; idelete < i; ++idelete)
125                 {
126                     FREE(ppcName[idelete]);
127                 }
128                 FREE(ppcName);
129                 FREE(pstMatData);
130                 FREE(psize_t);
131                 Scierror(999, _("%s: No more memory.\n"), "GetCharMatVar");
132                 return NULL;
133             }
134         }
135
136         for (int i = 0; i < pDims[0]; ++i)
137         {
138             for (int j = 0; j < iLen; ++j)
139             {
140                 pstMatData[i + j * pDims[0]] = ppcName[i][j];
141             }
142         }
143
144         for (int i = 0; i < pDims[0]; ++i)
145         {
146             FREE(ppcName[i]);
147         }
148
149         FREE(ppcName);
150     }
151
152     /* Save the variable */
153     psize_t[0] = pDims[0];
154     psize_t[1] = iLen;
155
156     pMatVarOut = Mat_VarCreate(name, MAT_C_CHAR, MAT_T_UINT8, Dims, psize_t, pstMatData, 0);
157
158     FREE(pstMatData);
159     FREE(psize_t);
160
161     return pMatVarOut;
162 }
163