d80806811c6e83738aeabf32270232bf439f790a
[scilab.git] / scilab / modules / matio / src / cpp / CreateCellVariable.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Vincent COUVERT
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16
17 #include "gatewaystruct.hxx"
18 #include "cell.hxx"
19 #include "context.hxx"
20 #include "CreateMatlabTreeVariable.hxx"
21
22 extern "C"
23 {
24 #include "CreateMatlabVariable.h"
25 #include "api_scilab.h"
26 #include "sci_malloc.h"
27 #include "localization.h"
28 #include "Scierror.h"
29 #include "sciprint.h"
30 }
31
32 int CreateCellVariable(void *pvApiCtx, int iVar, matvar_t *matVariable, int * parent, int item_position)
33 {
34     types::GatewayStruct* pStr = (types::GatewayStruct*)pvApiCtx;
35     types::typed_list in = *pStr->m_pIn;
36     types::InternalType** out = pStr->m_pOut;
37     int  iSize = 1;
38
39     int rhs = iVar - *getNbInputArgument(pvApiCtx);
40
41     int iRank = matVariable->rank;
42     int* piDims = (int *)MALLOC(iRank * sizeof(int));
43
44     for (int i = 0; i < iRank; ++i)
45     {
46         piDims[i] = (int)matVariable->dims[i];
47         iSize *= piDims[i];
48     }
49
50     if ((iRank == 2) && ((piDims[0] * piDims[1]) <= 0))
51     {
52         types::Cell* pCell = new types::Cell();
53         out[rhs - 1] = pCell;
54         return TRUE;
55     }
56
57     types::Cell* pCell = new types::Cell(iRank, piDims);
58
59     matvar_t** allData = (matvar_t**)(matVariable->data);
60     types::InternalType** ppIT = new types::InternalType*[matVariable->data_size];
61     for (int i = 0; i < iSize; i++)
62     {
63         ppIT[i] = CreateMatlabTreeVariable(allData[i]);
64     }
65
66     pCell->set(ppIT);
67
68     out[rhs - 1] = pCell;
69
70     FREE(piDims);
71
72     return TRUE;
73 }