Use hxx extensions instead of hpp
[scilab.git] / scilab / modules / xml / sci_gateway / cpp / sci_xmlName.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 "XMLList.hxx"
15 #include "XMLElement.hxx"
16 #include "XMLAttr.hxx"
17
18 extern "C"
19 {
20 #include "gw_xml.h"
21 #include "Scierror.h"
22 #include "api_scilab.h"
23 #include "xml_mlist.h"
24 #include "localization.h"
25 }
26
27 #include <iostream>
28
29 using namespace org_modules_xml;
30
31 /*--------------------------------------------------------------------------*/
32 int sci_xmlName(char *fname, unsigned long fname_len)
33 {
34     int id;
35     SciErr err;
36     int *addr = 0;
37     const char **pstStrings = 0;
38     const char * types[] = {"XMLAttr", "XMLList", "XMLSet", "XMLElem"};
39     int type;
40     int size;
41
42     CheckLhs(1, 1);
43     CheckRhs(1, 1);
44
45     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
46     if (err.iErr)
47     {
48         printError(&err, 0);
49         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
50         return 0;
51     }
52
53     type = isXMLObjects(types, 4, addr, pvApiCtx);
54     if (!type)
55     {
56         Scierror(999, gettext("%s: Wrong type for input argument #%i: XMLSet, XMLList, XMLAttr or XMLElem expected.\n"), fname, 1);
57         return 0;
58     }
59     type--;
60
61     id = getXMLObjectId(addr, pvApiCtx);
62
63     if (type == 1 || type == 2)
64     {
65         XMLList * list = XMLObject::getFromId < XMLList > (id);
66         if (!list)
67         {
68             Scierror(999, gettext("%s: XMLSet or XMLList does not exist.\n"), fname);
69             return 0;
70         }
71
72         pstStrings = list->getNameFromList();
73         size = list->getSize();
74     }
75     else if (type == 0)
76     {
77         XMLAttr * attrs = XMLObject::getFromId<XMLAttr>(id);
78         if (!attrs)
79         {
80             Scierror(999, gettext("%s: XMLAttr does not exist.\n"), fname);
81             return 0;
82         }
83
84         pstStrings = attrs->getNames();
85         size = attrs->getSize();
86     }
87     else
88     {
89         XMLElement * elem = XMLObject::getFromId<XMLElement>(id);
90         if (!elem)
91         {
92             Scierror(999, gettext("%s: XMLElem does not exist.\n"), fname);
93             return 0;
94         }
95
96         pstStrings = new const char *[1];
97         pstStrings[0] = elem->getNodeName();
98         size = 1;
99     }
100
101     if (size)
102     {
103         err = createMatrixOfString(pvApiCtx, Rhs + 1, 1, size, const_cast < const char * const *>(pstStrings));
104         delete[]pstStrings;
105         if (err.iErr)
106         {
107             printError(&err, 0);
108             Scierror(999, _("%s: Memory allocation error.\n"), fname);
109             return 0;
110         }
111     }
112     else
113     {
114         createEmptyMatrix(pvApiCtx, Rhs + 1);
115     }
116
117     LhsVar(1) = Rhs + 1;
118     PutLhsVar();
119     return 0;
120 }
121
122 /*--------------------------------------------------------------------------*/