322847badf23f5b42a9124f314c19d107d9e6cea
[scilab.git] / scilab / modules / matio / src / c / CreateCellVariable.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Vincent COUVERT 
4  * 
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at    
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "CreateMatlabVariable.h"
14 #include "api_scilab.h"
15 #include "MALLOC.h"
16 #include "localization.h"
17 #include "Scierror.h"
18 #include "sciprint.h"
19
20
21 #define MATIO_ERROR if(_SciErr.iErr) \
22     {                                \
23       printError(&_SciErr, 0);       \
24       return 0;                      \
25     }
26
27 int CreateCellVariable(int iVar, matvar_t *matVariable, int * parent, int item_position)
28 {
29   static const char *fieldNames[] = {"ce", "dims","entries"};
30   int nbFields = 3;
31   int K = 0;
32   int prodDims = 0;
33   int valueIndex = 0, type;
34   int * cell_addr = NULL;
35   int * cell_entry_addr = NULL;
36   matvar_t ** allData = NULL;
37   SciErr _SciErr;
38
39   /* Returned mlist initialization */
40   if (parent==NULL)
41     {
42       _SciErr = createMList(pvApiCtx, iVar, nbFields, &cell_addr); MATIO_ERROR;
43     }
44   else
45     {
46       _SciErr = createMListInList(pvApiCtx, iVar, parent, item_position, nbFields, &cell_addr); MATIO_ERROR;
47     }
48  
49   /* FIRST LIST ENTRY: fieldnames */
50   _SciErr = createMatrixOfStringInList(pvApiCtx, iVar, cell_addr, 1, 1, nbFields, (char **)fieldNames); MATIO_ERROR;
51   
52   /* SECOND LIST ENTRY: Dimensions (int32 type) */
53   if(matVariable->rank==2) /* Two dimensions */
54     {
55       _SciErr = createMatrixOfInteger32InList(pvApiCtx, iVar, cell_addr, 2, 1, matVariable->rank, matVariable->dims); MATIO_ERROR;
56     }
57   else /* 3 or more dimensions -> Scilab HyperMatrix */
58     {
59       type = I_INT32;
60       CreateHyperMatrixVariable(iVar, MATRIX_OF_VARIABLE_SIZE_INTEGER_DATATYPE, 
61                                 &type, &matVariable->rank, matVariable->dims, matVariable->data,
62                                 NULL, cell_addr, 2);
63     }
64
65   /* ALL OTHER ENTRIES: Fields data */
66   prodDims = 1;
67   for (K=0; K<matVariable->rank; K++)
68     {
69       prodDims *= matVariable->dims[K];
70     }
71
72   allData = (matvar_t**) (matVariable->data);
73
74   if (prodDims == 1) /* Scalar cell */
75     {
76       /* Create list entry in the stack */
77       if (!CreateMatlabVariable(iVar, allData[0], cell_addr, 3)) /* Could not Create Variable */
78         {
79           sciprint("Do not know how to read a variable of class %d.\n", allData[0]->class_type);
80         }
81     }
82   else
83     {
84       _SciErr = createListInList(pvApiCtx, iVar, cell_addr, 3, prodDims, &cell_entry_addr); MATIO_ERROR;
85
86       for (valueIndex = 0; valueIndex < prodDims; valueIndex++)
87         {
88           /* Create list entry in the stack */
89           if (!CreateMatlabVariable(iVar, allData[valueIndex], cell_entry_addr, valueIndex+1)) /* Could not Create Variable */
90             {
91               sciprint("Do not know how to read a variable of class %d.\n", allData[valueIndex]->class_type);
92             }
93         }
94     }
95   
96   return TRUE;
97 }