19e4d095b871e3a8a1357ff792feca0612972140
[scilab.git] / scilab / modules / matio / sci_gateway / c / sci_matfile_varwrite.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 #ifdef _MSC_VER
15 #include "strdup_Windows.h"
16 #endif
17
18 #include "gw_matio.h"
19 #include "GetMatlabVariable.h"
20 #include "api_scilab.h"
21
22 #define MATIO_ERROR if(_SciErr.iErr)         \
23     {                                        \
24       printError(&_SciErr, 0);               \
25       return 0;                              \
26     }
27
28 enum matfile_errors {
29   NO_MORE_VARIABLES = -1,
30   UNKNOWN_VARIABLE_TYPE = 0
31 };
32
33 int sci_matfile_varwrite(char *fname,unsigned long fname_len)
34 {
35   int nbRow = 0, nbCol = 0;
36   mat_t *matfile = NULL;
37   matvar_t *matvar = NULL;
38   int fileIndex = 0;
39   char *varname = NULL;
40   int flag = 0;
41   int compressionFlag = 0;
42   int var_type;
43   int * fd_addr = NULL, * name_addr = NULL, * cp_flag_addr = NULL;
44   double tmp_dbl;
45   SciErr _SciErr;
46   
47   CheckRhs(4, 4);
48   CheckLhs(1, 1);
49   
50   /* Input argument is the index of the file to write */
51   
52   _SciErr = getVarAddressFromPosition(pvApiCtx, 1, &fd_addr); MATIO_ERROR;
53   _SciErr = getVarType(pvApiCtx, fd_addr, &var_type); MATIO_ERROR;
54   
55   if (var_type == sci_matrix)
56     {
57       getScalarDouble(pvApiCtx, fd_addr, &tmp_dbl);
58       if (!isScalar(pvApiCtx, fd_addr))
59         {
60           Scierror(999, _("%s: Wrong size for first input argument: Single double expected.\n"), fname);
61           return FALSE;
62         }
63       fileIndex = (int)tmp_dbl;
64     }
65   else
66     {
67       Scierror(999, _("%s: Wrong type for first input argument: Double expected.\n"), fname);
68       return FALSE;
69     }
70   
71   /* Gets the corresponding matfile */
72   matfile_manager(MATFILEMANAGER_GETFILE, &fileIndex, &matfile);
73   
74   /* Second argument is the variable name */
75   
76   _SciErr = getVarAddressFromPosition(pvApiCtx, 2, &name_addr); MATIO_ERROR;
77   _SciErr = getVarType(pvApiCtx, name_addr, &var_type); MATIO_ERROR;
78   
79   if (var_type == sci_strings)
80     {
81       getAllocatedSingleString(pvApiCtx, name_addr, &varname);
82       _SciErr = getVarDimension(pvApiCtx, name_addr, &nbRow, &nbCol); MATIO_ERROR;
83       if (nbCol != 1)
84         {
85           Scierror(999, _("%s: Wrong size for second input argument: Single string expected.\n"), fname);
86           
87           freeAllocatedSingleString(varname);
88           
89           return FALSE;
90         }
91     }
92   else
93     {
94       Scierror(999, _("%s: Wrong type for second input argument: Single string expected.\n"), fname);
95       
96       freeAllocatedSingleString(varname);
97       
98       return FALSE;
99     }
100   
101   /* Third argument is the variable data */
102   matvar = GetMatlabVariable(3, varname, matfile->version, NULL, -1);
103   
104   /* Fourth argument is the compression flag */
105   
106   _SciErr = getVarAddressFromPosition(pvApiCtx, 4, &cp_flag_addr); MATIO_ERROR;
107   _SciErr = getVarType(pvApiCtx, cp_flag_addr, &var_type); MATIO_ERROR;
108   
109   if (var_type == sci_boolean)
110     {
111       getScalarBoolean(pvApiCtx, cp_flag_addr, &compressionFlag);
112       if (!isScalar(pvApiCtx, cp_flag_addr))
113         {
114           Scierror(999, _("%s: Wrong size for fourth input argument: Single boolean expected.\n"), fname);
115           
116           freeAllocatedSingleString(varname);
117           
118           return FALSE;
119         }
120     }
121   else
122     {
123       Scierror(999, _("%s: Wrong type for fourth input argument: Single boolean expected.\n"), fname);
124       
125       freeAllocatedSingleString(varname);
126       
127       return FALSE;
128     }
129   
130   flag = Mat_VarWrite(matfile, matvar, compressionFlag);
131   
132   /* Return execution flag */
133   var_type = (flag==0);
134   createScalarBoolean(pvApiCtx, Rhs+1, var_type);
135   
136   freeAllocatedSingleString(varname);
137   LhsVar(1) = Rhs+1;
138   PutLhsVar();
139   
140   return TRUE;
141 }