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