* Bug #13102 fixed - matio: 7.3 support
[scilab.git] / scilab / modules / matio / sci_gateway / c / sci_matfile_open.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2014 - Scilab Enterprises - Paul Bignier: bug #13102 fixed
4  * Copyright (C) 2008 - INRIA - Vincent COUVERT
5  * Copyright (C) 2010 - DIGITEO - Yann COLLETTE
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
12  *
13  */
14
15 #include "api_scilab.h"
16 #include "MALLOC.h"
17 #include "matfile_manager.h"
18 #include "gw_matio.h"
19 #include "localization.h"
20 #include "Scierror.h"
21
22 /*******************************************************************************
23    Interface for MATIO function called Mat_Open
24    Scilab function name : matfile_open
25 *******************************************************************************/
26 int sci_matfile_open(char *fname, unsigned long fname_len)
27 {
28     int nbRow = 0, nbCol = 0;
29     mat_t *matfile;
30     int fileIndex = 0;
31     char * filename  = NULL;
32     char * optionStr = NULL;
33     int option = 0, var_type;
34     int * filename_addr = NULL, * option_addr = NULL, * version_addr = NULL;
35     char * versionStr = NULL;
36     int version = MAT_FT_MAT5; // By default, use MAtlab 5 files
37     SciErr sciErr;
38
39     CheckRhs(1, 3);
40     CheckLhs(1, 1);
41
42     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &filename_addr);
43     if (sciErr.iErr)
44     {
45         printError(&sciErr, 0);
46         return 0;
47     }
48     sciErr = getVarType(pvApiCtx, filename_addr, &var_type);
49     if (sciErr.iErr)
50     {
51         printError(&sciErr, 0);
52         return 0;
53     }
54
55     if (var_type == sci_strings)
56     {
57         getAllocatedSingleString(pvApiCtx, filename_addr, &filename);
58         sciErr = getVarDimension(pvApiCtx, filename_addr, &nbRow, &nbCol);
59         if (sciErr.iErr)
60         {
61             printError(&sciErr, 0);
62             return 0;
63         }
64
65         if (nbCol != 1)
66         {
67             Scierror(999, _("%s: Wrong size for first input argument: Single string expected.\n"), fname);
68             freeAllocatedSingleString(filename);
69             return FALSE;
70         }
71     }
72     else
73     {
74         Scierror(999, _("%s: Wrong type for first input argument: Single string expected.\n"), fname);
75         freeAllocatedSingleString(filename);
76         return FALSE;
77     }
78
79     if (Rhs >= 2)
80     {
81         sciErr = getVarAddressFromPosition(pvApiCtx, 2, &option_addr);
82         if (sciErr.iErr)
83         {
84             printError(&sciErr, 0);
85             return 0;
86         }
87
88         sciErr = getVarType(pvApiCtx, option_addr, &var_type);
89         if (sciErr.iErr)
90         {
91             printError(&sciErr, 0);
92             return 0;
93         }
94
95         if (var_type == sci_strings)
96         {
97             getAllocatedSingleString(pvApiCtx, option_addr, &optionStr);
98             sciErr = getVarDimension(pvApiCtx, option_addr, &nbRow, &nbCol);
99             if (sciErr.iErr)
100             {
101                 printError(&sciErr, 0);
102                 return 0;
103             }
104
105             if (nbCol != 1)
106             {
107                 Scierror(999, _("%s: Wrong size for second input argument: Single string expected.\n"), fname);
108                 freeAllocatedSingleString(filename);
109                 freeAllocatedSingleString(optionStr);
110
111                 return FALSE;
112             }
113
114             if (strcmp(optionStr, "r") == 0)
115             {
116                 option = MAT_ACC_RDONLY;
117             }
118             else if (strcmp(optionStr, "w") == 0)
119             {
120                 option = MAT_ACC_RDWR;
121             }
122             else
123             {
124                 Scierror(999, _("%s: Wrong value for second input argument: 'r' or 'w' expected.\n"), fname);
125                 freeAllocatedSingleString(filename);
126                 freeAllocatedSingleString(optionStr);
127
128                 return FALSE;
129             }
130         }
131         else
132         {
133             Scierror(999, _("%s: Wrong type for second input argument: Single string expected.\n"), fname);
134             freeAllocatedSingleString(filename);
135             freeAllocatedSingleString(optionStr);
136
137             return FALSE;
138         }
139     }
140     else
141     {
142         /* Default option value */
143         option = MAT_ACC_RDONLY;
144     }
145
146     if (Rhs >= 3)
147     {
148         sciErr = getVarAddressFromPosition(pvApiCtx, 3, &version_addr);
149         if (sciErr.iErr)
150         {
151             printError(&sciErr, 0);
152             return 0;
153         }
154
155         sciErr = getVarType(pvApiCtx, version_addr, &var_type);
156         if (sciErr.iErr)
157         {
158             printError(&sciErr, 0);
159             return 0;
160         }
161         printf("sci_strings %d %d\n", var_type, sci_strings);
162         if (var_type == sci_strings)
163         {
164             getAllocatedSingleString(pvApiCtx, version_addr, &versionStr);
165             sciErr = getVarDimension(pvApiCtx, version_addr, &nbRow, &nbCol);
166             if (sciErr.iErr)
167             {
168                 printError(&sciErr, 0);
169                 return 0;
170             }
171             if (nbCol != 1)
172             {
173                 Scierror(999, _("%s: Wrong size for input argument #%d: Single string expected.\n"), fname, 3);
174                 freeAllocatedSingleString(filename);
175                 freeAllocatedSingleString(optionStr);
176                 freeAllocatedSingleString(versionStr);
177
178                 return FALSE;
179             }
180
181             if (strcmp(versionStr, "7.3") == 0)
182             {
183                 version = MAT_FT_MAT73; // Matlab 7.3 file
184             }
185             else
186             {
187                 version = MAT_FT_MAT5; // Default, Matlab 5 file
188             }
189         }
190         else
191         {
192             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 3);
193             return 0;
194         }
195     }
196
197     if (option == MAT_ACC_RDWR) // Write, option = "w"
198     {
199         /* create a Matlab 5 or 7.3 file */
200         matfile = Mat_CreateVer(filename, NULL, version);
201     }
202     else // Read, option = "r"
203     {
204         /* Try to open the file (as a Matlab 5 file) */
205         matfile = Mat_Open(filename, option);
206     }
207
208     if (matfile == NULL) /* Opening failed */
209     {
210         /* Function returns -1 */
211         fileIndex = -1;
212     }
213
214     if (matfile != NULL) /* Opening succeed */
215     {
216         /* Add the file to the manager */
217         matfile_manager(MATFILEMANAGER_ADDFILE, &fileIndex, &matfile);
218     }
219
220     /* Return the index */
221     createScalarDouble(pvApiCtx, Rhs + 1, (double)fileIndex);
222
223     freeAllocatedSingleString(filename);
224     freeAllocatedSingleString(optionStr);
225     freeAllocatedSingleString(versionStr);
226
227     LhsVar(1) = Rhs + 1;
228     PutLhsVar();
229
230     return TRUE;
231 }