d5391f83f0152943e9e572509b568b1ce2083942
[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  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 #include "gw_matio.h"
18 #include "GetMatlabVariable.h"
19 #include "api_scilab.h"
20
21 enum matfile_errors
22 {
23     NO_MORE_VARIABLES = -1,
24     UNKNOWN_VARIABLE_TYPE = 0
25 };
26
27 int sci_matfile_varwrite(char *fname, void* pvApiCtx)
28 {
29     int nbRow = 0, nbCol = 0;
30     mat_t *matfile = NULL;
31     matvar_t *matvar = NULL;
32     int fileIndex = 0;
33     char *varname = NULL;
34     int flag = 0;
35     int compressionFlag = 0;
36     int var_type;
37     int * fd_addr = NULL, * name_addr = NULL, * cp_flag_addr = NULL;
38     double tmp_dbl;
39     SciErr sciErr;
40
41     CheckRhs(4, 4);
42     CheckLhs(1, 1);
43
44     /* Input argument is the index of the file to write */
45
46     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &fd_addr);
47     if (sciErr.iErr)
48     {
49         printError(&sciErr, 0);
50         return 0;
51     }
52     sciErr = getVarType(pvApiCtx, fd_addr, &var_type);
53     if (sciErr.iErr)
54     {
55         printError(&sciErr, 0);
56         return 0;
57     }
58
59     if (var_type == sci_matrix)
60     {
61         getScalarDouble(pvApiCtx, fd_addr, &tmp_dbl);
62         if (!isScalar(pvApiCtx, fd_addr))
63         {
64             Scierror(999, _("%s: Wrong size for first input argument: An integer value expected.\n"), fname);
65             return FALSE;
66         }
67         fileIndex = (int)tmp_dbl;
68     }
69     else
70     {
71         Scierror(999, _("%s: Wrong type for first input argument: An integer value expected.\n"), fname);
72         return FALSE;
73     }
74
75     /* Gets the corresponding matfile */
76     matfile_manager(MATFILEMANAGER_GETFILE, &fileIndex, &matfile);
77
78     /* Second argument is the variable name */
79
80     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &name_addr);
81     if (sciErr.iErr)
82     {
83         printError(&sciErr, 0);
84         return 0;
85     }
86     sciErr = getVarType(pvApiCtx, name_addr, &var_type);
87     if (sciErr.iErr)
88     {
89         printError(&sciErr, 0);
90         return 0;
91     }
92
93     if (var_type == sci_strings)
94     {
95         getAllocatedSingleString(pvApiCtx, name_addr, &varname);
96         sciErr = getVarDimension(pvApiCtx, name_addr, &nbRow, &nbCol);
97         if (sciErr.iErr)
98         {
99             printError(&sciErr, 0);
100             return 0;
101         }
102         if (nbCol != 1)
103         {
104             Scierror(999, _("%s: Wrong size for second input argument: string expected.\n"), fname);
105
106             freeAllocatedSingleString(varname);
107
108             return FALSE;
109         }
110     }
111     else
112     {
113         Scierror(999, _("%s: Wrong type for second input argument: string expected.\n"), fname);
114
115         freeAllocatedSingleString(varname);
116
117         return FALSE;
118     }
119
120     /* Third argument is the variable data */
121     /* TODO update this NULL */
122     matvar = GetMatlabVariable(pvApiCtx, 3, varname, Mat_GetVersion(matfile), NULL, -1);
123
124     /* Fourth argument is the compression flag */
125
126     sciErr = getVarAddressFromPosition(pvApiCtx, 4, &cp_flag_addr);
127     if (sciErr.iErr)
128     {
129         printError(&sciErr, 0);
130         return 0;
131     }
132     sciErr = getVarType(pvApiCtx, cp_flag_addr, &var_type);
133     if (sciErr.iErr)
134     {
135         printError(&sciErr, 0);
136         return 0;
137     }
138
139     if (var_type == sci_boolean)
140     {
141         getScalarBoolean(pvApiCtx, cp_flag_addr, &compressionFlag);
142         if (!isScalar(pvApiCtx, cp_flag_addr))
143         {
144             Scierror(999, _("%s: Wrong size for fourth input argument: A boolean expected.\n"), fname);
145
146             freeAllocatedSingleString(varname);
147
148             return FALSE;
149         }
150     }
151     else
152     {
153         Scierror(999, _("%s: Wrong type for fourth input argument: A boolean expected.\n"), fname);
154
155         freeAllocatedSingleString(varname);
156
157         return FALSE;
158     }
159
160     flag = Mat_VarWrite(matfile, matvar, compressionFlag);
161
162     /* Return execution flag */
163     var_type = (flag == 0);
164     createScalarBoolean(pvApiCtx, Rhs + 1, var_type);
165
166     freeAllocatedSingleString(varname);
167     LhsVar(1) = Rhs + 1;
168     PutLhsVar();
169
170     return TRUE;
171 }