6213bb2c1ac31150c385c7acda9e5e61a1ee0065
[scilab.git] / scilab / modules / xml / sci_gateway / cpp / sci_percent_s_i_XMLList.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2011 - Scilab Enterprises - Calixte DENIZET
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 "XMLObject.hxx"
14 #include "XMLElement.hxx"
15 #include "XMLNodeList.hxx"
16
17 extern "C"
18 {
19 #include <stdio.h>
20 #include "gw_xml.h"
21 #include "Scierror.h"
22 #include "api_scilab.h"
23 #include "xml_mlist.h"
24 #include "localization.h"
25 }
26
27 using namespace org_modules_xml;
28
29 /*--------------------------------------------------------------------------*/
30 int sci_percent_s_i_XMLList(char *fname, void* pvApiCtx)
31 {
32     XMLNodeList *a;
33     int lhsid;
34     int row, col;
35     double index;
36     SciErr err;
37     int *indexaddr = 0;
38     int *rhsaddr = 0;
39     int *lhsaddr = 0;
40     int *retaddr = 0;
41     char *retstr = 0;
42     int iBegin = 2;
43     int mrhs = 1;
44     int mlhs = 1;
45
46     CheckLhs(1, 1);
47     CheckRhs(3, 3);
48
49     err = getVarAddressFromPosition(pvApiCtx, 1, &indexaddr);
50     if (err.iErr)
51     {
52         printError(&err, 0);
53         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
54         return 0;
55     }
56
57     if (!isDoubleType(pvApiCtx, indexaddr) || !checkVarDimension(pvApiCtx, indexaddr, 1, 1))
58     {
59         Scierror(999, gettext("%s: Wrong type for input argument #%d: A double expected.\n"), fname, 1);
60         return 0;
61     }
62
63     getScalarDouble(pvApiCtx, indexaddr, &index);
64
65     err = getVarAddressFromPosition(pvApiCtx, 2, &rhsaddr);
66     if (err.iErr)
67     {
68         printError(&err, 0);
69         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
70         return 0;
71     }
72
73     err = getVarAddressFromPosition(pvApiCtx, 3, &lhsaddr);
74     if (err.iErr)
75     {
76         printError(&err, 0);
77         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 3);
78         return 0;
79     }
80
81     lhsid = getXMLObjectId(lhsaddr, pvApiCtx);
82     a = XMLObject::getFromId < XMLNodeList > (lhsid);
83     if (!a)
84     {
85         Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
86         return 0;
87     }
88
89     err = getMatrixOfDouble(pvApiCtx, rhsaddr, &row, &col, 0);
90     if (err.iErr)
91     {
92         printError(&err, 0);
93         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
94         return 0;
95     }
96
97     if (row == 0 && col == 0)
98     {
99         a->removeElementAtPosition((int)index);
100         a->createOnStack(Rhs + 1, pvApiCtx);
101         LhsVar(1) = Rhs + 1;
102     }
103     else if (isNamedVarExist(pvApiCtx, "%s_xmlFormat"))
104     {
105         callScilabFunction(pvApiCtx, "%s_xmlFormat", iBegin, mlhs, mrhs);
106         //Call function directly in scilab 6 C++ api
107         //Nbvars = Max(Nbvars, Lhs + Rhs);
108         //SciString(&iBegin, (char *)"%s_xmlFormat", &mlhs, &mrhs);
109         //Nbvars = Max(Nbvars, Lhs + Rhs + mlhs + mrhs);
110
111         iBegin = nbInputArgument(pvApiCtx) + mrhs + 1;
112         err = getVarAddressFromPosition(pvApiCtx, iBegin, &retaddr);
113         if (err.iErr)
114         {
115             printError(&err, 0);
116             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, iBegin);
117             return 0;
118         }
119
120         if (!isStringType(pvApiCtx, retaddr) || !checkVarDimension(pvApiCtx, retaddr, 1, 1))
121         {
122             Scierror(999, gettext("%s: xmlFormat must return a string.\n"), fname);
123             return 0;
124         }
125
126         if (getAllocatedSingleString(pvApiCtx, retaddr, &retstr) != 0)
127         {
128             Scierror(999, _("%s: No more memory.\n"), fname);
129             return 0;
130         }
131         if (retstr)
132         {
133             a->setElementAtPosition(index, std::string(retstr));
134             freeAllocatedSingleString(retstr);
135             a->createOnStack(Rhs + 1, pvApiCtx);
136             LhsVar(1) = Rhs + 1;
137         }
138     }
139     else
140     {
141         Scierror(999, gettext("%s: You must define %%s_xmlFormat function.\n"), fname);
142         return 0;
143     }
144
145     PutLhsVar();
146
147     return 0;
148 }