Merge remote-tracking branch 'origin/master' into YaSp
[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   if (matfile == NULL)
72   {
73       Scierror(999, _("%s: Invalid file identifier.\n"), fname);
74       return FALSE;
75   }
76   
77   /* Back to the beginning of the file */
78   if (Mat_Rewind(matfile) != 0)
79     {
80       Scierror(999, _("%s: Could not rewind the file %s.\n"), "matfile_listvar", matfile->filename);
81       return 1;
82     }
83
84   matvar = Mat_VarReadNext(matfile);
85   while (matvar != NULL && matvar->name != NULL)
86     {
87       nbvar++;
88       varnames = (char**) REALLOC(varnames, nbvar*sizeof(char*));
89       if (varnames == NULL)
90         {
91           Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
92           return 1;
93         }
94       varnames[nbvar-1] = os_strdup(matvar->name);
95       varclasses = (double*) REALLOC(varclasses, nbvar*sizeof(double));
96       if (varnames == NULL)
97         {
98           Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
99           return 1;
100         }
101       varclasses[nbvar-1] = (double) matvar->class_type;
102       vartypes = (double*) REALLOC(vartypes, nbvar*sizeof(double));
103       if (varnames == NULL)
104         {
105           Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
106           return 1;
107         }
108       vartypes[nbvar-1] = (double) matvar->data_type;
109
110       Mat_VarFree(matvar);
111       matvar = Mat_VarReadNext(matfile);
112     }
113
114   Mat_VarFree(matvar);
115
116   /* Return the variable names list */
117   nbRow = nbvar; nbCol = 1;
118   _SciErr = createMatrixOfString(pvApiCtx, Rhs+1, nbRow, nbCol, varnames); MATIO_ERROR;
119   LhsVar(1) = Rhs+1;
120
121   /* Return the variable classes */
122   if (Lhs >= 2)
123     {
124       _SciErr = createMatrixOfDouble(pvApiCtx, Rhs+2, nbRow, nbCol, varclasses); MATIO_ERROR;
125       LhsVar(2) = Rhs+2;
126     }
127
128   /* Return the variable types */
129   if (Lhs >= 3)
130     {
131       _SciErr = createMatrixOfDouble(pvApiCtx, Rhs+3, nbRow, nbCol, vartypes); MATIO_ERROR;
132       LhsVar(3) = Rhs+3;
133     }
134
135   freeArrayOfString(varnames, nbvar);
136   FREE(varclasses);
137   FREE(vartypes);
138
139   PutLhsVar();
140
141   return 0;
142 }