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