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