Coverity: Matio module memory leaks fixed
[scilab.git] / scilab / modules / matio / src / c / CreateCharVariable.c
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  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16 #include <string.h>
17
18 #include "api_scilab.h"
19 #include "CreateMatlabVariable.h"
20 #include "freeArrayOfString.h"
21 #include "os_string.h"
22 #include "sci_malloc.h"
23 #include "localization.h"
24 #include "Scierror.h"
25
26 int CreateCharVariable(void *pvApiCtx, int iVar, matvar_t *matVariable, int * parent, int item_position)
27 {
28     int nbRow = 0, nbCol = 0;
29     char **charData = NULL;
30     int K = 0, L = 0;
31     SciErr sciErr;
32
33     if (matVariable->rank == 2) /* 2-D array */
34     {
35         nbRow = (int)matVariable->dims[0];
36         nbCol = nbRow == 0 ? 0 : 1; /* In Scilab empty string has size 0x0 */
37
38         if (nbRow != 0)
39         {
40             charData =  (char**) MALLOC(sizeof(char*) * nbRow);
41             if (charData == NULL)
42             {
43                 Scierror(999, _("%s: No more memory.\n"), "CreateCharVariable");
44                 return FALSE;
45             }
46         }
47
48         for (K = 0; K < nbRow; K++)
49         {
50             charData[K] =  (char*) MALLOC(sizeof(char) * (matVariable->dims[1] + 1));
51             if (charData[K] == NULL)
52             {
53                 Scierror(999, _("%s: No more memory.\n"), "CreateCharVariable");
54                 freeArrayOfString(charData, K);
55                 return FALSE;
56             }
57         }
58
59         /* Fill items: data in Matlab file is stored columnwise */
60         for (K = 0; K < (int)matVariable->dims[0]; K++) /* Loop over items */
61         {
62             for (L = 0; L < (int)matVariable->dims[1]; L++) /* Loop over chars */
63             {
64                 charData[K][L] = ((char *)matVariable->data)[L * matVariable->dims[0] + K];
65             }
66             charData[K][L] = '\0';
67         }
68
69         if (nbRow * nbCol != 0)
70         {
71             if (parent == NULL)
72             {
73                 sciErr = createMatrixOfString(pvApiCtx, iVar, nbRow, nbCol, charData);
74                 if (sciErr.iErr)
75                 {
76                     printError(&sciErr, 0);
77                     freeArrayOfString(charData, nbRow);
78                     return 0;
79                 }
80             }
81             else
82             {
83                 sciErr = createMatrixOfStringInList(pvApiCtx, iVar, parent, item_position, nbRow, nbCol, charData);
84                 if (sciErr.iErr)
85                 {
86                     printError(&sciErr, 0);
87                     freeArrayOfString(charData, nbRow);
88                     return 0;
89                 }
90             }
91         }
92         else /* Empty character string */
93         {
94             if (parent == NULL)
95             {
96                 createSingleString(pvApiCtx, iVar, "\0");
97             }
98             else
99             {
100                 char ** tmp_char = (char **)MALLOC(sizeof(char *));
101                 tmp_char[0] = os_strdup("\0");
102                 sciErr = createMatrixOfStringInList(pvApiCtx, iVar, parent, item_position, 1, 1, tmp_char);
103                 if (sciErr.iErr)
104                 {
105                     printError(&sciErr, 0);
106                     freeArrayOfString(tmp_char, 1);
107                     return 0;
108                 }
109                 freeArrayOfString(tmp_char, 1);
110             }
111         }
112
113         freeArrayOfString(charData, nbRow * nbCol);
114     }
115     else /* Multi-dimension array -> Scilab HyperMatrix */
116     {
117         Scierror(999, _("%s: N-D arrays of chars not implemented.\n"), "CreateCharVariable");
118         return FALSE;
119     }
120
121     return TRUE;
122 }