f57d90e60467fd2ab7ee4235db02c2cbc3b130ae
[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.1-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     if (option == MAT_ACC_RDWR)
144     {
145         /* create a Matlab 5 file */
146         matfile = Mat_CreateVer(filename, NULL, 0);
147     }
148     else
149     {
150         /* Try to open the file (as a Matlab 5 file) */
151         matfile = Mat_Open(filename, option);
152     }
153
154     if (matfile == NULL) /* Opening failed */
155     {
156         /* Function returns -1 */
157         fileIndex = -1;
158     }
159
160     if (matfile != NULL) /* Opening succeed */
161     {
162         /* Add the file to the manager */
163         matfile_manager(MATFILEMANAGER_ADDFILE, &fileIndex, &matfile);
164     }
165
166     /* Return the index */
167     createScalarDouble(pvApiCtx, Rhs + 1, (double)fileIndex);
168
169     freeAllocatedSingleString(filename);
170     freeAllocatedSingleString(optionStr);
171
172     LhsVar(1) = Rhs + 1;
173     PutLhsVar();
174
175     return TRUE;
176 }