515b3c9d11b9cde527452114fee946f8fece4733
[scilab.git] / scilab / modules / io / sci_gateway / c / sci_save.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - INRIA - Allan CORNET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 #include "gw_io.h"
14 #include "stack-c.h"
15 #include "api_scilab.h"
16 #include "localization.h"
17 #include "Scierror.h"
18 #include "sciprint.h"
19 #include "warningmode.h"
20 /*--------------------------------------------------------------------------*/
21 extern int C2F(intsave)(); /* fortran subroutine */
22 /*--------------------------------------------------------------------------*/
23 int sci_save(char *fname, unsigned long fname_len)
24 {
25     SciErr sciErr;
26
27     int iOldSave    = FALSE;
28
29     int* piAddr1    = NULL;
30     int iType1      = 0;
31     BOOL bWarning   = TRUE;
32     int iErrorRhs = 0;
33
34     CheckRhs(1, 100000);
35     CheckLhs(0, 1);
36
37     //filename or file descriptor
38     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
39     if (sciErr.iErr)
40     {
41         printError(&sciErr, 0);
42         return 1;
43     }
44
45     sciErr = getVarType(pvApiCtx, piAddr1, &iType1);
46     if (sciErr.iErr)
47     {
48         printError(&sciErr, 0);
49         return 1;
50     }
51
52     if (iType1 == sci_strings)
53     {
54         int* piAddrI    = NULL;
55         int* piAddrI2   = NULL;
56         int iTypeI      = 0;
57         int iRowsI      = 0;
58         int iColsI      = 0;
59         char* pstVarI   = NULL;
60
61         if (Rhs > 1)
62         {
63             int i = 0;
64             for (i = 2 ; i <= Rhs ; i++)
65             {
66                 sciErr = getVarAddressFromPosition(pvApiCtx, i, &piAddrI);
67                 if (sciErr.iErr)
68                 {
69                     printError(&sciErr, 0);
70                     return 1;
71                 }
72
73                 sciErr = getVarType(pvApiCtx, piAddrI, &iTypeI);
74                 if (sciErr.iErr)
75                 {
76                     printError(&sciErr, 0);
77                     return 1;
78                 }
79
80                 if (iTypeI != sci_strings)
81                 {
82                     iOldSave = TRUE;
83                     break;
84                 }
85
86                 sciErr = getVarDimension(pvApiCtx, piAddrI, &iRowsI, &iColsI);
87                 if (sciErr.iErr)
88                 {
89                     printError(&sciErr, 0);
90                     return 1;
91                 }
92
93                 if (iRowsI != 1 || iColsI != 1)
94                 {
95                     iOldSave = TRUE;
96                     break;
97                 }
98
99                 if (getAllocatedSingleString(pvApiCtx, piAddrI, &pstVarI))
100                 {
101                     return 1;
102                 }
103
104                 if (strcmp(pstVarI, "-append") != 0)
105                 {
106                     //try to get variable by name
107                     sciErr = getVarAddressFromName(pvApiCtx, pstVarI, &piAddrI2);
108                     if (sciErr.iErr)
109                     {
110                         // Try old save because here the input variable can be of type "string" but not a variable name
111                         // Ex: a=""; save(filename, a);
112                         iOldSave = TRUE;
113                         bWarning = FALSE;
114                         iErrorRhs = i;
115                         break;
116                     }
117
118                     if (piAddrI2 == 0)
119                     {
120                         iOldSave = TRUE;
121                         break;
122                     }
123                 }
124
125                 freeAllocatedSingleString(pstVarI);
126             }
127         }
128         else
129         {
130             iOldSave = FALSE;
131         }
132     }
133     else
134     {
135         iOldSave = TRUE;
136     }
137
138     //new save to sod format
139     if (iOldSave == FALSE)
140     {
141         int lw = 0;
142         //call "overload" to prepare data to export_to_hdf5 function.
143         C2F(overload) (&lw, "save", (unsigned long)strlen("save"));
144     }
145
146     //old save
147
148     if (iOldSave)
149     {
150         if (bWarning)
151         {
152             //show warning only for variable save, not for environment
153             if (getWarningMode() && Rhs > 1)
154             {
155                 sciprint(_("%s: Scilab 6 will not support the file format used.\n"), _("Warning"));
156                 sciprint(_("%s: Please quote the variable declaration. Example, save('myData.sod',a) becomes save('myData.sod','a').\n"), _("Warning"));
157                 sciprint(_("%s: See help('save') for the rational.\n"), _("Warning"));
158             }
159
160             C2F(intsave)();
161         }
162         else
163         {
164             Scierror(248, _("Wrong value for argument #%d: Valid variable name expected.\n"), iErrorRhs);
165             return 0;
166         }
167     }
168
169     return 0;
170 }
171 /*--------------------------------------------------------------------------*/