fix non handled exception if error occurs in scilab.start
[scilab.git] / scilab / modules / startup / src / cpp / scilab.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2006-2008 - DIGITEO - Bruno JOFRET
4  *  Copyright (C) 2013 - Scilab Enterprises - Antoine ELIAS
5  *
6  *  This file must be used under the terms of the CeCILL.
7  *  This source file is licensed as described in the file COPYING, which
8  *  you should have received as part of this distribution.  The terms
9  *  are also available at
10  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14
15 #pragma comment(lib,"../../../../../bin/libintl.lib")
16
17 #include <cstdio>
18 #include <iostream>
19 #include <string.h>
20 #include <setjmp.h>
21
22 extern "C"
23 {
24 #ifdef __APPLE__
25 #include "initMacOSXEnv.h"
26 #endif
27 #include "InitScilab.h"
28 #include "configvariable_interface.h"
29 #include "scilabRead.h"
30 #include "ConsoleRead.h"
31 #include "version.h"
32 #include "sci_malloc.h"
33 #include "lasterror.h"
34
35     extern char *getCmdLine(void);
36 #ifdef _MSC_VER
37     jmp_buf ScilabJmpEnv;
38 #else
39     extern jmp_buf ScilabJmpEnv;
40 #endif
41 }
42
43 #include "configvariable.hxx"
44 #include "exit_status.hxx"
45 #include "scilabWrite.hxx"
46
47 #define INTERACTIVE     -1
48
49 extern "C"
50 {
51 #ifdef ENABLE_MPI
52 #include "initMPI.h"
53 #endif
54 }
55
56 /*
57 ** Usage
58 **
59 ** Display usage : options available
60 */
61 static void usage(void)
62 {
63     std::cerr << "Usage: Scilab <options>" << std::endl;
64     std::cerr << "      -e Instruction   : execute the scilab instruction given in Instruction argument.";
65     std::cerr << "                         -e and -f arguments are mutually exclusive.";
66     std::cerr << "      -f File          : execute the scilab script given in File argument.";
67     std::cerr << "                         -e and -f arguments are mutually exclusive.";
68     std::cerr << "      -quit            : force scilab exit after execution of script from -e or -f argument.";
69     std::cerr << "                         this flag is ignored if it is not used with -e or -f argument.";
70     std::cerr << "      -l lang          : Change the language of scilab ( default : en_US )." << std::endl;
71     std::cerr << "      -nw              : Enable console mode." << std::endl;
72     std::cerr << "      -nwni            : Enable terminal mode." << std::endl;
73     std::cerr << "      -ns              : Don't execute etc/scilab.start." << std::endl;
74     std::cerr << "      --help           : Display this help." << std::endl;
75     std::cerr << "Developer Trace arguments:" << std::endl;
76     std::cerr << "      --parse-trace    : Display bison state machine evolution." << std::endl;
77     std::cerr << "      --AST-trace      : Display ASCII-art AST to be human readable." << std::endl;
78     std::cerr << "      --pretty-print   : Display pretty-printed code, standard Scilab syntax." << std::endl;
79     std::cerr << " " << std::endl;
80     std::cerr << "Developer Timer arguments:" << std::endl;
81     std::cerr << "      --AST-timed      : Time each AST node." << std::endl;
82     std::cerr << "      --timed          : Time global execution." << std::endl;
83     std::cerr << " " << std::endl;
84     std::cerr << "Developer Debug arguments:" << std::endl;
85     std::cerr << "      --no-exec        : Only do Lexing/parsing do not execute instructions." << std::endl;
86     std::cerr << "      --context-dump   : Display context status." << std::endl;
87     std::cerr << "      --exec-verbose   : Display command before running it." << std::endl;
88 }
89
90 /*
91 ** Get Options
92 **
93 */
94 static int get_option(const int argc, char *argv[], ScilabEngineInfo* _pSEI)
95 {
96     int i = 0;
97
98 #ifdef DEBUG
99     std::cerr << "-*- Getting Options -*-" << std::endl;
100 #endif
101
102     for (i = 1; i < argc; ++i)
103     {
104         if (!strcmp("--parse-trace", argv[i]))
105         {
106             _pSEI->iParseTrace = 1;
107         }
108         else if (!strcmp("--pretty-print", argv[i]))
109         {
110             _pSEI->iPrintAst = 1;
111         }
112         else if (!strcmp("--help", argv[i]))
113         {
114             usage();
115             exit(WELL_DONE);
116         }
117         else if (!strcmp("--AST-trace", argv[i]))
118         {
119             _pSEI->iDumpAst = 1;
120         }
121         else if (!strcmp("--no-exec", argv[i]))
122         {
123             _pSEI->iExecAst = 0;
124         }
125         else if (!strcmp("--context-dump", argv[i]))
126         {
127             _pSEI->iDumpStack = 1;
128         }
129         else if (!strcmp("--timed", argv[i]))
130         {
131             _pSEI->iTimed = 1;
132             ConfigVariable::setTimed(true);
133         }
134         else if (!strcmp("--serialize", argv[i]))
135         {
136             _pSEI->iSerialize = 1;
137             ConfigVariable::setSerialize(true);
138         }
139         else if (!strcmp("--AST-timed", argv[i]))
140         {
141             std::cout << "Timed execution" << std::endl;
142             _pSEI->iAstTimed = 1;
143         }
144         else if (!strcmp("--parse-file", argv[i]))
145         {
146             i++;
147             if (argc >= i)
148             {
149                 _pSEI->pstParseFile = argv[i];
150             }
151         }
152         else if (!strcmp("-quit", argv[i]))
153         {
154             _pSEI->iForceQuit = 1;
155         }
156         else if (!strcmp("-version", argv[i]))
157         {
158             i++;
159             if (argc >= i)
160             {
161                 _pSEI->iShowVersion = 1;
162             }
163         }
164         else if (!strcmp("-f", argv[i]))
165         {
166             i++;
167             if (argc >= i)
168             {
169                 _pSEI->pstFile = argv[i];
170             }
171         }
172         else if (!strcmp("-e", argv[i]))
173         {
174             i++;
175             if (argc >= i)
176             {
177                 _pSEI->pstExec = argv[i];
178             }
179         }
180         else if (!strcmp("-l", argv[i]))
181         {
182             i++;
183             if (argc >= i)
184             {
185                 _pSEI->pstLang = argv[i];
186             }
187         }
188         else if (!strcmp("-nw", argv[i]))
189         {
190             _pSEI->iConsoleMode = 1;
191         }
192         else if (!strcmp("-nwni", argv[i]))
193         {
194             _pSEI->iConsoleMode = 1;
195             _pSEI->iNoJvm = 1;
196         }
197         else if (!strcmp("-ns", argv[i]))
198         {
199             _pSEI->iNoStart = 1;
200         }
201         else if (!strcmp("-nb", argv[i]))
202         {
203             _pSEI->iNoBanner = 0;
204         }
205         else if (!strcmp("--exec-verbose", argv[i]))
206         {
207             _pSEI->iExecVerbose = 1;
208         }
209         else if (!strcmp("-keepconsole", argv[i]))
210         {
211             _pSEI->iKeepConsole = 1;
212         }
213     }
214
215     ConfigVariable::setCommandLineArgs(argc, argv);
216     return 0;
217 }
218
219 extern "C"
220 {
221 #include <stdio.h>
222
223 #ifndef _MSC_VER
224 #include <unistd.h>
225 #endif
226     extern char *getCmdLine(void);
227     extern void ConsolePrintf(const char *);
228 }
229
230 static void TermPrintf(const char *text)
231 {
232     //std::cout << text;
233     printf("%s", text);
234 }
235
236 /*
237 ** -*- MAIN -*-
238 */
239 //#if defined(_WIN32) && !defined(WITHOUT_GUI)
240 //int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
241 //#else
242 int main(int argc, char *argv[])
243 //#endif
244 {
245     int iRet = 0;
246
247 #ifdef ENABLE_MPI
248     initScilabMPI();
249 #endif
250
251     ScilabEngineInfo* pSEI = InitScilabEngineInfo();
252 #ifdef WITHOUT_GUI
253     /* Building Scilab-cli-bin. We won't ever had the gui nor the jvm */
254     pSEI->iConsoleMode = 1;
255     pSEI->iNoJvm = 1;
256     setScilabMode(SCILAB_NWNI);
257 #else
258     setScilabMode(SCILAB_STD);
259 #endif
260
261     //#if defined(_WIN32) && !defined(WITHOUT_GUI)
262     //    {
263     //        LPSTR my_argv[256];
264     //        int nArgs = 0;
265     //        LPWSTR *szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
266     //        if (szArglist)
267     //        {
268     //            for (int i = 0; i < nArgs; i++)
269     //            {
270     //                my_argv[i] = wide_string_to_UTF8(szArglist[i]);
271     //            }
272     //            LocalFree(szArglist);
273     //        }
274     //        get_option(nArgs, my_argv, pSEI);
275     //    }
276     //#else
277     get_option(argc, argv, pSEI);
278     //#endif
279
280     // if WITHOUT_GUI is defined
281     // force Terminal IO -> Terminal IO + StartScilabEngine
282
283     // WITHOUT_GUI (All Platform) => Terminal IO + StartScilabEngine
284     // GUI (MacOSX) =>      [no option]     -> Console IO + InitMacOSXEnv
285     //                      | [-nwni]       -> Terminal IO + StartScilabEngine
286     //                      | [-nw]         -> Terminal IO + InitMacOSXEnv
287 #ifndef WITHOUT_GUI
288     if (pSEI->iConsoleMode)
289     {
290         setScilabMode(SCILAB_NW);
291         setScilabInputMethod(&getCmdLine);
292         setScilabOutputMethod(&TermPrintf);
293 #if defined(__APPLE__)
294         if (pSEI->iNoJvm == 0)
295         {
296             return initMacOSXEnv(pSEI);
297         }
298 #endif // !defined(__APPLE__)
299     }
300     else
301     {
302         setScilabMode(SCILAB_STD);
303         setScilabInputMethod(&ConsoleRead);
304         setScilabOutputMethod(&ConsolePrintf);
305 #if defined(__APPLE__)
306         return initMacOSXEnv(pSEI);
307 #endif // !defined(__APPLE__)
308     }
309 #else
310     setScilabMode(SCILAB_NWNI);
311     setScilabInputMethod(&getCmdLine);
312     setScilabOutputMethod(&TermPrintf);
313 #endif // defined(WITHOUT_GUI)
314
315     if (pSEI->iShowVersion == 1)
316     {
317         disp_scilab_version();
318         exit(0);
319     }
320
321     int val = setjmp(ScilabJmpEnv);
322     if (!val)
323     {
324         iRet = StartScilabEngine(pSEI);
325         if (iRet == 0)
326         {
327             iRet = RunScilabEngine(pSEI);
328         }
329
330         StopScilabEngine(pSEI);
331         FREE(pSEI);
332         return iRet;
333     }
334     else
335     {
336         // We probably had a segfault so print error
337         std::wcerr << getLastErrorMessage() << std::endl;
338         return val;
339     }
340 }
341