Respecting users JAVA_HOME; be quiet when running java_home in OSX
[scilab.git] / scilab / modules / console / src / c / others / mainscic.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA - Allan CORNET
4  * Copyright (C) 2008 - INRIA - Bruno JOFRET
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.1-en.txt
11  *
12  */
13 /*--------------------------------------------------------------------------*/
14 #include <unistd.h>             /* isatty */
15 #include <stdlib.h>             /* stdin */
16 #include <stdio.h>
17 extern "C" {
18 #include "core_math.h"
19 #include "version.h"
20 #include "realmain.h"           /* realmain */
21 #include "scimem.h"             /* nofpex */
22 #include "scilabmode.h"
23 #include "getcommandlineargs.h"
24 #include "texmacs.h"
25 #include "Thread_Wrapper.h"
26 #include "core_math.h"
27 #include "setgetlanguage.h"
28 #include "LaunchScilabSignal.h"
29 #include "setenvc.h"
30 #include "signal_mgmt.h"
31 #include "cliDisplayManagement.h"
32
33 #ifdef __APPLE__
34 #include "initMacOSXEnv.h"
35 #endif
36
37 #if defined(linux) && defined(__i386__)
38 #include "setPrecisionFPU.h"
39 #endif
40 }
41 /*--------------------------------------------------------------------------*/
42 #define MIN_STACKSIZE 8000000
43 /*--------------------------------------------------------------------------*/
44
45 /*
46  * Private function to check any linker errors
47  */
48 static void checkForLinkerErrors(void);
49
50 /*
51  * see http://www.gnu.org/software/autoconf/manual/autoconf.html and
52  * search for F77_DUMMY_MAIN
53  */
54 #ifdef F77_DUMMY_MAIN
55 #ifdef __cplusplus
56 extern "C"
57 #endif
58 int F77_DUMMY_MAIN()
59 {
60     return 1;
61 }
62 #endif
63
64 int main(int argc, char **argv)
65 {
66
67     int i;
68     int no_startup_flag = 0;
69     int memory = MIN_STACKSIZE;
70
71     char *initial_script = NULL;
72     InitScriptType initial_script_type = SCILAB_SCRIPT;
73
74     /* This bug only occurs under Linux 32 bits
75      * See: http://wiki.scilab.org/Scilab_precision
76      */
77 #if defined(linux) && defined(__i386__)
78     setFPUToDouble();
79 #endif
80
81     InitializeLaunchScilabSignal();
82
83     /* Management of the signals (seg fault, floating point exception, etc) */
84     if (getenv("SCI_DISABLE_EXCEPTION_CATCHING") == NULL)
85     {
86         base_error_init();
87     }
88
89 #if defined(netbsd) || defined(freebsd)
90     /* floating point exceptions */
91     fpsetmask(0);
92 #endif
93
94 #ifdef WITHOUT_GUI
95     setScilabMode(SCILAB_NWNI);
96 #else
97     setScilabMode(SCILAB_STD);
98 #endif
99
100     /* scanning options */
101     for (i = 1; i < argc; i++)
102     {
103         if (strcmp(argv[i], "-nw") == 0)
104         {
105             setScilabMode(SCILAB_NW);
106         }
107         else if (strcmp(argv[i], "-nwni") == 0 || strcmp(argv[i], "-nogui") == 0)
108         {
109             setScilabMode(SCILAB_NWNI);
110         }
111         else if (strcmp(argv[i], "-display") == 0 || strcmp(argv[i], "-d") == 0)
112         {
113             /* @TODO Buffer overflow here */
114             char dpy[128];
115
116             sprintf(dpy, "DISPLAY=%s", argv[++i]);
117             putenv(dpy);
118         }
119         else if (strcmp(argv[i], "-l") == 0)
120         {
121             char *argLang = strdup(argv[++i]);
122
123             /* Export the locale. This is going to be used by setlanguage("") in
124              * modules/localization/src/c/InitializeLocalization.c */
125             if (strcmp(argLang, "en") == 0)
126             {
127                 /* backward compatiblity en => en_US */
128                 setenvc("LANG", "en_US");
129             }
130             else
131             {
132                 if (strcmp(argLang, "fr") == 0)
133                 {
134                     /* backward compatiblity fr => fr_FR */
135                     setenvc("LANG", "fr_FR");
136                 }
137                 else
138                 {
139                     setenvc("LANG", argLang);
140                 }
141             }
142
143             free(argLang);
144
145         }
146         else if (strcmp(argv[i], "-ns") == 0)
147         {
148             no_startup_flag = 1;
149         }
150         else if (strcmp(argv[i], "-mem") == 0)
151         {
152             i++;
153             memory = Max(atoi(argv[i]), MIN_STACKSIZE);
154         }
155         else if (strcmp(argv[i], "-f") == 0)
156         {
157             initial_script = argv[++i];
158         }
159         else if (strcmp(argv[i], "-e") == 0)
160         {
161             initial_script = argv[++i];
162             initial_script_type = SCILAB_CODE;
163         }
164         else if (strcmp(argv[i], "--texmacs") == 0)
165         {
166             setScilabMode(SCILAB_NW);
167             settexmacs();
168         }
169         else if (strcmp(argv[i], "-nocolor") == 0)
170         {
171             setCLIColor(FALSE);
172         }
173         else if (strcmp(argv[i], "-version") == 0)
174         {
175             disp_scilab_version();
176             exit(1);
177         }
178     }
179
180
181     if (!isatty(fileno(stdin)) && getScilabMode() != SCILAB_STD)
182     {
183         /*
184          * if not an interactive terminal
185          * then, we are disabling the banner
186          * Since the banner is disabled in the scilab script checking
187          * with the function sciargs is -nb is present, I add this argument
188          * by hand
189          */
190
191         char **pNewArgv = (char **)malloc((argc + 1) * sizeof(char *));
192
193         for (i = 0; i < argc; i++)
194         {
195             pNewArgv[i] = (char *)malloc((strlen(argv[i]) + 1) * sizeof(char));
196             strcpy(pNewArgv[i], argv[i]);
197         }
198
199 #define NB_ARG "-nb"
200         pNewArgv[i] = (char *)malloc((strlen(NB_ARG) + 1) * sizeof(char));
201         strcpy(pNewArgv[i], NB_ARG);
202         i++;
203
204         argv = pNewArgv;
205         argc = argc + 1;
206
207     }
208
209     setCommandLineArgs(argv, argc);
210
211
212 #ifndef WITH_GUI
213     if (getScilabMode() != SCILAB_NWNI)
214     {
215         fprintf(stderr, "Scilab was compiled without its GUI and advanced features. Run scilab-cli or us the -nwni option.\n");
216         exit(1);
217     }
218 #endif
219
220     checkForLinkerErrors();
221
222 #ifndef __APPLE__
223     return realmain(no_startup_flag, initial_script, initial_script_type, memory);
224 #else
225 #ifdef WITHOUT_GUI
226     /* Do not use this function when building scilab-bin under Mac OS X
227      * not that this function is however used by scilab-cli-bin under Mac OS X */
228     return realmain(no_startup_flag, initial_script, initial_script_type, memory);
229 #else
230     /* The Mac OS X Java/Swing integration doesn't work the same way as Microsoft Windows or GNU/Linux */
231     return initMacOSXEnv(no_startup_flag, initial_script, initial_script_type, memory);
232 #endif
233 #endif
234 }
235
236 /*--------------------------------------------------------------------------*/
237 extern "C" {
238 /* Defined without include to avoid useless header dependency */
239 BOOL isItTheDisabledLib(void);
240 }
241
242 static void checkForLinkerErrors(void)
243 {
244     /*
245        Depending on the linking order, sometime, libs are not loaded the right way.
246        This can cause painful debugging tasks for packager or developer, we are
247        doing the check to help them.
248     */
249 #define LINKER_ERROR_1 "Scilab startup function detected that the function proposed to the engine is the wrong one. Usually, it comes from a linker problem in your distribution/OS.\n"
250 #define LINKER_ERROR_2 "If you do not know what it means, please report a bug on http://bugzilla.scilab.org/. If you do, you probably know that you should change the link order in SCI/modules/Makefile.am\n"
251     if (getScilabMode() != SCILAB_NWNI)
252     {
253         if (isItTheDisabledLib())
254         {
255             fprintf(stderr, LINKER_ERROR_1);
256             fprintf(stderr, "Here, Scilab should have 'libscijvm' defined but gets 'libscijvm-disable' instead.\n");
257             fprintf(stderr, LINKER_ERROR_2);
258             exit(1);
259
260         }
261     }
262     else
263     {
264         /* NWNI mode */
265         if (!isItTheDisabledLib())
266         {
267             fprintf(stderr, LINKER_ERROR_1);
268             fprintf(stderr, "Here, Scilab should have 'libscijvm-disable' defined but gets 'libscijvm' instead.\n");
269             fprintf(stderr, LINKER_ERROR_2);
270             exit(1);
271         }
272     }
273 #undef LINKER_ERROR_1
274 #undef LINKER_ERROR_2
275 }