if the variable does not exist then an error message to indicate this
[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 <string.h>
14 #include "gw_io.h"
15 #include "api_scilab.h"
16 #include "localization.h"
17 #include "Scierror.h"
18 #include "sciprint.h"
19 /*--------------------------------------------------------------------------*/
20 extern int C2F(intsave)(); /* fortran subroutine */
21 /*--------------------------------------------------------------------------*/
22 int sci_save(char *fname, void *pvApiCtx)
23 {
24     SciErr sciErr;
25     int iOldSave    = FALSE;
26     int* piAddr1    = NULL;
27     BOOL bWarning   = TRUE;
28     int iRhs = nbInputArgument(pvApiCtx);
29
30     CheckInputArgumentAtLeast(pvApiCtx, 1);
31     CheckLhs(0, 1);
32
33     //filename or file descriptor
34     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
35     if (sciErr.iErr)
36     {
37         printError(&sciErr, 0);
38         return 1;
39     }
40
41     if (isStringType(pvApiCtx, piAddr1))
42     {
43         int* piAddrI    = NULL;
44         char* pstVarI   = NULL;
45
46         if (iRhs > 1)
47         {
48             int i = 0;
49             for (i = 2 ; i <= iRhs ; i++)
50             {
51                 sciErr = getVarAddressFromPosition(pvApiCtx, i, &piAddrI);
52                 if (sciErr.iErr)
53                 {
54                     printError(&sciErr, 0);
55                     return 1;
56                 }
57
58                 if (isStringType(pvApiCtx, piAddrI) == 0 || isScalar(pvApiCtx, piAddrI) == 0)
59                 {
60                     iOldSave = TRUE;
61                     break;
62                 }
63
64                 if (getAllocatedSingleString(pvApiCtx, piAddrI, &pstVarI))
65                 {
66                     if (pstVarI)
67                     {
68                         freeAllocatedSingleString(pstVarI);
69                     }
70
71                     Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
72                     return 1;
73                 }
74
75                 if (strcmp(pstVarI, "-append") != 0)
76                 {
77                     int* piAddrI2   = NULL;
78                     //try to get variable by name
79                     sciErr = getVarAddressFromName(pvApiCtx, pstVarI, &piAddrI2);
80                     freeAllocatedSingleString(pstVarI);
81
82                     if (sciErr.iErr != 0)
83                     {
84                         Scierror(999, _("Wrong value for argument #%d: Valid variable name expected.\n"), 3);
85                         return 1;
86                     }
87
88                     pstVarI = NULL;
89                     if (piAddrI2 == NULL)
90                     {
91                         // Try old save because here the input variable can be of type "string" but not a variable name
92                         // Ex: a=""; save(filename, a);
93                         iOldSave = TRUE;
94                         bWarning = FALSE;
95                         break;
96                     }
97                 }
98             }
99         }
100         else
101         {
102             iOldSave = FALSE;
103         }
104     }
105     else
106     {
107         iOldSave = TRUE;
108     }
109
110     //new save to sod format
111     if (iOldSave == FALSE)
112     {
113         int lw = 0;
114         //call "overload" to prepare data to export_to_hdf5 function.
115         OverLoad(0);
116     }
117
118     return 0;
119 }
120 /*--------------------------------------------------------------------------*/