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