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