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