Coverity: Matio module memory leaks fixed
[scilab.git] / scilab / modules / matio / src / c / CreateBooleanVariable.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - 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
17 #include "api_scilab.h"
18 #include "CreateMatlabVariable.h"
19 #include "sci_malloc.h"
20 #include "localization.h"
21 #include "Scierror.h"
22 #include "sciprint.h"
23
24 int CreateBooleanVariable(void *pvApiCtx, int iVar, matvar_t *matVariable, int * parent, int item_position)
25 {
26     int nbRow = 0, nbCol = 0;
27     int *piDims = NULL;
28     int * intPtr = NULL;
29     double * dblPtr = NULL;
30     int K = 0;
31     SciErr sciErr;
32
33     if (matVariable->rank == 2) /* 2-D array */
34     {
35         nbRow = (int)matVariable->dims[0];
36         nbCol = (int)matVariable->dims[1];
37
38         if (nbRow * nbCol != 0)
39         {
40             if ((intPtr = (int*) MALLOC(sizeof(int) * nbRow * nbCol)) == NULL)
41             {
42                 Scierror(999, _("%s: No more memory.\n"), "CreateBooleanVariable");
43                 return FALSE;
44             }
45
46             for (K = 0; K < nbRow * nbCol; K++)
47             {
48                 intPtr[K] = ((unsigned char*)matVariable->data)[K];
49             }
50
51             if (parent == NULL)
52             {
53                 sciErr = createMatrixOfBoolean(pvApiCtx, iVar, nbRow, nbCol, intPtr);
54                 if (sciErr.iErr)
55                 {
56                     printError(&sciErr, 0);
57                     FREE(intPtr);
58                     return 0;
59                 }
60             }
61             else
62             {
63                 sciErr = createMatrixOfBooleanInList(pvApiCtx, iVar, parent, item_position, nbRow, nbCol, intPtr);
64                 if (sciErr.iErr)
65                 {
66                     printError(&sciErr, 0);
67                     FREE(intPtr);
68                     return 0;
69                 }
70             }
71
72             FREE(intPtr);
73         }
74         else
75         {
76             if ((dblPtr = (double *)MALLOC(sizeof(double) * nbRow * nbCol)) == NULL)
77             {
78                 Scierror(999, _("%s: No more memory.\n"), "CreateBooleanVariable");
79                 return FALSE;
80             }
81
82             for (K = 0; K < nbRow * nbCol; K++)
83             {
84                 dblPtr[K] = ((unsigned char*)matVariable->data)[K];
85             }
86
87             if (parent == NULL)
88             {
89                 sciErr = createMatrixOfDouble(pvApiCtx, iVar, nbRow, nbCol, dblPtr);
90                 if (sciErr.iErr)
91                 {
92                     printError(&sciErr, 0);
93                     FREE(dblPtr);
94                     return 0;
95                 }
96             }
97             else
98             {
99                 sciErr = createMatrixOfDoubleInList(pvApiCtx, iVar, parent, item_position, nbRow, nbCol, dblPtr);
100                 if (sciErr.iErr)
101                 {
102                     printError(&sciErr, 0);
103                     FREE(dblPtr);
104                     return 0;
105                 }
106             }
107
108             FREE(dblPtr);
109         }
110     }
111     else /* Multi-dimension array -> Scilab HyperMatrix */
112     {
113         piDims = (int*) MALLOC(matVariable->rank * sizeof(int));
114         if (piDims == NULL)
115         {
116             Scierror(999, _("%s: No more memory.\n"), "CreateBooleanVariable");
117             return FALSE;
118         }
119         for (K = 0; K < matVariable->rank; K++)
120         {
121             piDims[K] = (int)matVariable->dims[K];
122         }
123
124         CreateHyperMatrixVariable(pvApiCtx, iVar, matVariable->class_type, NULL, &matVariable->rank, piDims, matVariable, parent, item_position);
125
126         FREE(piDims);
127     }
128
129     return TRUE;
130 }
131