8245a1efec6f910ea6493b0f23fafc9083fb639c
[scilab.git] / scilab / modules / external_objects / src / cpp / compile.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::compile(char * fname, const int envId, void * pvApiCtx)
19 {
20     SciErr err;
21     int row = 0, col = 0;
22     int * addr = 0;
23     char * className = 0;
24     char ** code = 0;
25     int ret = 0;
26     int iType = 0;
27
28     CheckInputArgument(pvApiCtx, 2, 2);
29
30     ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
31     ScilabGatewayOptions & options = env.getGatewayOptions();
32     OptionsHelper::setCopyOccurred(false);
33     ScilabObjects::initialization(env, pvApiCtx);
34     options.setIsNew(false);
35
36     className = ScilabObjects::getSingleString(1, pvApiCtx);
37
38     err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
39     if (err.iErr)
40     {
41         freeAllocatedSingleString(className);
42         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
43     }
44
45     err = getVarType(pvApiCtx, addr, &iType);
46     if (err.iErr)
47     {
48         freeAllocatedSingleString(className);
49         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
50     }
51
52     if (iType != sci_strings)
53     {
54         freeAllocatedSingleString(className);
55         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong type for input argument #%d: A String expected."), 2);
56     }
57
58     err = getVarDimension(pvApiCtx, addr, &row, &col);
59     if (err.iErr)
60     {
61         freeAllocatedSingleString(className);
62         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
63     }
64
65     if ((row < 1 || col != 1) && (col < 1 || row != 1))
66     {
67         freeAllocatedSingleString(className);
68         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid dimension for argument #%d: A row or a column expected."), 2);
69     }
70
71     if (getAllocatedMatrixOfString(pvApiCtx, addr, &row, &col, &code))
72     {
73         freeAllocatedSingleString(className);
74         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
75     }
76
77     try
78     {
79         ret = env.compilecode(className, code, row != 1 ? row : col);
80     }
81     catch (std::exception & e)
82     {
83         freeAllocatedSingleString(className);
84         freeAllocatedMatrixOfString(row, col, code);
85         throw;
86     }
87
88     freeAllocatedSingleString(className);
89     freeAllocatedMatrixOfString(row, col, code);
90
91     try
92     {
93         ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_CLASS, Rhs + 1, ret, envId, pvApiCtx);
94     }
95     catch (ScilabAbstractEnvironmentException & e)
96     {
97         env.removeobject(ret);
98         throw;
99     }
100
101     LhsVar(1) = Rhs + 1;
102     PutLhsVar();
103
104     return 0;
105 }
106 }