cba3ece62aebe15f47bcf42894269520c64a124f
[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                     return 0;
58                 }
59             }
60             else
61             {
62                 sciErr = createMatrixOfBooleanInList(pvApiCtx, iVar, parent, item_position, nbRow, nbCol, intPtr);
63                 if (sciErr.iErr)
64                 {
65                     printError(&sciErr, 0);
66                     return 0;
67                 }
68             }
69
70             FREE(intPtr);
71         }
72         else
73         {
74             if ((dblPtr = (double *)MALLOC(sizeof(double) * nbRow * nbCol)) == NULL)
75             {
76                 Scierror(999, _("%s: No more memory.\n"), "CreateBooleanVariable");
77                 return FALSE;
78             }
79
80             for (K = 0; K < nbRow * nbCol; K++)
81             {
82                 dblPtr[K] = ((unsigned char*)matVariable->data)[K];
83             }
84
85             if (parent == NULL)
86             {
87                 sciErr = createMatrixOfDouble(pvApiCtx, iVar, nbRow, nbCol, dblPtr);
88                 if (sciErr.iErr)
89                 {
90                     printError(&sciErr, 0);
91                     return 0;
92                 }
93             }
94             else
95             {
96                 sciErr = createMatrixOfDoubleInList(pvApiCtx, iVar, parent, item_position, nbRow, nbCol, dblPtr);
97                 if (sciErr.iErr)
98                 {
99                     printError(&sciErr, 0);
100                     return 0;
101                 }
102             }
103
104             FREE(dblPtr);
105         }
106     }
107     else /* Multi-dimension array -> Scilab HyperMatrix */
108     {
109         piDims = (int*) MALLOC(matVariable->rank * sizeof(int));
110         if (piDims == NULL)
111         {
112             Scierror(999, _("%s: No more memory.\n"), "CreateBooleanVariable");
113             return FALSE;
114         }
115         for (K = 0; K < matVariable->rank; K++)
116         {
117             piDims[K] = (int)matVariable->dims[K];
118         }
119
120         CreateHyperMatrixVariable(pvApiCtx, iVar, matVariable->class_type, NULL, &matVariable->rank, piDims, matVariable, parent, item_position);
121
122         FREE(piDims);
123     }
124
125     return TRUE;
126 }
127