check getAllocatedMatrixOfString & getAllocatedSingleString
[scilab.git] / scilab / modules / xml / sci_gateway / cpp / sci_xmlIsValidObject.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 "XMLDocument.hxx"
15 #include "XMLElement.hxx"
16 #include "XMLNs.hxx"
17 #include "XMLAttr.hxx"
18 #include "XMLNodeList.hxx"
19
20 extern "C"
21 {
22 #include "gw_xml.h"
23 #include "stack-c.h"
24 #include "Scierror.h"
25 #include "api_scilab.h"
26 #include "sciprint.h"
27 #include "xml_mlist.h"
28 #include "localization.h"
29 }
30
31 using namespace org_modules_xml;
32
33 /*--------------------------------------------------------------------------*/
34 int sci_xmlIsValidObject(char *fname, unsigned long fname_len)
35 {
36     XMLObject *obj = 0;
37     int id;
38     SciErr err;
39     int *addr = 0;
40     int row = 1;
41     int col = 1;
42     char **vars = 0;
43     int *exists = 0;
44
45     CheckLhs(1, 1);
46     CheckRhs(1, 1);
47
48     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
49     if (err.iErr)
50     {
51         printError(&err, 0);
52         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
53         return 0;
54     }
55
56     if (isStringType(pvApiCtx, addr))
57     {
58         if (getAllocatedMatrixOfString(pvApiCtx, addr, &row, &col, &vars) != 0)
59         {
60             Scierror(999, _("%s: No more memory.\n"), fname);
61             return 0;
62         }
63         exists = new int[row * col];
64
65         for (int i = 0; i < row * col; i++)
66         {
67             err = getVarAddressFromName(pvApiCtx, const_cast < const char *>(vars[i]), &addr);
68
69             if (err.iErr)
70             {
71                 delete[]exists;
72                 freeAllocatedMatrixOfString(row, col, vars);
73                 printError(&err, 0);
74                 Scierror(999, _("%s: Can not read named argument %s.\n"), fname, const_cast < const char *>(vars[i]));
75
76                 return 0;
77             }
78
79             id = getXMLObjectId(addr, pvApiCtx);
80             exists[i] = XMLObject::getFromId < XMLObject > (id) != 0;
81         }
82
83         freeAllocatedMatrixOfString(row, col, vars);
84     }
85     else
86     {
87         exists = new int[1];
88
89         id = getXMLObjectId(addr, pvApiCtx);
90         exists[0] = XMLObject::getFromId < XMLObject > (id) != 0;
91     }
92
93     err = createMatrixOfBoolean(pvApiCtx, Rhs + 1, row, col, exists);
94     delete[]exists;
95     if (err.iErr)
96     {
97         printError(&err, 0);
98         Scierror(999, _("%s: Memory allocation error.\n"), fname);
99         return 0;
100     }
101
102     LhsVar(1) = Rhs + 1;
103     PutLhsVar();
104
105     return 0;
106 }