fix: memory is allocated but pointer was not checked to null, other pointer was checked
[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 #ifdef _MSC_VER
22 #include "strdup_Windows.h"
23 #endif
24
25 int sci_matfile_listvar(char *fname, unsigned long fname_len)
26 {
27     int nbRow = 0, nbCol = 0;
28     mat_t *matfile = NULL;
29     matvar_t *matvar = NULL;
30     int fileIndex = 0;
31     char **varnames = NULL;
32     double *varclasses = NULL;
33     double *vartypes = NULL;
34     int nbvar = 0, var_type;
35     int * fd_addr = NULL;
36     double tmp_dbl;
37     SciErr sciErr;
38
39     CheckRhs(1, 1);
40     CheckLhs(1, 3);
41
42     /* First Rhs is the index of the file to read */
43
44     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &fd_addr);
45     if (sciErr.iErr)
46     {
47         printError(&sciErr, 0);
48         return 0;
49     }
50     sciErr = getVarType(pvApiCtx, fd_addr, &var_type);
51     if (sciErr.iErr)
52     {
53         printError(&sciErr, 0);
54         return 0;
55     }
56
57     if (var_type == sci_matrix)
58     {
59         getScalarDouble(pvApiCtx, fd_addr, &tmp_dbl);
60         if (!isScalar(pvApiCtx, fd_addr))
61         {
62             Scierror(999, _("%s: Wrong size for first input argument: Single double expected.\n"), fname);
63             return FALSE;
64         }
65         fileIndex = (int)tmp_dbl;
66     }
67     else
68     {
69         Scierror(999, _("%s: Wrong type for first input argument: Double expected.\n"), fname);
70         return FALSE;
71     }
72
73     /* Gets the corresponding matfile */
74     matfile_manager(MATFILEMANAGER_GETFILE, &fileIndex, &matfile);
75
76     if (matfile == NULL)
77     {
78         Scierror(999, _("%s: Invalid file identifier.\n"), fname);
79         return FALSE;
80     }
81
82     /* Back to the beginning of the file */
83     if (Mat_Rewind(matfile) != 0)
84     {
85         Scierror(999, _("%s: Could not rewind the file %s.\n"), "matfile_listvar", matfile->filename);
86         return FALSE;
87     }
88
89     matvar = Mat_VarReadNext(matfile);
90     while (matvar != NULL && matvar->name != NULL)
91     {
92         nbvar++;
93         varnames = (char**) REALLOC(varnames, nbvar * sizeof(char*));
94         if (varnames == NULL)
95         {
96             Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
97             return FALSE;
98         }
99         varnames[nbvar - 1] = strdup(matvar->name);
100         varclasses = (double*) REALLOC(varclasses, nbvar * sizeof(double));
101         if (varclasses  == NULL)
102         {
103             Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
104             return FALSE;
105         }
106         varclasses[nbvar - 1] = (double) matvar->class_type;
107         vartypes = (double*) REALLOC(vartypes, nbvar * sizeof(double));
108         if (vartypes == NULL)
109         {
110             Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
111             return FALSE;
112         }
113         vartypes[nbvar - 1] = (double) matvar->data_type;
114
115         Mat_VarFree(matvar);
116         matvar = Mat_VarReadNext(matfile);
117     }
118
119     Mat_VarFree(matvar);
120
121     /* Return the variable names list */
122     nbRow = nbvar;
123     nbCol = 1;
124     sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, nbRow, nbCol, varnames);
125     if (sciErr.iErr)
126     {
127         printError(&sciErr, 0);
128         return 0;
129     }
130     LhsVar(1) = Rhs + 1;
131
132     /* Return the variable classes */
133     if (Lhs >= 2)
134     {
135         sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 2, nbRow, nbCol, varclasses);
136         if (sciErr.iErr)
137         {
138             printError(&sciErr, 0);
139             return 0;
140         }
141         LhsVar(2) = Rhs + 2;
142     }
143
144     /* Return the variable types */
145     if (Lhs >= 3)
146     {
147         sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 3, nbRow, nbCol, vartypes);
148         if (sciErr.iErr)
149         {
150             printError(&sciErr, 0);
151             return 0;
152         }
153         LhsVar(3) = Rhs + 3;
154     }
155
156     freeArrayOfString(varnames, nbvar);
157     FREE(varclasses);
158     FREE(vartypes);
159
160     PutLhsVar();
161
162     return TRUE;
163 }