484f2a4495edf6e031b1c429baeb0638ac1ac67f
[scilab.git] / scilab / modules / matio / src / cpp / CreateStructVariable.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  *
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 "gatewaystruct.hxx"
18 #include "struct.hxx"
19 #include "string.hxx"
20 #include "context.hxx"
21 #include "CreateMatlabTreeVariable.hxx"
22
23 extern "C"
24 {
25 #include "CreateMatlabVariable.h"
26 #include "api_scilab.h"
27 #include "sci_malloc.h"
28 #include "localization.h"
29 #include "Scierror.h"
30 #include "sciprint.h"
31 }
32
33 int CreateStructVariable(void *pvApiCtx, int iVar, matvar_t *matVariable, int * parent, int item_position)
34 {
35     types::GatewayStruct* pStr = (types::GatewayStruct*)pvApiCtx;
36     types::typed_list in = *pStr->m_pIn;
37     types::InternalType** out = pStr->m_pOut;
38     int  iSize = 1;
39
40     int rhs = iVar - *getNbInputArgument(pvApiCtx);
41
42     int iRank = matVariable->rank;
43     int* piDims = (int *)MALLOC(iRank * sizeof(int));
44
45     for (int i = 0; i < iRank; ++i)
46     {
47         piDims[i] = (int)matVariable->dims[i];
48         iSize *= piDims[i];
49     }
50
51     if (matVariable->data == NULL)
52     {
53         types::Struct* pStruct = new types::Struct();
54         out[rhs - 1] = pStruct;
55         return TRUE;
56     }
57
58     types::Struct* pStruct = new types::Struct(iRank, piDims);
59
60     matvar_t** allData = (matvar_t**)(matVariable->data);
61
62     int iSizeStruct = Mat_VarGetNumberOfFields(matVariable);
63     for (int i = 0; i < iSizeStruct; i++)
64     {
65         std::wstring wstField(to_wide_string((char*)allData[i]->name));
66         pStruct->addField(wstField);
67     }
68
69     for (int i = 0; i < iSize; i++)
70     {
71         for (int j = 0; j < iSizeStruct; j++)
72         {
73             std::wstring wstField(to_wide_string((char*)allData[j]->name));
74             pStruct->get(i)->set(wstField, CreateMatlabTreeVariable(allData[i * iSizeStruct + j]));
75         }
76     }
77
78     out[rhs - 1] = pStruct;
79
80     FREE(piDims);
81
82     return TRUE;
83 }
84