1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2012-2014 - Scilab Enterprises - Calixte DENIZET
4 *
5 * Copyright (C) 2012 - 2016 - Scilab Enterprises
6 *
7 * This file is hereby licensed under the terms of the GNU GPL v2.0,
8 * pursuant to article 5.3.4 of the CeCILL v.2.1.
9 * This file was originally licensed under the terms of the CeCILL v2.1,
10 * and continues to be available under such terms.
11 * For more information, see the COPYING file which you should have received
12 * along with this program.
13 *
14 */
15
16 #include "mlist.hxx"
17 #include "tlist.hxx"
18 #include "internal.hxx"
19 #include "string.hxx"
20
21 extern "C"
22 {
23 #include <string.h>
24 #include "xml_mlist.h"
25 #include "api_scilab.h"
26 #include "Scierror.h"
27 #include "sci_malloc.h"
28 }
29
30 static const char *_XMLDoc[] = { "XMLDoc", "_id" };
31 static const char *_XMLElem[] = { "XMLElem", "_id" };
32 static const char *_XMLAttr[] = { "XMLAttr", "_id" };
33 static const char *_XMLNs[] = { "XMLNs", "_id" };
34 static const char *_XMLList[] = { "XMLList", "_id" };
35 static const char *_XMLNotHandled[] = { "XMLNH", "_id" };
36 static const char *_XMLSet[] = { "XMLSet", "_id" };
37 static const char *_XMLValid[] = { "XMLValid", "_id" };
38
39 static int getMListType(int * mlist, void * pvApiCtx);
40
41 /*--------------------------------------------------------------------------*/
createXMLObjectAtPos(int type,int pos,int id,void * pvApiCtx)42 int createXMLObjectAtPos(int type, int pos, int id, void* pvApiCtx)
43 {
44 const char **fields = NULL;
45 int *mlistaddr = NULL;
46 SciErr err;
47
48 switch (type)
49 {
50 case XMLDOCUMENT:
51 fields = _XMLDoc;
52 break;
53 case XMLELEMENT:
54 fields = _XMLElem;
55 break;
56 case XMLATTRIBUTE:
57 fields = _XMLAttr;
58 break;
59 case XMLNAMESPACE:
60 fields = _XMLNs;
61 break;
62 case XMLLIST:
63 fields = _XMLList;
64 break;
65 case XMLNOTHANDLED:
66 fields = _XMLNotHandled;
67 break;
68 case XMLSET:
69 fields = _XMLSet;
70 break;
71 case XMLVALID:
72 fields = _XMLValid;
73 break;
74 default:
75 Scierror(999, _("Unknown tag.\n"));
76 return 0;
77 }
78
79 err = createMList(pvApiCtx, pos, 2, &mlistaddr);
80 if (err.iErr)
81 {
82 printError(&err, 0);
83 return 0;
84 }
85
86 err = createMatrixOfStringInList(pvApiCtx, pos, mlistaddr, 1, 1, 2, fields);
87 if (err.iErr)
88 {
89 printError(&err, 0);
90 return 0;
91 }
92
93 err = createMatrixOfInteger32InList(pvApiCtx, pos, mlistaddr, 2, 1, 1, &id);
94 if (err.iErr)
95 {
96 printError(&err, 0);
97 return 0;
98 }
99 return 1;
100 }
101
102 /*--------------------------------------------------------------------------*/
createXMLObjectAtPosInList(int * list,int stackPos,int type,int pos,int id,void * pvApiCtx)103 int createXMLObjectAtPosInList(int *list, int stackPos, int type, int pos, int id, void *pvApiCtx)
104 {
105 const char **fields = NULL;
106 int *mlistaddr = NULL;
107 SciErr err;
108
109 err = createMListInList(pvApiCtx, stackPos, list, pos, 2, &mlistaddr);
110 if (err.iErr)
111 {
112 printError(&err, 0);
113 return 0;
114 }
115
116 switch (type)
117 {
118 case XMLDOCUMENT:
119 fields = _XMLDoc;
120 break;
121 case XMLELEMENT:
122 fields = _XMLElem;
123 break;
124 case XMLATTRIBUTE:
125 fields = _XMLAttr;
126 break;
127 case XMLNAMESPACE:
128 fields = _XMLNs;
129 break;
130 case XMLLIST:
131 fields = _XMLList;
132 break;
133 case XMLNOTHANDLED:
134 fields = _XMLNotHandled;
135 break;
136 case XMLSET:
137 fields = _XMLSet;
138 break;
139 case XMLVALID:
140 fields = _XMLValid;
141 break;
142 default:
143 Scierror(999, _("Unknown tag.\n"));
144 return 0;
145 }
146
147 err = createMatrixOfStringInList(pvApiCtx, stackPos, mlistaddr, 1, 1, 2, fields);
148 if (err.iErr)
149 {
150 printError(&err, 0);
151 return 0;
152 }
153
154 err = createMatrixOfInteger32InList(pvApiCtx, stackPos, mlistaddr, 2, 1, 1, &id);
155 if (err.iErr)
156 {
157 printError(&err, 0);
158 return 0;
159 }
160
161 return 1;
162 }
163
164 /*--------------------------------------------------------------------------*/
isXMLDoc(int * mlist,void * pvApiCtx)165 int isXMLDoc(int *mlist, void *pvApiCtx)
166 {
167 return getMListType(mlist, pvApiCtx) == XMLDOCUMENT;
168 }
169
170 /*--------------------------------------------------------------------------*/
isXMLElem(int * mlist,void * pvApiCtx)171 int isXMLElem(int *mlist, void *pvApiCtx)
172 {
173 return getMListType(mlist, pvApiCtx) == XMLELEMENT;
174 }
175
176 /*--------------------------------------------------------------------------*/
isXMLAttr(int * mlist,void * pvApiCtx)177 int isXMLAttr(int *mlist, void *pvApiCtx)
178 {
179 return getMListType(mlist, pvApiCtx) == XMLATTRIBUTE;
180 }
181
182 /*--------------------------------------------------------------------------*/
isXMLNs(int * mlist,void * pvApiCtx)183 int isXMLNs(int *mlist, void *pvApiCtx)
184 {
185 return getMListType(mlist, pvApiCtx) == XMLNAMESPACE;
186 }
187
188 /*--------------------------------------------------------------------------*/
isXMLList(int * mlist,void * pvApiCtx)189 int isXMLList(int *mlist, void *pvApiCtx)
190 {
191 return getMListType(mlist, pvApiCtx) == XMLLIST;
192 }
193
194 /*--------------------------------------------------------------------------*/
isXMLNotHandled(int * mlist,void * pvApiCtx)195 int isXMLNotHandled(int *mlist, void *pvApiCtx)
196 {
197 return getMListType(mlist, pvApiCtx) == XMLNOTHANDLED;
198 }
199
200 /*--------------------------------------------------------------------------*/
isXMLSet(int * mlist,void * pvApiCtx)201 int isXMLSet(int *mlist, void *pvApiCtx)
202 {
203 return getMListType(mlist, pvApiCtx) == XMLSET;
204 }
205
206 /*--------------------------------------------------------------------------*/
isXMLValid(int * mlist,void * pvApiCtx)207 int isXMLValid(int *mlist, void *pvApiCtx)
208 {
209 return getMListType(mlist, pvApiCtx) == XMLVALID;
210 }
211
212 /*--------------------------------------------------------------------------*/
isXMLObject(int * mlist,void * pvApiCtx)213 int isXMLObject(int *mlist, void *pvApiCtx)
214 {
215 const int type = getMListType(mlist, pvApiCtx);
216 return type == XMLDOCUMENT || type == XMLELEMENT || type == XMLATTRIBUTE || type == XMLNAMESPACE || type == XMLLIST || type == XMLNOTHANDLED || type == XMLSET || type == XMLVALID;
217 }
218
219 /*--------------------------------------------------------------------------*/
isXMLObjects(const int * types,int nb,int * mlist,void * pvApiCtx)220 int isXMLObjects(const int * types, int nb, int *mlist, void *pvApiCtx)
221 {
222 const int type = getMListType(mlist, pvApiCtx);
223 int i = 0;
224 for (; i < nb; i++)
225 {
226 if (type == types[i])
227 {
228 return i;
229 }
230 }
231
232 return -1;
233 }
234 /*--------------------------------------------------------------------------*/
getXMLObjectId(int * mlist,void * pvApiCtx)235 int getXMLObjectId(int *mlist, void *pvApiCtx)
236 {
237 int *id = NULL;
238 int row, col;
239
240 SciErr err = getMatrixOfInteger32InList(pvApiCtx, mlist, 2, &row, &col, &id);
241
242 if (err.iErr)
243 {
244 printError(&err, 0);
245 return -1;
246 }
247
248 return *id;
249 }
250
251 /*--------------------------------------------------------------------------*/
getMListType(int * mlist,void * pvApiCtx)252 int getMListType(int * mlist, void * pvApiCtx)
253 {
254 types::InternalType* pIT = (types::InternalType*)mlist;
255 types::MList* m = dynamic_cast<types::MList*>(pIT);
256
257 if (m == NULL || m->getSize() != 2)
258 {
259 return -1;
260 }
261
262 types::String* pS = m->getFieldNames();
263
264 if (pS->getRows() != 1 || pS->getCols() != 2)
265 {
266 // first field is not a matrix 1x2 of strings
267 return -1;
268 }
269
270 wchar_t* pwstType = pS->get(0);
271 int iLen = (int)wcslen(pwstType);
272
273 if (wcsncmp(pwstType, L"XML", 3) == 0)
274 {
275 if (iLen == 6 /*strlen("XMLDoc")*/ && wcscmp(pwstType + 3, L"Doc") == 0)
276 {
277 return XMLDOCUMENT;
278 }
279 if (iLen == 7 /*strlen("XMLElem")*/ && wcscmp(pwstType + 3, L"Elem") == 0)
280 {
281 return XMLELEMENT;
282 }
283 if (iLen == 7 /*strlen("XMLAttr")*/ && wcscmp(pwstType + 3, L"Attr") == 0)
284 {
285 return XMLATTRIBUTE;
286 }
287 if (iLen == 5 /*strlen("XMLNs")*/ && wcscmp(pwstType + 3, L"Ns") == 0)
288 {
289 return XMLNAMESPACE;
290 }
291 if (iLen == 7 /*strlen("XMLList")*/ && wcscmp(pwstType + 3, L"List") == 0)
292 {
293 return XMLLIST;
294 }
295 if (iLen == 5 /*strlen("XMLNH")*/ && wcscmp(pwstType + 3, L"NH") == 0)
296 {
297 return XMLNOTHANDLED;
298 }
299 if (iLen == 6 /*strlen("XMLSet")*/ && wcscmp(pwstType + 3, L"Set") == 0)
300 {
301 return XMLSET;
302 }
303 if (iLen == 8 /*strlen("XMLValid")*/ && wcscmp(pwstType + 3, L"Valid") == 0)
304 {
305 return XMLVALID;
306 }
307 }
308
309 return -1;
310 }
311