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