* Port to matio 1.5.0 * Code cleaning * Prepare code for Scilab 6 (YaSp branch merge)
[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) 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 "MALLOC.h"
16 #include "matfile_manager.h"
17 #include "gw_matio.h"
18 #include "localization.h"
19 #include "Scierror.h"
20
21 /*******************************************************************************
22    Interface for MATIO function called Mat_Open
23    Scilab function name : matfile_open
24 *******************************************************************************/
25 int sci_matfile_open(char *fname, unsigned long fname_len)
26 {
27     int nbRow = 0, nbCol = 0;
28     mat_t *matfile;
29     int fileIndex = 0;
30     char * filename  = NULL;
31     char * optionStr = NULL;
32     int option = 0, var_type;
33     int * filename_addr = NULL, * option_addr = NULL;
34     SciErr sciErr;
35
36     CheckRhs(1, 2);
37     CheckLhs(1, 1);
38
39     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &filename_addr);
40     if (sciErr.iErr)
41     {
42         printError(&sciErr, 0);
43         return 0;
44     }
45     sciErr = getVarType(pvApiCtx, filename_addr, &var_type);
46     if (sciErr.iErr)
47     {
48         printError(&sciErr, 0);
49         return 0;
50     }
51
52     if (var_type == sci_strings)
53     {
54         getAllocatedSingleString(pvApiCtx, filename_addr, &filename);
55         sciErr = getVarDimension(pvApiCtx, filename_addr, &nbRow, &nbCol);
56         if (sciErr.iErr)
57         {
58             printError(&sciErr, 0);
59             return 0;
60         }
61
62         if (nbCol != 1)
63         {
64             Scierror(999, _("%s: Wrong size for first input argument: Single string expected.\n"), fname);
65             freeAllocatedSingleString(filename);
66             return FALSE;
67         }
68     }
69     else
70     {
71         Scierror(999, _("%s: Wrong type for first input argument: Single string expected.\n"), fname);
72         freeAllocatedSingleString(filename);
73         return FALSE;
74     }
75
76     if (Rhs == 2)
77     {
78         sciErr = getVarAddressFromPosition(pvApiCtx, 2, &option_addr);
79         if (sciErr.iErr)
80         {
81             printError(&sciErr, 0);
82             return 0;
83         }
84
85         sciErr = getVarType(pvApiCtx, option_addr, &var_type);
86         if (sciErr.iErr)
87         {
88             printError(&sciErr, 0);
89             return 0;
90         }
91
92         if (var_type == sci_strings)
93         {
94             getAllocatedSingleString(pvApiCtx, option_addr, &optionStr);
95             sciErr = getVarDimension(pvApiCtx, option_addr, &nbRow, &nbCol);
96             if (sciErr.iErr)
97             {
98                 printError(&sciErr, 0);
99                 return 0;
100             }
101
102             if (nbCol != 1)
103             {
104                 Scierror(999, _("%s: Wrong size for second input argument: Single string expected.\n"), fname);
105                 freeAllocatedSingleString(filename);
106                 freeAllocatedSingleString(optionStr);
107
108                 return FALSE;
109             }
110
111             if (strcmp(optionStr, "r") == 0)
112             {
113                 option = MAT_ACC_RDONLY;
114             }
115             else if (strcmp(optionStr, "w") == 0)
116             {
117                 option = MAT_ACC_RDWR;
118             }
119             else
120             {
121                 Scierror(999, _("%s: Wrong value for second input argument: 'r' or 'w' expected.\n"), fname);
122                 freeAllocatedSingleString(filename);
123                 freeAllocatedSingleString(optionStr);
124
125                 return FALSE;
126             }
127         }
128         else
129         {
130             Scierror(999, _("%s: Wrong type for second input argument: Single string expected.\n"), fname);
131             freeAllocatedSingleString(filename);
132             freeAllocatedSingleString(optionStr);
133
134             return FALSE;
135         }
136     }
137     else
138     {
139         /* Default option value */
140         option = MAT_ACC_RDONLY;
141     }
142
143     /* Try to open the file (as a Matlab 5 file) */
144     matfile = Mat_Open(filename, option);
145
146     if (matfile == NULL) /* Opening failed */
147     {
148         /* Try to open the file (as a Matlab 4 file) */
149         matfile = Mat_Open(filename, option | MAT_FT_MAT4);
150
151         if (matfile == NULL) /* Opening failed */
152         {
153             /* Function returns -1 */
154             fileIndex = -1;
155         }
156     }
157
158     if (matfile != NULL) /* Opening succeed */
159     {
160         /* Add the file to the manager */
161         matfile_manager(MATFILEMANAGER_ADDFILE, &fileIndex, &matfile);
162     }
163
164     /* Return the index */
165     createScalarDouble(pvApiCtx, Rhs + 1, (double)fileIndex);
166
167     freeAllocatedSingleString(filename);
168     freeAllocatedSingleString(optionStr);
169
170     LhsVar(1) = Rhs + 1;
171     PutLhsVar();
172
173     return TRUE;
174 }