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