29ae2a67be854a2b60174f502f1fb49583d10605
[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                     pstVarI = NULL;
82                     if (sciErr.iErr || piAddrI2 == NULL)
83                     {
84                         // Try old save because here the input variable can be of type "string" but not a variable name
85                         // Ex: a=""; save(filename, a);
86                         iOldSave = TRUE;
87                         bWarning = FALSE;
88                         break;
89                     }
90                 }
91             }
92         }
93         else
94         {
95             iOldSave = FALSE;
96         }
97     }
98     else
99     {
100         iOldSave = TRUE;
101     }
102
103     //new save to sod format
104     if (iOldSave == FALSE)
105     {
106         int lw = 0;
107         //call "overload" to prepare data to export_to_hdf5 function.
108         OverLoad(0);
109     }
110
111     return 0;
112 }
113 /*--------------------------------------------------------------------------*/