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