add some Scierror after printError to create an error in Scilab
[scilab.git] / scilab / modules / xml / sci_gateway / cpp / sci_xmlSetAttributes.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Antoine ELIAS
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
14 extern "C"
15 {
16 #include "xml.h"
17 #include "gw_xml.h"
18 #include "stack-c.h"
19 #include "Scierror.h"
20 #include "api_scilab.h"
21 #include "xml_mlist.h"
22 #include "localization.h"
23 }
24
25 #include "XMLObject.hxx"
26
27 using namespace org_modules_xml;
28
29 /*--------------------------------------------------------------------------*/
30 int sci_xmlSetAttributes(char * fname, unsigned long fname_len)
31 {
32     int id;
33     SciErr err;
34     int * addr = 0;
35     XMLObject * obj = 0;
36     char ** keyValue = 0;
37     int rows;
38     int cols;
39
40     CheckLhs(1, 1);
41     CheckRhs(2, 2);
42
43     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
44     if (err.iErr)
45     {
46         printError(&err, 0);
47         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
48         return 0;
49     }
50
51     if (!isXMLAttr(addr, pvApiCtx) && !isXMLElem(addr, pvApiCtx) && !isXMLList(addr, pvApiCtx) && !isXMLSet(addr, pvApiCtx))
52     {
53         Scierror(999, gettext("%s: Wrong type for input argument #%d: A XMLAttr or a XMLElem or a XMLList or a XMLSet expected.\n"), fname, 1);
54         return 0;
55     }
56
57     id = getXMLObjectId(addr, pvApiCtx);
58     obj = XMLObject::getFromId<XMLObject>(id);
59     if (!obj)
60     {
61         Scierror(999, gettext("%s: XML attributes does not exist.\n"), fname);
62         return 0;
63     }
64
65     err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
66     if (err.iErr)
67     {
68         printError(&err, 0);
69         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
70         return 0;
71     }
72
73     if (!isStringType(pvApiCtx, addr))
74     {
75         Scierror(999, gettext("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"), fname, 2);
76         return 0;
77     }
78
79     if (getAllocatedMatrixOfString(pvApiCtx, addr, &rows, &cols, &keyValue))
80     {
81         return 0;
82     }
83
84     if (rows == 0 || (cols != 2 && cols != 3))
85     {
86         freeAllocatedMatrixOfString(rows, cols, keyValue);
87         Scierror(999, gettext("%s: Wrong size for input argument #%d: Matrix nx2 or nx3 of strings expected.\n"), fname, 2);
88         return 0;
89     }
90
91     if (cols == 2)
92     {
93         obj->setAttributeValue(const_cast<const char **>(keyValue), const_cast<const char **>(keyValue + rows), rows);
94     }
95     else
96     {
97         obj->setAttributeValue(const_cast<const char **>(keyValue), const_cast<const char **>(keyValue + rows), const_cast<const char **>(keyValue + 2 * rows), rows);
98     }
99     freeAllocatedMatrixOfString(rows, cols, keyValue);
100
101     obj->createOnStack(Rhs + 1, pvApiCtx);
102     LhsVar(1) = Rhs + 1;
103     PutLhsVar();
104
105     return 0;
106 }