13d8c7aa6dae686b84dbdcacdb8bd3ddb759c26b
[scilab.git] / scilab / modules / matio / sci_gateway / c / sci_matfile_listvar.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 "api_scilab.h"
15 #include "matfile_manager.h"
16 #include "gw_matio.h"
17 #include "localization.h"
18 #include "Scierror.h"
19 #include "MALLOC.h"
20 #include "freeArrayOfString.h"
21 #include "os_strdup.h"
22
23
24
25 #define MATIO_ERROR if(_SciErr.iErr)         \
26     {                                        \
27       printError(&_SciErr, 0);               \
28       return 1;                              \
29     }
30
31 int sci_matfile_listvar(char* fname, void* pvApiCtx)
32 {
33   int nbRow = 0, nbCol = 0;
34   mat_t *matfile = NULL;
35   matvar_t *matvar = NULL;
36   int fileIndex = 0;
37   char **varnames = NULL;
38   double *varclasses = NULL;
39   double *vartypes = NULL;
40   int nbvar = 0, var_type;
41   int * fd_addr = NULL;
42   double tmp_dbl;
43   SciErr _SciErr;
44
45   CheckRhs(1, 1);
46   CheckLhs(1, 3);
47
48   /* First Rhs is the index of the file to read */
49
50   _SciErr = getVarAddressFromPosition(pvApiCtx, 1, &fd_addr); MATIO_ERROR;
51   _SciErr = getVarType(pvApiCtx, fd_addr, &var_type); MATIO_ERROR;
52
53   if (var_type == sci_matrix)
54     {
55       getScalarDouble(pvApiCtx, fd_addr, &tmp_dbl);
56       if (!isScalar(pvApiCtx, fd_addr))
57         {
58           Scierror(999, _("%s: Wrong size for first input argument: Single double expected.\n"), fname);
59           return 1;
60         }
61       fileIndex = (int)tmp_dbl;
62     }
63   else
64     {
65       Scierror(999, _("%s: Wrong type for first input argument: Double expected.\n"), fname);
66       return 1;
67     }
68
69   /* Gets the corresponding matfile */
70   matfile_manager(MATFILEMANAGER_GETFILE, &fileIndex, &matfile);
71
72   /* Back to the beginning of the file */
73   if (Mat_Rewind(matfile) != 0)
74     {
75       Scierror(999, _("%s: Could not rewind the file %s.\n"), "matfile_listvar", matfile->filename);
76       return 1;
77     }
78
79   matvar = Mat_VarReadNext(matfile);
80   while (matvar != NULL && matvar->name != NULL)
81     {
82       nbvar++;
83       varnames = (char**) REALLOC(varnames, nbvar*sizeof(char*));
84       if (varnames == NULL)
85         {
86           Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
87           return 1;
88         }
89       varnames[nbvar-1] = os_strdup(matvar->name);
90       varclasses = (double*) REALLOC(varclasses, nbvar*sizeof(double));
91       if (varnames == NULL)
92         {
93           Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
94           return 1;
95         }
96       varclasses[nbvar-1] = (double) matvar->class_type;
97       vartypes = (double*) REALLOC(vartypes, nbvar*sizeof(double));
98       if (varnames == NULL)
99         {
100           Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
101           return 1;
102         }
103       vartypes[nbvar-1] = (double) matvar->data_type;
104
105       Mat_VarFree(matvar);
106       matvar = Mat_VarReadNext(matfile);
107     }
108
109   Mat_VarFree(matvar);
110
111   /* Return the variable names list */
112   nbRow = nbvar; nbCol = 1;
113   _SciErr = createMatrixOfString(pvApiCtx, Rhs+1, nbRow, nbCol, varnames); MATIO_ERROR;
114   LhsVar(1) = Rhs+1;
115
116   /* Return the variable classes */
117   if (Lhs >= 2)
118     {
119       _SciErr = createMatrixOfDouble(pvApiCtx, Rhs+2, nbRow, nbCol, varclasses); MATIO_ERROR;
120       LhsVar(2) = Rhs+2;
121     }
122
123   /* Return the variable types */
124   if (Lhs >= 3)
125     {
126       _SciErr = createMatrixOfDouble(pvApiCtx, Rhs+3, nbRow, nbCol, vartypes); MATIO_ERROR;
127       LhsVar(3) = Rhs+3;
128     }
129
130   freeArrayOfString(varnames, nbvar);
131   FREE(varclasses);
132   FREE(vartypes);
133
134   PutLhsVar();
135
136   return 0;
137 }