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