a98159ea628d0e9948e89677b1995d5db2da3407
[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 << "      -f file          : Batch mode on the given file." << std::endl;
65     std::cerr << "      -l lang          : Change the language of scilab ( default : en_US )." << std::endl;
66     std::cerr << "      -nw              : Enable console mode." << std::endl;
67     std::cerr << "      -nwni            : Enable terminal mode." << std::endl;
68     std::cerr << "      -ns              : Don't execute etc/scilab.start." << std::endl;
69     std::cerr << "      --help           : Display this help." << std::endl;
70     std::cerr << "Developer Trace arguments:" << std::endl;
71     std::cerr << "      --parse-trace    : Display bison state machine evolution." << std::endl;
72     std::cerr << "      --AST-trace      : Display ASCII-art AST to be human readable." << std::endl;
73     std::cerr << "      --pretty-print   : Display pretty-printed code, standard Scilab syntax." << std::endl;
74     std::cerr << " " << std::endl;
75     std::cerr << "Developer Timer arguments:" << std::endl;
76     std::cerr << "      --AST-timed      : Time each AST node." << std::endl;
77     std::cerr << "      --timed          : Time global execution." << std::endl;
78     std::cerr << " " << std::endl;
79     std::cerr << "Developer Debug arguments:" << std::endl;
80     std::cerr << "      --no-exec        : Only do Lexing/parsing do not execute instructions." << std::endl;
81     std::cerr << "      --context-dump   : Display context status." << std::endl;
82     std::cerr << "      --exec-verbose   : Display command before running it." << std::endl;
83 }
84
85 /*
86 ** Get Options
87 **
88 */
89 static int get_option(const int argc, char *argv[], ScilabEngineInfo* _pSEI)
90 {
91     int i = 0;
92
93 #ifdef DEBUG
94     std::cerr << "-*- Getting Options -*-" << std::endl;
95 #endif
96
97     for (i = 1; i < argc; ++i)
98     {
99         if (!strcmp("--parse-trace", argv[i]))
100         {
101             _pSEI->iParseTrace = 1;
102         }
103         else if (!strcmp("--pretty-print", argv[i]))
104         {
105             _pSEI->iPrintAst = 1;
106         }
107         else if (!strcmp("--help", argv[i]))
108         {
109             usage();
110             exit(WELL_DONE);
111         }
112         else if (!strcmp("--AST-trace", argv[i]))
113         {
114             _pSEI->iDumpAst = 1;
115         }
116         else if (!strcmp("--no-exec", argv[i]))
117         {
118             _pSEI->iExecAst = 0;
119         }
120         else if (!strcmp("--context-dump", argv[i]))
121         {
122             _pSEI->iDumpStack = 1;
123         }
124         else if (!strcmp("--timed", argv[i]))
125         {
126             _pSEI->iTimed = 1;
127             ConfigVariable::setTimed(true);
128         }
129         else if (!strcmp("--serialize", argv[i]))
130         {
131             _pSEI->iSerialize = 1;
132             ConfigVariable::setSerialize(true);
133         }
134         else if (!strcmp("--AST-timed", argv[i]))
135         {
136             std::cout << "Timed execution" << std::endl;
137             _pSEI->iAstTimed = 1;
138         }
139         else if (!strcmp("--parse-file", argv[i]))
140         {
141             i++;
142             if (argc >= i)
143             {
144                 _pSEI->pstParseFile = argv[i];
145             }
146         }
147         else if (!strcmp("-version", argv[i]))
148         {
149             i++;
150             if (argc >= i)
151             {
152                 _pSEI->iShowVersion = 1;
153             }
154         }
155         else if (!strcmp("-f", argv[i]))
156         {
157             i++;
158             if (argc >= i)
159             {
160                 _pSEI->pstFile = argv[i];
161             }
162         }
163         else if (!strcmp("-e", argv[i]))
164         {
165             i++;
166             if (argc >= i)
167             {
168                 _pSEI->pstExec = argv[i];
169             }
170         }
171         else if (!strcmp("-l", argv[i]))
172         {
173             i++;
174             if (argc >= i)
175             {
176                 _pSEI->pstLang = argv[i];
177             }
178         }
179         else if (!strcmp("-nw", argv[i]))
180         {
181             _pSEI->iConsoleMode = 1;
182         }
183         else if (!strcmp("-nwni", argv[i]))
184         {
185             _pSEI->iConsoleMode = 1;
186             _pSEI->iNoJvm = 1;
187         }
188         else if (!strcmp("-ns", argv[i]))
189         {
190             _pSEI->iNoStart = 1;
191         }
192         else if (!strcmp("-nb", argv[i]))
193         {
194             _pSEI->iNoBanner = 0;
195         }
196         else if (!strcmp("--exec-verbose", argv[i]))
197         {
198             _pSEI->iExecVerbose = 1;
199         }
200         else if (!strcmp("-keepconsole", argv[i]))
201         {
202             _pSEI->iKeepConsole = 1;
203         }
204     }
205
206     ConfigVariable::setCommandLineArgs(argc, argv);
207     return 0;
208 }
209
210 extern "C"
211 {
212 #include <stdio.h>
213
214 #ifndef _MSC_VER
215 #include <unistd.h>
216 #endif
217     extern char *getCmdLine(void);
218     extern void ConsolePrintf(const char *);
219 }
220
221 static void TermPrintf(const char *text)
222 {
223     //std::cout << text;
224     printf("%s", text);
225 }
226
227 /*
228 ** -*- MAIN -*-
229 */
230 //#if defined(_WIN32) && !defined(WITHOUT_GUI)
231 //int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
232 //#else
233 int main(int argc, char *argv[])
234 //#endif
235 {
236     int iRet = 0;
237
238 #ifdef ENABLE_MPI
239     initScilabMPI();
240 #endif
241
242     ScilabEngineInfo* pSEI = InitScilabEngineInfo();
243 #ifdef WITHOUT_GUI
244     /* Building Scilab-cli-bin. We won't ever had the gui nor the jvm */
245     pSEI->iConsoleMode = 1;
246     pSEI->iNoJvm = 1;
247     setScilabMode(SCILAB_NWNI);
248 #else
249     setScilabMode(SCILAB_STD);
250 #endif
251
252     //#if defined(_WIN32) && !defined(WITHOUT_GUI)
253     //    {
254     //        LPSTR my_argv[256];
255     //        int nArgs = 0;
256     //        LPWSTR *szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
257     //        if (szArglist)
258     //        {
259     //            for (int i = 0; i < nArgs; i++)
260     //            {
261     //                my_argv[i] = wide_string_to_UTF8(szArglist[i]);
262     //            }
263     //            LocalFree(szArglist);
264     //        }
265     //        get_option(nArgs, my_argv, pSEI);
266     //    }
267     //#else
268     get_option(argc, argv, pSEI);
269     //#endif
270
271     // if WITHOUT_GUI is defined
272     // force Terminal IO -> Terminal IO + StartScilabEngine
273
274     // WITHOUT_GUI (All Platform) => Terminal IO + StartScilabEngine
275     // GUI (MacOSX) =>      [no option]     -> Console IO + InitMacOSXEnv
276     //                      | [-nwni]       -> Terminal IO + StartScilabEngine
277     //                      | [-nw]         -> Terminal IO + InitMacOSXEnv
278 #ifndef WITHOUT_GUI
279     if (pSEI->iConsoleMode)
280     {
281         setScilabMode(SCILAB_NW);
282         setScilabInputMethod(&getCmdLine);
283         setScilabOutputMethod(&TermPrintf);
284 #if defined(__APPLE__)
285         if (pSEI->iNoJvm == 0)
286         {
287             return initMacOSXEnv(pSEI);
288         }
289 #endif // !defined(__APPLE__)
290     }
291     else
292     {
293         setScilabMode(SCILAB_STD);
294         setScilabInputMethod(&ConsoleRead);
295         setScilabOutputMethod(&ConsolePrintf);
296 #if defined(__APPLE__)
297         return initMacOSXEnv(pSEI);
298 #endif // !defined(__APPLE__)
299     }
300 #else
301     setScilabMode(SCILAB_NWNI);
302     setScilabInputMethod(&getCmdLine);
303     setScilabOutputMethod(&TermPrintf);
304 #endif // defined(WITHOUT_GUI)
305
306     if (pSEI->iShowVersion == 1)
307     {
308         disp_scilab_version();
309         exit(0);
310     }
311
312     int val = setjmp(ScilabJmpEnv);
313     if (!val)
314     {
315         StartScilabEngine(pSEI);
316         iRet = RunScilabEngine(pSEI);
317         StopScilabEngine(pSEI);
318         FREE(pSEI);
319         return iRet;
320     }
321     else
322     {
323         // We probably had a segfault so print error
324         std::wcerr << getLastErrorMessage() << std::endl;
325         return val;
326     }
327 }
328