Use hxx extensions instead of hpp
[scilab.git] / scilab / modules / xml / sci_gateway / cpp / sci_percent_c_i_XMLAttr.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-en.txt
10  *
11  */
12
13 #include <algorithm>
14 #include <vector>
15
16 #include "XMLObject.hxx"
17 #include "XMLElement.hxx"
18 #include "XMLNs.hxx"
19 #include "XMLAttr.hxx"
20
21 extern "C"
22 {
23 #include <stdio.h>
24 #include "gw_xml.h"
25 #include "Scierror.h"
26 #include "api_scilab.h"
27 #include "xml_mlist.h"
28 #include "localization.h"
29 }
30
31 using namespace org_modules_xml;
32
33 /*--------------------------------------------------------------------------*/
34 int sci_percent_c_i_XMLAttr(char *fname, unsigned long fname_len)
35 {
36     XMLAttr *a;
37     int lhsid;
38     SciErr err;
39     int *prefixaddr = 0;
40     int *nameaddr = 0;
41     double *indexes = 0;
42     int rows;
43     int cols;
44     int *rhsaddr = 0;
45     int *lhsaddr = 0;
46     char *name = 0;
47     char *prefix = 0;
48     char *value = 0;
49
50     CheckLhs(1, 1);
51     CheckRhs(3, 4);
52
53     err = getVarAddressFromPosition(pvApiCtx, 1, &prefixaddr);
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 (Rhs == 3 && isDoubleType(pvApiCtx, prefixaddr))
62     {
63         err = getMatrixOfDouble(pvApiCtx, prefixaddr, &rows, &cols, &indexes);
64         if (rows != 1 || cols != 1)
65         {
66             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string or a single integer expected\n"), fname, 1);
67             return 0;
68         }
69     }
70     else
71     {
72         if (!isStringType(pvApiCtx, prefixaddr) || !checkVarDimension(pvApiCtx, prefixaddr, 1, 1))
73         {
74             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string or a single integer expected.\n"), fname, 1);
75             return 0;
76         }
77
78         if (getAllocatedSingleString(pvApiCtx, prefixaddr, &prefix) != 0)
79         {
80             Scierror(999, _("%s: No more memory.\n"), fname);
81             return 0;
82         }
83
84         if (Rhs == 4)
85         {
86             err = getVarAddressFromPosition(pvApiCtx, 2, &nameaddr);
87             if (err.iErr)
88             {
89                 freeAllocatedSingleString(prefix);
90                 printError(&err, 0);
91                 Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
92                 return 0;
93             }
94
95             if (!isStringType(pvApiCtx, nameaddr) || !checkVarDimension(pvApiCtx, nameaddr, 1, 1))
96             {
97                 freeAllocatedSingleString(prefix);
98                 Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
99                 return 0;
100             }
101
102             if (getAllocatedSingleString(pvApiCtx, nameaddr, &name) != 0)
103             {
104                 Scierror(999, _("%s: No more memory.\n"), fname);
105                 return 0;
106             }
107         }
108     }
109
110     err = getVarAddressFromPosition(pvApiCtx, Rhs - 1, &rhsaddr);
111     if (err.iErr)
112     {
113         if (prefix)
114         {
115             freeAllocatedSingleString(prefix);
116         }
117         if (name)
118         {
119             freeAllocatedSingleString(name);
120         }
121         printError(&err, 0);
122         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
123         return 0;
124     }
125
126     err = getVarAddressFromPosition(pvApiCtx, Rhs, &lhsaddr);
127     if (err.iErr)
128     {
129         if (prefix)
130         {
131             freeAllocatedSingleString(prefix);
132         }
133         if (name)
134         {
135             freeAllocatedSingleString(name);
136         }
137         printError(&err, 0);
138         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, Rhs);
139         return 0;
140     }
141
142     lhsid = getXMLObjectId(lhsaddr, pvApiCtx);
143     a = XMLObject::getFromId < XMLAttr > (lhsid);
144     if (!a)
145     {
146         if (prefix)
147         {
148             freeAllocatedSingleString(prefix);
149         }
150         if (name)
151         {
152             freeAllocatedSingleString(name);
153         }
154         Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
155         return 0;
156     }
157
158     if (!isStringType(pvApiCtx, rhsaddr) || !checkVarDimension(pvApiCtx, rhsaddr, 1, 1))
159     {
160         if (prefix)
161         {
162             freeAllocatedSingleString(prefix);
163         }
164         if (name)
165         {
166             freeAllocatedSingleString(name);
167         }
168         Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, Rhs - 1);
169         return 0;
170     }
171
172     if (getAllocatedSingleString(pvApiCtx, rhsaddr, &value) != 0)
173     {
174         Scierror(999, _("%s: No more memory.\n"), fname);
175         return 0;
176     }
177
178     if (Rhs == 3)
179     {
180         if (indexes)
181         {
182             a->setAttributeValue((int)(*indexes), value);
183         }
184         else
185         {
186             name = prefix;
187             a->setAttributeValue(name, value);
188         }
189     }
190     else
191     {
192         a->setAttributeValue(prefix, name, value);
193     }
194
195     if (prefix)
196     {
197         freeAllocatedSingleString(prefix);
198     }
199     if (Rhs != 3 && name)
200     {
201         freeAllocatedSingleString(name);
202     }
203     freeAllocatedSingleString(value);
204
205     a->createOnStack(Rhs + 1, pvApiCtx);
206     LhsVar(1) = Rhs + 1;
207     PutLhsVar();
208
209     return 0;
210 }