67f97374f2fa2e79f8c521a6f88e8c148667a795
[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 #define MATIO_ERROR if(_SciErr.iErr) \
24     {                                \
25       printError(&_SciErr, 0);       \
26       return 0;                      \
27     }
28
29 #define DEBUG 1
30
31 matvar_t *GetMlistVariable(int iVar, const char *name, int matfile_version, int * parent, int item_position)
32 {
33   char **fieldNames = NULL;
34   int * pilen = NULL;
35   int nbRow = 0, nbFields = 0, i;
36   int * var_addr = NULL;
37   int var_type;
38   SciErr _SciErr;
39   matvar_t * tmp_res = NULL;
40
41   if ((parent==NULL)&&(item_position==-1))
42     {
43       _SciErr = getVarAddressFromPosition(pvApiCtx, iVar, &var_addr); MATIO_ERROR;
44     }
45   else if ((parent!=NULL)&&(item_position==-1))
46     {
47       var_addr = parent;
48     }
49   else
50     {
51       _SciErr = getListItemAddress(pvApiCtx, parent, item_position, &var_addr); MATIO_ERROR;
52     }
53
54   _SciErr = getVarType(pvApiCtx, var_addr, &var_type); MATIO_ERROR;
55
56   if (var_type == sci_mlist)
57     {
58       /* FIRST LIST ENTRY: fieldnames */
59       _SciErr    = getMatrixOfStringInList(pvApiCtx, var_addr, 1, &nbRow, &nbFields, NULL, NULL); MATIO_ERROR;
60       pilen      = (int *)MALLOC(nbRow*nbFields*sizeof(int));
61       fieldNames = (char **)MALLOC(nbRow*nbFields*sizeof(char *));
62       _SciErr    = getMatrixOfStringInList(pvApiCtx, var_addr, 1, &nbRow, &nbFields, pilen, NULL); MATIO_ERROR;
63       for(i=0;i<nbRow*nbFields;i++)
64         {
65           fieldNames[i] = (char *)MALLOC((pilen[i]+1)*sizeof(char));
66         }
67       _SciErr = getMatrixOfStringInList(pvApiCtx, var_addr, 1, &nbRow, &nbFields, pilen, fieldNames); MATIO_ERROR;
68       FREE(pilen);
69
70       if (strcmp(fieldNames[0], "ce")==0)
71         {
72           freeArrayOfString(fieldNames, nbRow * nbFields);
73           return GetCellVariable(iVar, name, matfile_version, parent, item_position);
74         }
75       else if (strcmp(fieldNames[0], "st")==0)
76         {
77           tmp_res = GetStructVariable(iVar, name, matfile_version, fieldNames, nbFields, parent, item_position);
78           freeArrayOfString(fieldNames, nbFields);
79           return tmp_res;
80         }
81       else if (strcmp(fieldNames[0], "hm")==0)
82         {
83           /* TODO */
84           Scierror(999, _("%s: Mlists of type %s can not be written to Matlab binary files.\n"), "GetMlistVariable", fieldNames[0]);
85           freeArrayOfString(fieldNames, nbFields);
86           return NULL;
87         }
88       else
89         {
90           Scierror(999, _("%s: Mlists of type %s can not be written to Matlab binary files.\n"), "GetMlistVariable", fieldNames[0]);
91           freeArrayOfString(fieldNames, nbFields);
92           return NULL;
93         }
94     }
95   else
96     {
97       Scierror(999, _("%s: Wrong type for first input argument: Mlist expected.\n"), "GetMlistVariable");
98       return NULL;
99     }
100 }