* Port to matio 1.5.0 * Code cleaning * Prepare code for Scilab 6 (YaSp branch merge)
[scilab.git] / scilab / modules / matio / src / c / GetMlistVariable.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 <string.h>
15
16 #include "GetMatlabVariable.h"
17 #include "sci_types.h"
18 #include "api_scilab.h"
19
20 #include "freeArrayOfString.h"
21 #include "MALLOC.h"
22
23 matvar_t *GetMlistVariable(void *pvApiCtx, int iVar, const char *name, int matfile_version, int * parent, int item_position)
24 {
25     char **fieldNames = NULL;
26     int * pilen = NULL;
27     int nbRow = 0, nbFields = 0, i;
28     int * var_addr = NULL;
29     int var_type;
30     SciErr sciErr;
31     matvar_t * tmp_res = NULL;
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
63     if (var_type == sci_mlist)
64     {
65         /* FIRST LIST ENTRY: fieldnames */
66         sciErr    = getMatrixOfStringInList(pvApiCtx, var_addr, 1, &nbRow, &nbFields, NULL, NULL);
67         if (sciErr.iErr)
68         {
69             printError(&sciErr, 0);
70             return 0;
71         }
72         pilen      = (int *)MALLOC(nbRow * nbFields * sizeof(int));
73         fieldNames = (char **)MALLOC(nbRow * nbFields * sizeof(char *));
74         sciErr    = getMatrixOfStringInList(pvApiCtx, var_addr, 1, &nbRow, &nbFields, pilen, NULL);
75         if (sciErr.iErr)
76         {
77             printError(&sciErr, 0);
78             return 0;
79         }
80         for (i = 0; i < nbRow * nbFields; i++)
81         {
82             fieldNames[i] = (char *)MALLOC((pilen[i] + 1) * sizeof(char));
83         }
84         sciErr = getMatrixOfStringInList(pvApiCtx, var_addr, 1, &nbRow, &nbFields, pilen, fieldNames);
85         if (sciErr.iErr)
86         {
87             printError(&sciErr, 0);
88             return 0;
89         }
90         FREE(pilen);
91
92         if (strcmp(fieldNames[0], "ce") == 0)
93         {
94             freeArrayOfString(fieldNames, nbRow * nbFields);
95             return GetCellVariable(pvApiCtx, iVar, name, matfile_version, parent, item_position);
96         }
97         else if (strcmp(fieldNames[0], "st") == 0)
98         {
99             tmp_res = GetStructVariable(pvApiCtx, iVar, name, matfile_version, fieldNames, nbFields, parent, item_position);
100             freeArrayOfString(fieldNames, nbFields);
101             return tmp_res;
102         }
103         else if (strcmp(fieldNames[0], "hm") == 0)
104         {
105             /* TODO */
106             Scierror(999, _("%s: Mlists of type %s can not be written to Matlab binary files.\n"), "GetMlistVariable", fieldNames[0]);
107             freeArrayOfString(fieldNames, nbFields);
108             return NULL;
109         }
110         else
111         {
112             Scierror(999, _("%s: Mlists of type %s can not be written to Matlab binary files.\n"), "GetMlistVariable", fieldNames[0]);
113             freeArrayOfString(fieldNames, nbFields);
114             return NULL;
115         }
116     }
117     else
118     {
119         Scierror(999, _("%s: Wrong type for first input argument: Mlist expected.\n"), "GetMlistVariable");
120         return NULL;
121     }
122 }