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