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