* Port to matio 1.5.0 * Code cleaning * Prepare code for Scilab 6 (YaSp branch merge)
[scilab.git] / scilab / modules / matio / src / c / GetCellVariable.c
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  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 #include "GetMatlabVariable.h"
15 #include "sci_types.h"
16 #include "api_scilab.h"
17
18 #include "freeArrayOfString.h"
19 #include "MALLOC.h"
20
21 matvar_t *GetCellVariable(void *pvApiCtx, int iVar, const char *name, int matfile_version, int * parent, int item_position)
22 {
23     int nbFields = 0;
24     int K = 0;
25     size_t *pszDims = NULL;
26     int prodDims = 1;
27     matvar_t *dimensionsVariable = NULL;
28     matvar_t **cellEntries = NULL;
29     int * var_addr = NULL;
30     int var_type;
31     SciErr sciErr;
32
33     if ((parent == NULL) && (item_position == -1))
34     {
35         sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &var_addr);
36         if (sciErr.iErr)
37         {
38             printError(&sciErr, 0);
39             return 0;
40         }
41     }
42     else if ((parent != NULL) && (item_position == -1))
43     {
44         var_addr = parent;
45     }
46     else
47     {
48         sciErr = getListItemAddress(pvApiCtx, parent, item_position, &var_addr);
49         if (sciErr.iErr)
50         {
51             printError(&sciErr, 0);
52             return 0;
53         }
54     }
55
56     sciErr = getVarType(pvApiCtx, var_addr, &var_type);
57     if (sciErr.iErr)
58     {
59         printError(&sciErr, 0);
60         return 0;
61     }
62     if (var_type != sci_mlist)
63     {
64         Scierror(999, _("%s: Wrong type for first input argument: Mlist expected.\n"), "GetCellVariable");
65         return FALSE;
66     }
67
68     sciErr = getListItemNumber(pvApiCtx, var_addr, &nbFields);
69     if (sciErr.iErr)
70     {
71         printError(&sciErr, 0);
72         return 0;
73     }
74
75     /* FIRST LIST ENTRY: fieldnames --> NO NEED TO BE READ */
76
77     /* SECOND LIST ENTRY: dimensions */
78     dimensionsVariable = GetMatlabVariable(pvApiCtx, iVar, "data", 0, var_addr, 2);
79
80     /* OTHERS LIST ENTRIES: ALL CELL VALUES */
81
82     pszDims = (size_t*) MALLOC(dimensionsVariable->rank * sizeof(size_t));
83     if (pszDims == NULL)
84     {
85         Scierror(999, _("%s: No more memory.\n"), "GetCellVariable");
86         return NULL;
87     }
88
89     /* Total number of entries */
90     for (K = 0; K < dimensionsVariable->rank; K++)
91     {
92         prodDims *= ((int*)dimensionsVariable->data)[K];
93         pszDims[K] = ((int*)dimensionsVariable->data)[K];
94     }
95
96     cellEntries = (matvar_t **) MALLOC(sizeof(matvar_t*) * prodDims);
97     if (cellEntries == NULL)
98     {
99         Scierror(999, _("%s: No more memory.\n"), "GetCellVariable");
100         return NULL;
101     }
102
103     if (prodDims == 1) /* Scalar cell array */
104     {
105         cellEntries[0] = GetMatlabVariable(pvApiCtx, iVar , "data", matfile_version, var_addr, 3);
106     }
107     else
108     {
109         /* Read all entries */
110         for (K = 0; K < prodDims; K++)
111         {
112             cellEntries[K] = GetMatlabVariable(pvApiCtx, iVar , "data", matfile_version, var_addr, 3 + K);
113         }
114     }
115
116     return Mat_VarCreate(name, MAT_C_CELL, MAT_T_CELL, dimensionsVariable->rank, pszDims, cellEntries, 0);
117 }