* Port to matio 1.5.0 * Code cleaning * Prepare code for Scilab 6 (YaSp branch merge)
[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 int CreateCellVariable(void *pvApiCtx, int iVar, matvar_t *matVariable, int * parent, int item_position)
21 {
22     static const char *fieldNames[] = {"ce", "dims", "entries"};
23     int nbFields = 3;
24     int K = 0;
25     int prodDims = 0;
26     int valueIndex = 0, type;
27     int * cell_addr = NULL;
28     int * cell_entry_addr = NULL;
29     matvar_t ** allData = NULL;
30     SciErr sciErr;
31
32     int *piDims = NULL;
33     int i = 0;
34
35     /* Returned mlist initialization */
36     if (parent == NULL)
37     {
38         sciErr = createMList(pvApiCtx, iVar, nbFields, &cell_addr);
39         if (sciErr.iErr)
40         {
41             printError(&sciErr, 0);
42             return 0;
43         }
44     }
45     else
46     {
47         sciErr = createMListInList(pvApiCtx, iVar, parent, item_position, nbFields, &cell_addr);
48         if (sciErr.iErr)
49         {
50             printError(&sciErr, 0);
51             return 0;
52         }
53     }
54
55     /* FIRST LIST ENTRY: fieldnames */
56     sciErr = createMatrixOfStringInList(pvApiCtx, iVar, cell_addr, 1, 1, nbFields, (const char **)fieldNames);
57     if (sciErr.iErr)
58     {
59         printError(&sciErr, 0);
60         return 0;
61     }
62
63     piDims = (int *) MALLOC(matVariable->rank * sizeof(int));
64     for (i = 0 ; i < matVariable->rank ; ++i)
65     {
66         piDims[i] = (int)matVariable->dims[i]; // Copy dims to make size_t values fit int
67     }
68
69     /* SECOND LIST ENTRY: Dimensions (int32 type) */
70     if (matVariable->rank == 2) /* Two dimensions */
71     {
72         sciErr = createMatrixOfInteger32InList(pvApiCtx, iVar, cell_addr, 2, 1, matVariable->rank, piDims);
73         if (sciErr.iErr)
74         {
75             printError(&sciErr, 0);
76             return 0;
77         }
78     }
79     else /* 3 or more dimensions -> Scilab HyperMatrix */
80     {
81         type = I_INT32;
82         CreateHyperMatrixVariable(pvApiCtx, iVar, MATRIX_OF_VARIABLE_SIZE_INTEGER_DATATYPE,
83                                   &type, &matVariable->rank, piDims, (double*)matVariable->data,
84                                   NULL, cell_addr, 2);
85     }
86
87     FREE(piDims);
88
89     /* ALL OTHER ENTRIES: Fields data */
90     prodDims = 1;
91     for (K = 0; K < matVariable->rank; K++)
92     {
93         prodDims *= (int)matVariable->dims[K];
94     }
95
96     allData = (matvar_t**) (matVariable->data);
97
98     if (prodDims == 1) /* Scalar cell */
99     {
100         /* Create list entry in the stack */
101         if (!CreateMatlabVariable(pvApiCtx, iVar, allData[0], cell_addr, 3)) /* Could not Create Variable */
102         {
103             sciprint("Do not know how to read a variable of class %d.\n", allData[0]->class_type);
104         }
105     }
106     else
107     {
108         sciErr = createListInList(pvApiCtx, iVar, cell_addr, 3, prodDims, &cell_entry_addr);
109         if (sciErr.iErr)
110         {
111             printError(&sciErr, 0);
112             return 0;
113         }
114
115         for (valueIndex = 0; valueIndex < prodDims; valueIndex++)
116         {
117             /* Create list entry in the stack */
118             if (!CreateMatlabVariable(pvApiCtx, iVar, allData[valueIndex], cell_entry_addr, valueIndex + 1)) /* Could not Create Variable */
119             {
120                 sciprint("Do not know how to read a variable of class %d.\n", allData[valueIndex]->class_type);
121             }
122         }
123     }
124
125     return TRUE;
126 }