Fix typos in messages and comments.
[scilab.git] / scilab / modules / external_objects / src / cpp / wrapAsRef.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - 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 "ScilabGateway.hxx"
14
15 namespace org_modules_external_objects
16 {
17
18 int ScilabGateway::wrapAsRef(char * fname, const int envId, void * pvApiCtx)
19 {
20     SciErr err;
21     int * tmpvar = 0;
22     int * addr = 0;
23     char * varName = 0;
24     int idObj;
25
26     if (Rhs == 0)
27     {
28         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong number of arguments : more than 1 argument expected."));
29     }
30
31     ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
32     ScilabGatewayOptions & options = env.getGatewayOptions();
33     OptionsHelper::setCopyOccured(false);
34     ScilabObjects::initialization(env, pvApiCtx);
35     options.setIsNew(false);
36
37     CheckOutputArgument(pvApiCtx, Rhs, Rhs);
38
39     tmpvar = new int[Rhs + 1];
40     *tmpvar = 0;
41
42     for (int i = 1; i < Rhs + 1; i++)
43     {
44         err = getVarAddressFromPosition(pvApiCtx, i, &addr);
45         if (err.iErr)
46         {
47             ScilabObjects::removeTemporaryVars(envId, tmpvar);
48             delete[] tmpvar;
49             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
50         }
51
52         if (!isScalar(pvApiCtx, addr) || !isStringType(pvApiCtx, addr))
53         {
54             ScilabObjects::removeTemporaryVars(envId, tmpvar);
55             delete[] tmpvar;
56             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Can only wrap as a reference to a named variable"));
57         }
58
59         if (getAllocatedSingleString(pvApiCtx, addr, &varName))
60         {
61             ScilabObjects::removeTemporaryVars(envId, tmpvar);
62             delete[] tmpvar;
63             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
64         }
65
66         err = getVarAddressFromName(pvApiCtx, varName, &addr);
67         freeAllocatedSingleString(varName);
68         if (err.iErr)
69         {
70             ScilabObjects::removeTemporaryVars(envId, tmpvar);
71             delete[] tmpvar;
72             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
73         }
74
75         try
76         {
77             idObj = ScilabObjects::getArgumentId(addr, tmpvar, true, false, envId, pvApiCtx);
78         }
79         catch (ScilabAbstractEnvironmentException & e)
80         {
81             delete[] tmpvar;
82             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Cannot wrap argument %d."), i);
83         }
84
85         try
86         {
87             ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_OBJECT, Rhs + i, idObj, envId, pvApiCtx);
88         }
89         catch (ScilabAbstractEnvironmentException & e)
90         {
91             ScilabObjects::removeTemporaryVars(envId, tmpvar);
92             delete[] tmpvar;
93             throw;
94         }
95
96         LhsVar(i) = Rhs + i;
97     }
98
99     // We don't remove tmpvar since it contains id which are put on rhs
100     delete[] tmpvar;
101
102     PutLhsVar();
103
104     return 0;
105 }
106 }