Use hxx extensions instead of hpp
[scilab.git] / scilab / modules / xml / sci_gateway / cpp / sci_percent_foo_i_XMLList.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 "XMLNodeList.hxx"
16
17 extern "C"
18 {
19 #include <string.h>
20 #include <stdio.h>
21 #include "gw_xml.h"
22 #include "Scierror.h"
23 #include "MALLOC.h"
24 #include "api_scilab.h"
25 #include "xml_mlist.h"
26 #include "localization.h"
27 #ifdef _MSC_VER
28 #include "strdup_windows.h"
29 #endif
30
31 }
32
33 using namespace org_modules_xml;
34
35 /*--------------------------------------------------------------------------*/
36 int sci_percent_foo_i_XMLList(char *fname, unsigned long fname_len)
37 {
38     XMLNodeList *a;
39     int lhsid;
40     double index;
41     SciErr err;
42     char *prefix = 0;
43     char *underscore = 0;
44     char *format = 0;
45     int *indexaddr = 0;
46     int *rhsaddr = 0;
47     int *lhsaddr = 0;
48     int *retaddr = 0;
49     char *retstr = 0;
50     int iBegin = 2;
51     int mrhs = 1;
52     int mlhs = 1;
53
54     CheckLhs(1, 1);
55     CheckRhs(3, 3);
56
57     err = getVarAddressFromPosition(pvApiCtx, 1, &indexaddr);
58     if (err.iErr)
59     {
60         printError(&err, 0);
61         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
62         return 0;
63     }
64
65     if (!isDoubleType(pvApiCtx, indexaddr) || !checkVarDimension(pvApiCtx, indexaddr, 1, 1))
66     {
67         Scierror(999, gettext("%s: Wrong type for input argument #%d: A double expected.\n"), fname, 1);
68         return 0;
69     }
70
71     getScalarDouble(pvApiCtx, indexaddr, &index);
72
73     err = getVarAddressFromPosition(pvApiCtx, 2, &rhsaddr);
74     if (err.iErr)
75     {
76         printError(&err, 0);
77         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
78         return 0;
79     }
80
81     err = getVarAddressFromPosition(pvApiCtx, 3, &lhsaddr);
82     if (err.iErr)
83     {
84         printError(&err, 0);
85         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 3);
86         return 0;
87     }
88
89     lhsid = getXMLObjectId(lhsaddr, pvApiCtx);
90     a = XMLObject::getFromId < XMLNodeList > (lhsid);
91     if (!a)
92     {
93         Scierror(999, gettext("%s: XML object does not exist.\n"), fname);
94         return 0;
95     }
96
97     prefix = strdup(fname);
98     underscore = strchr(prefix, '_');
99     *underscore = '\0';
100     format = (char *)MALLOC(sizeof(char *) * (strlen(prefix) + strlen("_xmlFormat") + 1));
101     sprintf(format, "%s_xmlFormat", prefix);
102     free(prefix);
103
104     if (isNamedVarExist(pvApiCtx, format))
105     {
106         SciString(&iBegin, format, &mlhs, &mrhs);
107         FREE(format);
108         err = getVarAddressFromPosition(pvApiCtx, iBegin, &retaddr);
109         if (err.iErr)
110         {
111             printError(&err, 0);
112             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, iBegin);
113             return 0;
114         }
115
116         if (!isStringType(pvApiCtx, retaddr) || !checkVarDimension(pvApiCtx, retaddr, 1, 1))
117         {
118             Scierror(999, gettext("%s: xmlFormat must return a string.\n"), fname);
119             return 0;
120         }
121
122         if (getAllocatedSingleString(pvApiCtx, retaddr, &retstr) != 0)
123         {
124             Scierror(999, _("%s: No more memory.\n"), fname);
125             return 0;
126         }
127         if (retstr)
128         {
129             a->setElementAtPosition(index, std::string(retstr));
130             freeAllocatedSingleString(retstr);
131             a->createOnStack(Rhs + 1, pvApiCtx);
132             LhsVar(1) = Rhs + 1;
133         }
134     }
135     else
136     {
137         Scierror(999, gettext("%s: You must define %%s_xmlFormat function.\n"), fname, format);
138         FREE(format);
139         return 0;
140     }
141
142     PutLhsVar();
143
144     return 0;
145 }