JIMS: can now compile a set of Java files
[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 - 2013 - 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, 1, 2);
29     CheckOutputArgument(pvApiCtx, 0, 1);
30
31     ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
32     ScilabGatewayOptions & options = env.getGatewayOptions();
33     OptionsHelper::setCopyOccurred(false);
34     ScilabObjects::initialization(env, pvApiCtx);
35     options.setIsNew(false);
36
37     if (Rhs == 1)
38     {
39         className = strdup("");
40     }
41     else
42     {
43         className = ScilabObjects::getSingleString(1, pvApiCtx);
44     }
45
46     err = getVarAddressFromPosition(pvApiCtx, Rhs, &addr);
47     if (err.iErr)
48     {
49         freeAllocatedSingleString(className);
50         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
51     }
52
53     err = getVarType(pvApiCtx, addr, &iType);
54     if (err.iErr)
55     {
56         freeAllocatedSingleString(className);
57         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
58     }
59
60     if (iType != sci_strings)
61     {
62         freeAllocatedSingleString(className);
63         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong type for input argument #%d: A String expected."), 2);
64     }
65
66     err = getVarDimension(pvApiCtx, addr, &row, &col);
67     if (err.iErr)
68     {
69         freeAllocatedSingleString(className);
70         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
71     }
72
73     if ((row < 1 || col != 1) && (col < 1 || row != 1))
74     {
75         freeAllocatedSingleString(className);
76         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid dimension for argument #%d: A row or a column expected."), 2);
77     }
78
79     if (getAllocatedMatrixOfString(pvApiCtx, addr, &row, &col, &code))
80     {
81         freeAllocatedSingleString(className);
82         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
83     }
84
85     try
86     {
87         ret = env.compilecode(className, code, row != 1 ? row : col);
88     }
89     catch (std::exception & e)
90     {
91         freeAllocatedSingleString(className);
92         freeAllocatedMatrixOfString(row, col, code);
93         throw;
94     }
95
96     freeAllocatedSingleString(className);
97     freeAllocatedMatrixOfString(row, col, code);
98
99     if (ret == -1)
100     {
101         LhsVar(1) = 0;
102     }
103     else
104     {
105         try
106         {
107             ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_CLASS, Rhs + 1, ret, envId, pvApiCtx);
108         }
109         catch (ScilabAbstractEnvironmentException & e)
110         {
111             env.removeobject(ret);
112             throw;
113         }
114
115         LhsVar(1) = Rhs + 1;
116     }
117
118     PutLhsVar();
119
120     return 0;
121 }
122 }