Use hxx extensions instead of hpp
[scilab.git] / scilab / modules / xml / sci_gateway / cpp / sci_percent_XMLList_e.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 "XMLObject.hxx"
14 #include "XMLNodeList.hxx"
15
16 extern "C"
17 {
18 #include <stdio.h>
19 #include "gw_xml.h"
20 #include "Scierror.h"
21 #include "api_scilab.h"
22 #include "xml_mlist.h"
23 #include "localization.h"
24 }
25
26 using namespace org_modules_xml;
27
28 int sci_percent_XMLList_e(char *fname, unsigned long fname_len)
29 {
30     XMLList *list = 0;
31     const XMLObject *elem;
32     int id;
33     SciErr err;
34     double *dvalue = 0;
35     int *mlistaddr = 0;
36     int *daddr = 0;
37     int typ = 0;
38     int row;
39     int col;
40     int index;
41     double d;
42     char *field = 0;
43     const char **pstStrings = 0;
44
45     CheckLhs(1, 1);
46     CheckRhs(2, 2);
47
48     err = getVarAddressFromPosition(pvApiCtx, 1, &daddr);
49     if (err.iErr)
50     {
51         printError(&err, 0);
52         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
53         return 0;
54     }
55
56     err = getVarDimension(pvApiCtx, daddr, &row, &col);
57     if (err.iErr)
58     {
59         printError(&err, 0);
60         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
61         return 0;
62     }
63
64     err = getVarType(pvApiCtx, daddr, &typ);
65     if (err.iErr)
66     {
67         printError(&err, 0);
68         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
69         return 0;
70     }
71
72     if (typ == sci_strings)
73     {
74         if (row != 1 || col != 1)
75         {
76             Scierror(999, gettext("%s: Wrong dimension for input argument #%d: A string or a double expected.\n"), fname, 1);
77             return 0;
78         }
79
80         if (getAllocatedSingleString(pvApiCtx, daddr, &field) != 0)
81         {
82             Scierror(999, _("%s: No more memory.\n"), fname);
83             return 0;
84         }
85         err = getVarAddressFromPosition(pvApiCtx, 2, &mlistaddr);
86         if (err.iErr)
87         {
88             freeAllocatedSingleString(field);
89             printError(&err, 0);
90             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
91             return 0;
92         }
93
94         id = getXMLObjectId(mlistaddr, pvApiCtx);
95         list = XMLObject::getFromId < XMLList > (id);
96         if (!list)
97         {
98             freeAllocatedSingleString(field);
99             Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
100             return 0;
101         }
102
103         if (!strcmp(field, "size"))
104         {
105             d = (double)list->getSize();
106             createScalarDouble(pvApiCtx, Rhs + 1, d);
107
108             LhsVar(1) = Rhs + 1;
109             PutLhsVar();
110         }
111         else if (!strcmp(field, "content"))
112         {
113             pstStrings = list->getContentFromList();
114
115             err = createMatrixOfString(pvApiCtx, Rhs + 1, 1, list->getSize(), const_cast < const char *const *>(pstStrings));
116
117             // contents are created with xmlGetNodeContent which requires that the user free the himself the memory
118             for (int i = 0; i < list->getSize(); i++)
119             {
120                 xmlFree(const_cast < char *>(pstStrings[i]));
121             }
122             delete[]pstStrings;
123             if (err.iErr)
124             {
125                 printError(&err, 0);
126                 Scierror(999, _("%s: Memory allocation error.\n"), fname);
127                 return 0;
128             }
129
130             LhsVar(1) = Rhs + 1;
131             PutLhsVar();
132         }
133         else if (!strcmp(field, "name"))
134         {
135             pstStrings = list->getNameFromList();
136
137             err = createMatrixOfString(pvApiCtx, Rhs + 1, 1, list->getSize(), const_cast < const char *const *>(pstStrings));
138
139             delete[]pstStrings;
140             if (err.iErr)
141             {
142                 printError(&err, 0);
143                 Scierror(999, _("%s: Memory allocation error.\n"), fname);
144                 return 0;
145             }
146
147             LhsVar(1) = Rhs + 1;
148             PutLhsVar();
149         }
150         else
151         {
152             Scierror(999, gettext("%s: Unknown field: %s\n"), fname, field);
153         }
154         freeAllocatedSingleString(field);
155
156         return 0;
157     }
158
159     if (row != 1 || col != 1 || typ != sci_matrix)
160     {
161         Scierror(999, gettext("%s: Wrong dimension for input argument #%d: Single double expected.\n"), fname, 1);
162         return 0;
163     }
164
165     if (isVarComplex(pvApiCtx, daddr))
166     {
167         Scierror(999, gettext("%s: Wrong type for input argument #%d: Double expected.\n"), fname, 1);
168         return 0;
169     }
170
171     err = getMatrixOfDouble(pvApiCtx, daddr, &row, &col, &dvalue);
172     if (err.iErr)
173     {
174         printError(&err, 0);
175         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
176         return 0;
177     }
178
179     err = getVarAddressFromPosition(pvApiCtx, 2, &mlistaddr);
180     if (err.iErr)
181     {
182         printError(&err, 0);
183         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
184         return 0;
185     }
186
187     id = getXMLObjectId(mlistaddr, pvApiCtx);
188     list = XMLObject::getFromId < XMLList > (id);
189     if (!list)
190     {
191         Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
192         return 0;
193     }
194
195     index = (int)(*dvalue);
196     elem = list->getListElement(index);
197     if (!elem)
198     {
199         Scierror(999, gettext("%s: Wrong index in the XMLList.\n"), fname);
200         return 0;
201     }
202
203     if (!elem->createOnStack(Rhs + 1, pvApiCtx))
204     {
205         return 0;
206     }
207
208     LhsVar(1) = Rhs + 1;
209     PutLhsVar();
210
211     return 0;
212 }