* 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_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 enum matfile_errors
23 {
24     NO_MORE_VARIABLES = -1,
25     UNKNOWN_VARIABLE_TYPE = 0
26 };
27
28 int sci_matfile_varwrite(char *fname, unsigned long fname_len)
29 {
30     int nbRow = 0, nbCol = 0;
31     mat_t *matfile = NULL;
32     matvar_t *matvar = NULL;
33     int fileIndex = 0;
34     char *varname = NULL;
35     int flag = 0;
36     int compressionFlag = 0;
37     int var_type;
38     int * fd_addr = NULL, * name_addr = NULL, * cp_flag_addr = NULL;
39     double tmp_dbl;
40     SciErr sciErr;
41
42     CheckRhs(4, 4);
43     CheckLhs(1, 1);
44
45     /* Input argument is the index of the file to write */
46
47     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &fd_addr);
48     if (sciErr.iErr)
49     {
50         printError(&sciErr, 0);
51         return 0;
52     }
53     sciErr = getVarType(pvApiCtx, fd_addr, &var_type);
54     if (sciErr.iErr)
55     {
56         printError(&sciErr, 0);
57         return 0;
58     }
59
60     if (var_type == sci_matrix)
61     {
62         getScalarDouble(pvApiCtx, fd_addr, &tmp_dbl);
63         if (!isScalar(pvApiCtx, fd_addr))
64         {
65             Scierror(999, _("%s: Wrong size for first input argument: Single double expected.\n"), fname);
66             return FALSE;
67         }
68         fileIndex = (int)tmp_dbl;
69     }
70     else
71     {
72         Scierror(999, _("%s: Wrong type for first input argument: Double expected.\n"), fname);
73         return FALSE;
74     }
75
76     /* Gets the corresponding matfile */
77     matfile_manager(MATFILEMANAGER_GETFILE, &fileIndex, &matfile);
78
79     /* Second argument is the variable name */
80
81     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &name_addr);
82     if (sciErr.iErr)
83     {
84         printError(&sciErr, 0);
85         return 0;
86     }
87     sciErr = getVarType(pvApiCtx, name_addr, &var_type);
88     if (sciErr.iErr)
89     {
90         printError(&sciErr, 0);
91         return 0;
92     }
93
94     if (var_type == sci_strings)
95     {
96         getAllocatedSingleString(pvApiCtx, name_addr, &varname);
97         sciErr = getVarDimension(pvApiCtx, name_addr, &nbRow, &nbCol);
98         if (sciErr.iErr)
99         {
100             printError(&sciErr, 0);
101             return 0;
102         }
103         if (nbCol != 1)
104         {
105             Scierror(999, _("%s: Wrong size for second input argument: Single string expected.\n"), fname);
106
107             freeAllocatedSingleString(varname);
108
109             return FALSE;
110         }
111     }
112     else
113     {
114         Scierror(999, _("%s: Wrong type for second input argument: Single string expected.\n"), fname);
115
116         freeAllocatedSingleString(varname);
117
118         return FALSE;
119     }
120
121     /* Third argument is the variable data */
122     /* TODO update this NULL */
123     matvar = GetMatlabVariable(pvApiCtx, 3, varname, Mat_GetVersion(matfile), NULL, -1);
124
125     /* Fourth argument is the compression flag */
126
127     sciErr = getVarAddressFromPosition(pvApiCtx, 4, &cp_flag_addr);
128     if (sciErr.iErr)
129     {
130         printError(&sciErr, 0);
131         return 0;
132     }
133     sciErr = getVarType(pvApiCtx, cp_flag_addr, &var_type);
134     if (sciErr.iErr)
135     {
136         printError(&sciErr, 0);
137         return 0;
138     }
139
140     if (var_type == sci_boolean)
141     {
142         getScalarBoolean(pvApiCtx, cp_flag_addr, &compressionFlag);
143         if (!isScalar(pvApiCtx, cp_flag_addr))
144         {
145             Scierror(999, _("%s: Wrong size for fourth input argument: Single boolean expected.\n"), fname);
146
147             freeAllocatedSingleString(varname);
148
149             return FALSE;
150         }
151     }
152     else
153     {
154         Scierror(999, _("%s: Wrong type for fourth input argument: Single boolean expected.\n"), fname);
155
156         freeAllocatedSingleString(varname);
157
158         return FALSE;
159     }
160
161     flag = Mat_VarWrite(matfile, matvar, compressionFlag);
162
163     /* Return execution flag */
164     var_type = (flag == 0);
165     createScalarBoolean(pvApiCtx, Rhs + 1, var_type);
166
167     freeAllocatedSingleString(varname);
168     LhsVar(1) = Rhs + 1;
169     PutLhsVar();
170
171     return TRUE;
172 }