Split the examples of polyline properties + add a new image
[scilab.git] / scilab / modules / xml / src / cpp / XMLList_insertion.hpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - 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-en.txt
10  *
11  */
12
13 #ifndef __XMLLIST_INSERT_HPP__
14 #define __XMLLIST_INSERT_HPP__
15
16 #include "XMLRhsValue.hxx"
17
18 extern "C"
19 {
20 #include <stdio.h>
21 #include "gw_xml.h"
22 #include "Scierror.h"
23 #include "api_scilab.h"
24 #include "xml_mlist.h"
25 #include "localization.h"
26 }
27
28 using namespace org_modules_xml;
29
30 /*--------------------------------------------------------------------------*/
31
32 /**
33  * Function to handle insertion in XMLNodeList
34  * @param fname the function name
35  * @param fname_len the function name length
36  */
37 template <class T>
38 int sci_XMLList_insertion(char * fname, void* pvApiCtx)
39 {
40     XMLNodeList * a;
41     T * b;
42     int lhsid;
43     bool success;
44     double index;
45     SciErr err;
46     int * indexaddr = 0;
47     int * rhsaddr = 0;
48     int * lhsaddr = 0;
49
50     CheckLhs(1, 1);
51     CheckRhs(3, 3);
52
53     err = getVarAddressFromPosition(pvApiCtx, 1, &indexaddr);
54     if (err.iErr)
55     {
56         printError(&err, 0);
57         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
58         return 0;
59     }
60
61     if (!isDoubleType(pvApiCtx, indexaddr))
62     {
63         Scierror(999, gettext("%s: Wrong type for input argument #%i: A double expected.\n"), fname, 1);
64         return 0;
65     }
66
67     getScalarDouble(pvApiCtx, indexaddr, &index);
68
69     err = getVarAddressFromPosition(pvApiCtx, 2, &rhsaddr);
70     if (err.iErr)
71     {
72         printError(&err, 0);
73         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
74         return 0;
75     }
76
77     err = getVarAddressFromPosition(pvApiCtx, 3, &lhsaddr);
78     if (err.iErr)
79     {
80         printError(&err, 0);
81         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 3);
82         return 0;
83     }
84
85     lhsid = getXMLObjectId(lhsaddr, pvApiCtx);
86     a = XMLObject::getFromId<XMLNodeList>(lhsid);
87     if (!a)
88     {
89         Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
90         return 0;
91     }
92
93     success = XMLRhsValue::get(fname, rhsaddr, &b, pvApiCtx);
94     if (!success)
95     {
96         Scierror(999, gettext("%s: Error in getting rhs argument.\n"), fname);
97         return 0;
98     }
99
100     a->setElementAtPosition(index, *b);
101
102     if (typeid(T) == typeid(std::string))
103     {
104         delete b;
105     }
106
107     if (a->createOnStack(Rhs + 1, pvApiCtx))
108     {
109         LhsVar(1) = Rhs + 1;
110     }
111     else
112     {
113         LhsVar(1) = 0;
114     }
115
116     PutLhsVar();
117
118     return 0;
119 }
120
121 #endif