cleanup in s/darwin.h, define DARWIN_OS and use it instead of DARWIN and/or MAC_OSX...
[bpt/emacs.git] / src / emacs.c
CommitLineData
f927c5ae 1/* Fully extensible Emacs, running on Unix, intended for GNU.
0b5538bd 2 Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 1998, 1999,
ea8c20e0
GM
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
4 Free Software Foundation, Inc.
f927c5ae
JB
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
f927c5ae 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
f927c5ae
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
f927c5ae
JB
20
21
68c45bf0 22#include <config.h>
f927c5ae
JB
23#include <signal.h>
24#include <errno.h>
f927c5ae
JB
25#include <stdio.h>
26
27#include <sys/types.h>
28#include <sys/file.h>
29
cda4a5fd
GM
30#ifdef HAVE_UNISTD_H
31#include <unistd.h>
32#endif
33
488b7cb3 34#ifdef BSD_SYSTEM
f927c5ae
JB
35#include <sys/ioctl.h>
36#endif
37
edd3ff1d
JR
38#ifdef WINDOWSNT
39#include <fcntl.h>
52c7f9ee
JR
40#include <windows.h> /* just for w32.h */
41#include "w32.h"
c68a2829 42#include "w32heap.h" /* for prototype of sbrk */
edd3ff1d
JR
43#endif
44
edfda783
AR
45#ifdef NS_IMPL_GNUSTEP
46/* At least under Debian, GSConfig is in a subdirectory. --Stef */
47#include <GNUstepBase/GSConfig.h>
48#endif
49
f927c5ae
JB
50#include "lisp.h"
51#include "commands.h"
bef79ee4 52#include "intervals.h"
a08a816a 53#include "buffer.h"
3f6abfd7 54#include "window.h"
f927c5ae 55
edc8ae07 56#include "systty.h"
6c3a4e9d 57#include "blockinput.h"
8090eb09 58#include "syssignal.h"
6c362a8b 59#include "process.h"
428a555e 60#include "frame.h"
5bda49c6 61#include "termhooks.h"
dfcf069d 62#include "keyboard.h"
e35f6ff7 63#include "keymap.h"
a41f8bed 64
68c45bf0
PE
65#ifdef HAVE_SETLOCALE
66#include <locale.h>
67#endif
68
53c58b5d
RS
69#ifdef HAVE_SETRLIMIT
70#include <sys/time.h>
71#include <sys/resource.h>
72#endif
73
dede2792
JD
74#ifdef HAVE_PERSONALITY_LINUX32
75#include <sys/personality.h>
76#endif
77
f927c5ae
JB
78#ifndef O_RDWR
79#define O_RDWR 2
80#endif
81
f95c3f91 82#ifdef HAVE_SETPGID
2b7e8799 83#if !defined (USG) || defined (BSD_PGRPS)
90553aa3 84#undef setpgrp
f95c3f91
GM
85#define setpgrp setpgid
86#endif
2b7e8799 87#endif
f95c3f91 88
90553aa3
DL
89extern void malloc_warning P_ ((char *));
90extern void set_time_zone_rule P_ ((char *));
8892f40b
GM
91#ifdef HAVE_INDEX
92extern char *index P_ ((const char *, int));
93#endif
43165242 94
30aa3f19
GM
95/* Make these values available in GDB, which doesn't see macros. */
96
6b61353c
KH
97#ifdef USE_LSB_TAG
98int gdb_use_lsb = 1;
99#else
100int gdb_use_lsb = 0;
101#endif
6e5cb96f 102#ifndef USE_LISP_UNION_TYPE
6b61353c
KH
103int gdb_use_union = 0;
104#else
105int gdb_use_union = 1;
106#endif
30aa3f19
GM
107EMACS_INT gdb_valbits = VALBITS;
108EMACS_INT gdb_gctypebits = GCTYPEBITS;
30aa3f19
GM
109#ifdef DATA_SEG_BITS
110EMACS_INT gdb_data_seg_bits = DATA_SEG_BITS;
111#else
df50cf6c 112EMACS_INT gdb_data_seg_bits = 0;
30aa3f19 113#endif
00da0e4a 114EMACS_INT PVEC_FLAG = PSEUDOVECTOR_FLAG;
3fba6ca9 115EMACS_INT gdb_array_mark_flag = ARRAY_MARK_FLAG;
6baa02d6
EZ
116/* GDB might say "No enum type named pvec_type" if we don't have at
117 least one symbol with that type, and then xbacktrace could fail. */
118enum pvec_type gdb_pvec_type = PVEC_TYPE_MASK;
30aa3f19 119
7db35a48 120/* Command line args from shell, as list of strings. */
f927c5ae
JB
121Lisp_Object Vcommand_line_args;
122
59653951
JB
123/* The name under which Emacs was invoked, with any leading directory
124 names discarded. */
125Lisp_Object Vinvocation_name;
126
ace40a69
RS
127/* The directory name from which Emacs was invoked. */
128Lisp_Object Vinvocation_directory;
129
07f4d123
RS
130/* The directory name in which to find subdirs such as lisp and etc.
131 nil means get them only from PATH_LOADSEARCH. */
132Lisp_Object Vinstallation_directory;
133
e5d77022
JB
134/* Hook run by `kill-emacs' before it does really anything. */
135Lisp_Object Vkill_emacs_hook;
136
7e9fa161
JB
137/* Empty lisp strings. To avoid having to build any others. */
138Lisp_Object empty_unibyte_string, empty_multibyte_string;
f9a6326d 139
074a066b
GV
140/* Search path separator. */
141Lisp_Object Vpath_separator;
142
f927c5ae
JB
143/* Set nonzero after Emacs has started up the first time.
144 Prevents reinitialization of the Lisp world and keymaps
145 on subsequent starts. */
146int initialized;
147
15aaf1b5
RS
148#ifdef DOUG_LEA_MALLOC
149/* Preserves a pointer to the memory allocated that copies that
150 static data inside glibc's malloc. */
151void *malloc_state_ptr;
152/* From glibc, a routine that returns a copy of the malloc internal state. */
153extern void *malloc_get_state ();
154/* From glibc, a routine that overwrites the malloc internal state. */
fa8459a3 155extern int malloc_set_state ();
7c9cd446
AS
156/* Non-zero if the MALLOC_CHECK_ enviroment variable was set while
157 dumping. Used to work around a bug in glibc's malloc. */
158int malloc_using_checking;
15aaf1b5
RS
159#endif
160
271c7b7c 161/* Variable whose value is symbol giving operating system type. */
f927c5ae 162Lisp_Object Vsystem_type;
271c7b7c
RS
163
164/* Variable whose value is string giving configuration built for. */
165Lisp_Object Vsystem_configuration;
f0fc0b1a
KH
166
167/* Variable whose value is string giving configuration options,
168 for use when reporting bugs. */
169Lisp_Object Vsystem_configuration_options;
170
213d0b1f
RS
171Lisp_Object Qfile_name_handler_alist;
172
68c45bf0 173/* Current and previous system locales for messages and time. */
ca9c0567
PE
174Lisp_Object Vsystem_messages_locale;
175Lisp_Object Vprevious_system_messages_locale;
176Lisp_Object Vsystem_time_locale;
177Lisp_Object Vprevious_system_time_locale;
68c45bf0 178
7d0393cf 179/* If non-zero, emacs should not attempt to use a window-specific code,
7db35a48 180 but instead should use the virtual terminal under which it was started. */
f927c5ae
JB
181int inhibit_window_system;
182
5aa7f46a
JB
183/* If nonzero, set Emacs to run at this priority. This is also used
184 in child_setup and sys_suspend to make sure subshells run at normal
7db35a48 185 priority; those functions have their own extern declaration. */
31ade731 186EMACS_INT emacs_priority;
3005da00 187
7db35a48
PJ
188/* If non-zero, a filter or a sentinel is running. Tested to save the match
189 data on the first attempt to change it inside asynchronous code. */
7074fde6
FP
190int running_asynch_code;
191
647cec74 192#ifdef BSD_PGRPS
9ae8f997
JB
193/* See sysdep.c. */
194extern int inherited_pgroup;
195#endif
196
edfda783 197#if defined(HAVE_X_WINDOWS) || defined(HAVE_NS)
7db35a48 198/* If non-zero, -d was specified, meaning we're using some window system. */
f927c5ae
JB
199int display_arg;
200#endif
201
202/* An address near the bottom of the stack.
203 Tells GC how to save a copy of the stack. */
204char *stack_bottom;
205
dede2792
JD
206/* The address where the heap starts (from the first sbrk (0) call). */
207static void *my_heap_start;
208
209/* The gap between BSS end and heap start as far as we can tell. */
210static unsigned long heap_bss_diff;
211
212/* If the gap between BSS end and heap start is larger than this we try to
213 work around it, and if that fails, output a warning in dump-emacs. */
214#define MAX_HEAP_BSS_DIFF (1024*1024)
215
216
8ba50e1a 217#ifdef HAVE_WINDOW_SYSTEM
2246281f 218extern Lisp_Object Vinitial_window_system;
8ba50e1a 219#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae 220
1090a161
RS
221extern Lisp_Object Vauto_save_list_file_name;
222
9db03f6c
KS
223extern Lisp_Object Vinhibit_redisplay;
224
f927c5ae
JB
225/* Nonzero means running Emacs without interactive terminal. */
226
227int noninteractive;
228
229/* Value of Lisp variable `noninteractive'.
230 Normally same as C variable `noninteractive'
231 but nothing terrible happens if user sets this one. */
232
233int noninteractive1;
e29f86e4
RS
234
235/* Save argv and argc. */
236char **initial_argv;
237int initial_argc;
081bef73
RS
238
239static void sort_args ();
dfcf069d 240void syms_of_emacs ();
bd4590ba 241
6b61353c
KH
242/* MSVC needs each string be shorter than 2048 bytes, so the usage
243 strings below are split to not overflow this limit. */
73ebcd25 244#define USAGE1 "\
bd4590ba
GM
245Usage: %s [OPTION-OR-FILENAME]...\n\
246\n\
247Run Emacs, the extensible, customizable, self-documenting real-time\n\
248display editor. The recommended way to start Emacs for normal editing\n\
249is with no options at all.\n\
250\n\
49ca717b 251Run M-x info RET m emacs RET m emacs invocation RET inside Emacs to\n\
bd4590ba
GM
252read the main documentation for these command-line arguments.\n\
253\n\
254Initialization options:\n\
255\n\
6b61353c
KH
256--batch do not do interactive display; implies -q\n\
257--debug-init enable Emacs Lisp debugger for init file\n\
258--display, -d DISPLAY use X server DISPLAY\n\
259--multibyte, --no-unibyte inhibit the effect of EMACS_UNIBYTE\n\
260--no-desktop do not load a saved desktop\n\
261--no-init-file, -q load neither ~/.emacs nor default.el\n\
262--no-shared-memory, -nl do not use shared memory\n\
263--no-site-file do not load site-start.el\n\
264--no-splash do not display a splash screen on startup\n\
2ff86b4e 265--no-window-system, -nw do not communicate with X, ignoring $DISPLAY\n\
bae52079 266--quick, -Q equivalent to -q --no-site-file --no-splash\n\
6b61353c
KH
267--script FILE run FILE as an Emacs Lisp script\n\
268--terminal, -t DEVICE use DEVICE for terminal I/O\n\
bd4590ba 269--unibyte, --no-multibyte run Emacs in unibyte mode\n\
6b61353c
KH
270--user, -u USER load ~USER/.emacs instead of your own\n\
271\n%s"
272
273#define USAGE2 "\
bd4590ba
GM
274Action options:\n\
275\n\
6b61353c 276FILE visit FILE using find-file\n\
1dce1149
RS
277+LINE go to line LINE in next FILE\n\
278+LINE:COLUMN go to line LINE, column COLUMN, in next FILE\n\
6b61353c
KH
279--directory, -L DIR add DIR to variable load-path\n\
280--eval EXPR evaluate Emacs Lisp expression EXPR\n\
281--execute EXPR evaluate Emacs Lisp expression EXPR\n\
282--file FILE visit FILE using find-file\n\
283--find-file FILE visit FILE using find-file\n\
284--funcall, -f FUNC call Emacs Lisp function FUNC with no arguments\n\
285--insert FILE insert contents of FILE into current buffer\n\
286--kill exit without asking for confirmation\n\
287--load, -l FILE load Emacs Lisp FILE using the load function\n\
288--visit FILE visit FILE using find-file\n\
73ebcd25
AI
289\n"
290
6b61353c 291#define USAGE3 "\
5b2ca26b 292Display options:\n\
bd4590ba 293\n\
6b61353c 294--background-color, -bg COLOR window background color\n\
2ff86b4e
NR
295--basic-display, -D disable many display features;\n\
296 used for debugging Emacs\n\
6b61353c
KH
297--border-color, -bd COLOR main border color\n\
298--border-width, -bw WIDTH width of main border\n\
ced74849 299--color, --color=MODE override color mode for character terminals;\n\
6b61353c
KH
300 MODE defaults to `auto', and can also\n\
301 be `never', `auto', `always',\n\
302 or a mode name like `ansi8'\n\
303--cursor-color, -cr COLOR color of the Emacs cursor indicating point\n\
304--font, -fn FONT default font; must be fixed-width\n\
305--foreground-color, -fg COLOR window foreground color\n\
306--fullheight, -fh make the first frame high as the screen\n\
307--fullscreen, -fs make first frame fullscreen\n\
308--fullwidth, -fw make the first frame wide as the screen\n\
309--geometry, -g GEOMETRY window geometry\n\
f9e36a6d 310--no-bitmap-icon, -nbi do not use picture of gnu for Emacs icon\n\
6b61353c
KH
311--iconic start Emacs in iconified state\n\
312--internal-border, -ib WIDTH width between text and main border\n\
313--line-spacing, -lsp PIXELS additional space to put between lines\n\
314--mouse-color, -ms COLOR mouse cursor color in Emacs window\n\
315--name NAME title for initial Emacs frame\n\
49ca717b 316--no-blinking-cursor, -nbc disable blinking cursor\n\
6b61353c
KH
317--reverse-video, -r, -rv switch foreground and background\n\
318--title, -T TITLE title for initial Emacs frame\n\
319--vertical-scroll-bars, -vb enable vertical scroll bars\n\
320--xrm XRESOURCES set additional X resources\n\
1540a61a 321--parent-id XID set parent window\n\
6b61353c
KH
322--help display this help and exit\n\
323--version output version information and exit\n\
07beadff
JR
324\n"
325
326#define USAGE4 "\
bd4590ba
GM
327You can generally also specify long option names with a single -; for\n\
328example, -batch as well as --batch. You can use any unambiguous\n\
329abbreviation for a --option.\n\
330\n\
331Various environment variables and window system resources also affect\n\
332Emacs' operation. See the main documentation.\n\
07beadff 333\n\
d883731c 334Report bugs to %s. First, please see the Bugs\n\
bd4590ba
GM
335section of the Emacs manual or the file BUGS.\n"
336
f927c5ae 337\f
7db35a48 338/* Signal code for the fatal signal that was received. */
f927c5ae
JB
339int fatal_error_code;
340
7db35a48 341/* Nonzero if handling a fatal error already. */
f927c5ae
JB
342int fatal_error_in_progress;
343
7db35a48 344/* If non-null, call this function from fatal_error_signal before
4fab758d
GM
345 committing suicide. */
346
347void (*fatal_error_signal_hook) P_ ((void));
348
3e9de9f6 349#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
9e2a2647
DN
350/* When compiled with GTK and running under Gnome,
351 multiple threads may be created. Keep track of our main
3e9de9f6 352 thread to make sure signals are delivered to it (see syssignal.h). */
333f1b6f
JD
353
354pthread_t main_thread;
355#endif
356
4fab758d 357
7db35a48 358/* Handle bus errors, invalid instruction, etc. */
2447c626 359SIGTYPE
f927c5ae
JB
360fatal_error_signal (sig)
361 int sig;
362{
333f1b6f 363 SIGNAL_THREAD_CHECK (sig);
f927c5ae
JB
364 fatal_error_code = sig;
365 signal (sig, SIG_DFL);
366
061b7f94
RS
367 TOTALLY_UNBLOCK_INPUT;
368
f927c5ae 369 /* If fatal error occurs in code below, avoid infinite recursion. */
8090eb09
JB
370 if (! fatal_error_in_progress)
371 {
372 fatal_error_in_progress = 1;
f927c5ae 373
f7ab4e3d 374 shut_down_emacs (sig, 0, Qnil);
8090eb09 375 }
f927c5ae 376
8090eb09
JB
377 /* Signal the same code; this time it will really be fatal.
378 Remember that since we're in a signal handler, the signal we're
379 going to send is probably blocked, so we have to unblock it if we
380 want to really receive it. */
29b89fe0 381#ifndef MSDOS
a90538cb 382 sigunblock (sigmask (fatal_error_code));
29b89fe0 383#endif
4fab758d
GM
384
385 if (fatal_error_signal_hook)
386 fatal_error_signal_hook ();
7db35a48 387
f927c5ae 388 kill (getpid (), fatal_error_code);
f927c5ae 389}
271c7b7c
RS
390
391#ifdef SIGDANGER
392
16c323ee 393/* Handler for SIGDANGER. */
271c7b7c
RS
394SIGTYPE
395memory_warning_signal (sig)
396 int sig;
397{
398 signal (sig, memory_warning_signal);
333f1b6f 399 SIGNAL_THREAD_CHECK (sig);
271c7b7c
RS
400
401 malloc_warning ("Operating system warns that virtual memory is running low.\n");
55796183
RS
402
403 /* It might be unsafe to call do_auto_save now. */
404 force_auto_save_soon ();
271c7b7c
RS
405}
406#endif
fcf01ad3
RS
407
408/* We define abort, rather than using it from the library,
c9fe9cce 409 so that GDB can return from a breakpoint here.
7db35a48 410 MSDOS has its own definition in msdos.c. */
fcf01ad3 411
37e2fdd2 412#if ! defined (DOS_NT) && ! defined (NO_ABORT)
ca9c0567 413
4624371d 414void
fcf01ad3
RS
415abort ()
416{
417 kill (getpid (), SIGABRT);
37e2fdd2
RS
418 /* This shouldn't be executed, but it prevents a warning. */
419 exit (1);
fcf01ad3 420}
c9fe9cce 421#endif
fcf01ad3 422
f927c5ae 423\f
7db35a48 424/* Code for dealing with Lisp access to the Unix command line. */
f927c5ae 425
dfcf069d 426static void
f927c5ae
JB
427init_cmdargs (argc, argv, skip_args)
428 int argc;
429 char **argv;
430 int skip_args;
431{
432 register int i;
213d0b1f 433 Lisp_Object name, dir, tem;
aed13378 434 int count = SPECPDL_INDEX ();
213d0b1f 435 Lisp_Object raw_name;
f927c5ae 436
e29f86e4
RS
437 initial_argv = argv;
438 initial_argc = argc;
439
213d0b1f
RS
440 raw_name = build_string (argv[0]);
441
442 /* Add /: to the front of the name
443 if it would otherwise be treated as magic. */
444 tem = Ffind_file_name_handler (raw_name, Qt);
445 if (! NILP (tem))
446 raw_name = concat2 (build_string ("/:"), raw_name);
447
448 Vinvocation_name = Ffile_name_nondirectory (raw_name);
449 Vinvocation_directory = Ffile_name_directory (raw_name);
450
ace40a69
RS
451 /* If we got no directory in argv[0], search PATH to find where
452 Emacs actually came from. */
453 if (NILP (Vinvocation_directory))
454 {
455 Lisp_Object found;
456 int yes = openp (Vexec_path, Vinvocation_name,
10c0915e 457 Vexec_suffixes, &found, make_number (X_OK));
e443f843 458 if (yes == 1)
213d0b1f
RS
459 {
460 /* Add /: to the front of the name
461 if it would otherwise be treated as magic. */
462 tem = Ffind_file_name_handler (found, Qt);
463 if (! NILP (tem))
464 found = concat2 (build_string ("/:"), found);
465 Vinvocation_directory = Ffile_name_directory (found);
466 }
ace40a69 467 }
59653951 468
4133b300
RS
469 if (!NILP (Vinvocation_directory)
470 && NILP (Ffile_name_absolute_p (Vinvocation_directory)))
213d0b1f
RS
471 /* Emacs was started with relative path, like ./emacs.
472 Make it absolute. */
4133b300
RS
473 Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, Qnil);
474
07f4d123
RS
475 Vinstallation_directory = Qnil;
476
477 if (!NILP (Vinvocation_directory))
478 {
479 dir = Vinvocation_directory;
480 name = Fexpand_file_name (Vinvocation_name, dir);
481 while (1)
482 {
f5ab9736 483 Lisp_Object tem, lib_src_exists;
07f4d123
RS
484 Lisp_Object etc_exists, info_exists;
485
f5ab9736
RS
486 /* See if dir contains subdirs for use by Emacs.
487 Check for the ones that would exist in a build directory,
488 not including lisp and info. */
489 tem = Fexpand_file_name (build_string ("lib-src"), dir);
490 lib_src_exists = Ffile_exists_p (tem);
de004cc6 491
70344b34 492#ifdef MSDOS
de004cc6
RS
493 /* MSDOS installations frequently remove lib-src, but we still
494 must set installation-directory, or else info won't find
495 its files (it uses the value of installation-directory). */
496 tem = Fexpand_file_name (build_string ("info"), dir);
497 info_exists = Ffile_exists_p (tem);
70344b34
EZ
498#else
499 info_exists = Qnil;
500#endif
de004cc6
RS
501
502 if (!NILP (lib_src_exists) || !NILP (info_exists))
07f4d123 503 {
f5ab9736
RS
504 tem = Fexpand_file_name (build_string ("etc"), dir);
505 etc_exists = Ffile_exists_p (tem);
506 if (!NILP (etc_exists))
07f4d123 507 {
f5ab9736
RS
508 Vinstallation_directory
509 = Ffile_name_as_directory (dir);
510 break;
07f4d123
RS
511 }
512 }
513
514 /* See if dir's parent contains those subdirs. */
f5ab9736
RS
515 tem = Fexpand_file_name (build_string ("../lib-src"), dir);
516 lib_src_exists = Ffile_exists_p (tem);
de004cc6 517
70344b34
EZ
518
519#ifdef MSDOS
520 /* See the MSDOS commentary above. */
de004cc6
RS
521 tem = Fexpand_file_name (build_string ("../info"), dir);
522 info_exists = Ffile_exists_p (tem);
70344b34
EZ
523#else
524 info_exists = Qnil;
525#endif
de004cc6
RS
526
527 if (!NILP (lib_src_exists) || !NILP (info_exists))
07f4d123 528 {
f5ab9736
RS
529 tem = Fexpand_file_name (build_string ("../etc"), dir);
530 etc_exists = Ffile_exists_p (tem);
531 if (!NILP (etc_exists))
07f4d123 532 {
f5ab9736
RS
533 tem = Fexpand_file_name (build_string (".."), dir);
534 Vinstallation_directory
535 = Ffile_name_as_directory (tem);
536 break;
07f4d123
RS
537 }
538 }
539
540 /* If the Emacs executable is actually a link,
541 next try the dir that the link points into. */
542 tem = Ffile_symlink_p (name);
543 if (!NILP (tem))
544 {
260ec24d 545 name = Fexpand_file_name (tem, dir);
07f4d123
RS
546 dir = Ffile_name_directory (name);
547 }
548 else
549 break;
550 }
551 }
552
f927c5ae
JB
553 Vcommand_line_args = Qnil;
554
555 for (i = argc - 1; i >= 0; i--)
556 {
557 if (i == 0 || i > skip_args)
a520393d
KH
558 /* For the moment, we keep arguments as is in unibyte strings.
559 They are decoded in the function command-line after we know
560 locale-coding-system. */
f927c5ae 561 Vcommand_line_args
68db37aa 562 = Fcons (make_unibyte_string (argv[i], strlen (argv[i])),
a520393d 563 Vcommand_line_args);
f927c5ae 564 }
213d0b1f
RS
565
566 unbind_to (count, Qnil);
f927c5ae 567}
59653951
JB
568
569DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
7db35a48
PJ
570 doc: /* Return the program name that was used to run Emacs.
571Any directory names are omitted. */)
572 ()
59653951
JB
573{
574 return Fcopy_sequence (Vinvocation_name);
575}
576
ace40a69 577DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
7db35a48
PJ
578 0, 0, 0,
579 doc: /* Return the directory name in which the Emacs executable was located. */)
580 ()
ace40a69
RS
581{
582 return Fcopy_sequence (Vinvocation_directory);
583}
584
f927c5ae 585\f
0269dedb
RS
586#ifdef HAVE_TZSET
587/* A valid but unlikely value for the TZ environment value.
588 It is OK (though a bit slower) if the user actually chooses this value. */
589static char dump_tz[] = "UtC0";
590#endif
591
a90538cb 592#ifndef ORDINARY_LINK
efd241cc
RS
593/* We don't include crtbegin.o and crtend.o in the link,
594 so these functions and variables might be missed.
595 Provide dummy definitions to avoid error.
596 (We don't have any real constructors or destructors.) */
597#ifdef __GNUC__
46e65b73 598#ifndef GCC_CTORS_IN_LIBC
dfcf069d 599void __do_global_ctors ()
efd241cc 600{}
dfcf069d 601void __do_global_ctors_aux ()
c83a7064 602{}
dfcf069d 603void __do_global_dtors ()
33143604 604{}
554061d8 605/* GNU/Linux has a bug in its library; avoid an error. */
8a2a6032 606#ifndef GNU_LINUX
c83a7064 607char * __CTOR_LIST__[2] = { (char *) (-1), 0 };
64c1864a 608#endif
c83a7064 609char * __DTOR_LIST__[2] = { (char *) (-1), 0 };
46e65b73 610#endif /* GCC_CTORS_IN_LIBC */
dfcf069d 611void __main ()
efd241cc 612{}
efd241cc 613#endif /* __GNUC__ */
a90538cb 614#endif /* ORDINARY_LINK */
efd241cc 615
e2925360
KH
616/* Test whether the next argument in ARGV matches SSTR or a prefix of
617 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
618 (the argument is supposed to have a value) store in *VALPTR either
619 the next argument or the portion of this one after the equal sign.
620 ARGV is read starting at position *SKIPPTR; this index is advanced
621 by the number of arguments used.
622
623 Too bad we can't just use getopt for all of this, but we don't have
624 enough information to do it right. */
081bef73 625
e2925360 626static int
df6530f8 627argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr)
e2925360 628 char **argv;
df6530f8 629 int argc;
e2925360
KH
630 char *sstr;
631 char *lstr;
632 int minlen;
633 char **valptr;
634 int *skipptr;
635{
6bbd7a29 636 char *p = NULL;
e2925360 637 int arglen;
df6530f8
RS
638 char *arg;
639
640 /* Don't access argv[argc]; give up in advance. */
641 if (argc <= *skipptr + 1)
642 return 0;
643
644 arg = argv[*skipptr+1];
e2925360
KH
645 if (arg == NULL)
646 return 0;
647 if (strcmp (arg, sstr) == 0)
648 {
649 if (valptr != NULL)
650 {
651 *valptr = argv[*skipptr+2];
652 *skipptr += 2;
653 }
654 else
655 *skipptr += 1;
656 return 1;
657 }
658 arglen = (valptr != NULL && (p = index (arg, '=')) != NULL
659 ? p - arg : strlen (arg));
c03e1113 660 if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
e2925360
KH
661 return 0;
662 else if (valptr == NULL)
663 {
664 *skipptr += 1;
665 return 1;
666 }
667 else if (p != NULL)
668 {
669 *valptr = p+1;
670 *skipptr += 1;
671 return 1;
672 }
673 else if (argv[*skipptr+2] != NULL)
674 {
675 *valptr = argv[*skipptr+2];
676 *skipptr += 2;
677 return 1;
678 }
679 else
680 {
681 return 0;
682 }
683}
684
b6779252 685#ifdef DOUG_LEA_MALLOC
f927c5ae 686
b6779252
KH
687/* malloc can be invoked even before main (e.g. by the dynamic
688 linker), so the dumped malloc state must be restored as early as
689 possible using this special hook. */
690
691static void
692malloc_initialize_hook ()
693{
1f9c3929 694#ifndef USE_CRT_DLL
b6779252 695 extern char **environ;
1f9c3929 696#endif
6000fe37 697
15aaf1b5
RS
698 if (initialized)
699 {
7c9cd446
AS
700 if (!malloc_using_checking)
701 /* Work around a bug in glibc's malloc. MALLOC_CHECK_ must be
702 ignored if the heap to be restored was constructed without
d942e12a
AS
703 malloc checking. Can't use unsetenv, since that calls malloc. */
704 {
705 char **p;
706
a57c4026 707 for (p = environ; p && *p; p++)
d942e12a
AS
708 if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0)
709 {
710 do
711 *p = p[1];
712 while (*++p);
713 break;
714 }
715 }
b6779252 716
15aaf1b5 717 malloc_set_state (malloc_state_ptr);
68db37aa 718#ifndef XMALLOC_OVERRUN_CHECK
15aaf1b5 719 free (malloc_state_ptr);
68db37aa 720#endif
15aaf1b5 721 }
7c9cd446 722 else
dede2792
JD
723 {
724 if (my_heap_start == 0)
725 my_heap_start = sbrk (0);
726 malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL;
727 }
b6779252
KH
728}
729
730void (*__malloc_initialize_hook) () = malloc_initialize_hook;
731
732#endif /* DOUG_LEA_MALLOC */
733
d883731c
PJ
734
735#define REPORT_EMACS_BUG_ADDRESS "bug-gnu-emacs@gnu.org"
736#define REPORT_EMACS_BUG_PRETEST_ADDRESS "emacs-pretest-bug@gnu.org"
737
738/* This function is used to determine an address to which bug report should
739 be sent. */
740
400d6fa9
PJ
741char *
742bug_reporting_address ()
d883731c 743{
400d6fa9 744 int count = 0;
d883731c
PJ
745 Lisp_Object temp;
746 char *string;
747
748 temp = Fsymbol_value (intern ("emacs-version"));
749
750 /* When `emacs-version' is invalid, use normal address. */
751 if (!STRINGP(temp))
752 return REPORT_EMACS_BUG_ADDRESS;
753
d5db4077 754 string = SDATA (temp);
d883731c 755
400d6fa9
PJ
756 /* Count dots in `emacs-version'. */
757 while (*string)
758 {
759 if (*string == '.')
760 count++;
761 string++;
762 }
d883731c
PJ
763
764 /* When `emacs-version' has at least three dots, it is development or
765 pretest version of Emacs. */
400d6fa9 766 return count >= 3 ? REPORT_EMACS_BUG_PRETEST_ADDRESS : REPORT_EMACS_BUG_ADDRESS;
d883731c
PJ
767}
768
769
b6779252
KH
770/* ARGSUSED */
771int
7c2fb837 772main (int argc, char **argv)
b6779252 773{
2313132f 774#if GC_MARK_STACK
39ec21ea
GM
775 Lisp_Object dummy;
776#endif
b6779252 777 char stack_bottom_variable;
68c45bf0 778 int do_initial_setlocale;
b6779252 779 int skip_args = 0;
1f9c3929 780#ifndef USE_CRT_DLL
b6779252 781 extern int errno;
1f9c3929 782#endif
b6779252
KH
783#ifdef HAVE_SETRLIMIT
784 struct rlimit rlim;
785#endif
786 int no_loadup = 0;
6e910e07 787 char *junk = 0;
b6779252 788
2313132f 789#if GC_MARK_STACK
39ec21ea
GM
790 extern Lisp_Object *stack_base;
791 stack_base = &dummy;
792#endif
793
dede2792
JD
794 if (!initialized)
795 {
796 extern char my_endbss[];
797 extern char *my_endbss_static;
798
799 if (my_heap_start == 0)
800 my_heap_start = sbrk (0);
801
802 heap_bss_diff = (char *)my_heap_start - max (my_endbss, my_endbss_static);
803 }
804
cc61af67
DN
805#ifdef LINUX_SBRK_BUG
806 /* This is only used GNU/LINUX running on alpha when using libc5 */
b6779252 807 __sbrk (1);
15aaf1b5
RS
808#endif
809
d785cf9e
RS
810#ifdef RUN_TIME_REMAP
811 if (initialized)
812 run_time_remap (argv[0]);
813#endif
814
14145fa3
AR
815/* If using unexmacosx.c (set by s/darwin.h), we must do this. */
816#ifdef DARWIN_OS
e0f712ba
AC
817 if (!initialized)
818 unexec_init_emacs_zone ();
819#endif
820
081bef73 821 sort_args (argc, argv);
956e3c7e
RS
822 argc = 0;
823 while (argv[argc]) argc++;
081bef73 824
3270ae6e
KH
825 if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args)
826 /* We don't know the version number unless this is a dumped Emacs.
827 So ignore --version otherwise. */
828 && initialized)
1702afef 829 {
5cf9ca93 830 Lisp_Object tem, tem2;
1702afef 831 tem = Fsymbol_value (intern ("emacs-version"));
5cf9ca93 832 tem2 = Fsymbol_value (intern ("emacs-copyright"));
1702afef
RS
833 if (!STRINGP (tem))
834 {
835 fprintf (stderr, "Invalid value of `emacs-version'\n");
836 exit (1);
837 }
5cf9ca93
GM
838 if (!STRINGP (tem2))
839 {
840 fprintf (stderr, "Invalid value of `emacs-copyright'\n");
841 exit (1);
842 }
1702afef
RS
843 else
844 {
d5db4077 845 printf ("GNU Emacs %s\n", SDATA (tem));
5cf9ca93 846 printf ("%s\n", SDATA(tem2));
b455c665
RS
847 printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
848 printf ("You may redistribute copies of Emacs\n");
849 printf ("under the terms of the GNU General Public License.\n");
850 printf ("For more information about these matters, ");
94487c4e 851 printf ("see the file named COPYING.\n");
1702afef
RS
852 exit (0);
853 }
854 }
855
dede2792
JD
856#ifdef HAVE_PERSONALITY_LINUX32
857 /* See if there is a gap between the end of BSS and the heap.
858 In that case, set personality and exec ourself again. */
859 if (!initialized
860 && (strcmp (argv[argc-1], "dump") == 0
861 || strcmp (argv[argc-1], "bootstrap") == 0)
862 && heap_bss_diff > MAX_HEAP_BSS_DIFF)
863 {
864 if (! getenv ("EMACS_HEAP_EXEC"))
865 {
866 /* Set this so we only do this once. */
867 putenv("EMACS_HEAP_EXEC=true");
711877f3
MY
868
869 /* A flag to turn off address randomization which is introduced
870 in linux kernel shipped with fedora core 4 */
871#define ADD_NO_RANDOMIZE 0x0040000
872 personality (PER_LINUX32 | ADD_NO_RANDOMIZE);
873#undef ADD_NO_RANDOMIZE
874
dede2792
JD
875 execvp (argv[0], argv);
876
877 /* If the exec fails, try to dump anyway. */
878 perror ("execvp");
879 }
880 }
881#endif /* HAVE_PERSONALITY_LINUX32 */
882
883
f927c5ae
JB
884/* Map in shared memory, if we are using that. */
885#ifdef HAVE_SHM
df6530f8 886 if (argmatch (argv, argc, "-nl", "--no-shared-memory", 6, NULL, &skip_args))
f927c5ae
JB
887 {
888 map_in_data (0);
889 /* The shared memory was just restored, which clobbered this. */
890 skip_args = 1;
891 }
892 else
893 {
894 map_in_data (1);
895 /* The shared memory was just restored, which clobbered this. */
896 skip_args = 0;
897 }
898#endif
899
ea2acec5 900#if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
6c2935e9
RS
901 /* Extend the stack space available.
902 Don't do that if dumping, since some systems (e.g. DJGPP)
903 might define a smaller stack limit at that time. */
904 if (1
905#ifndef CANNOT_DUMP
906 && (!noninteractive || initialized)
907#endif
908 && !getrlimit (RLIMIT_STACK, &rlim))
53c58b5d 909 {
509a8fcd 910 long newlim;
fa8459a3 911 extern size_t re_max_failures;
03effc23
KH
912 /* Approximate the amount regex.c needs per unit of re_max_failures. */
913 int ratio = 20 * sizeof (char *);
914 /* Then add 33% to cover the size of the smaller stacks that regex.c
915 successively allocates and discards, on its way to the maximum. */
916 ratio += ratio / 3;
917 /* Add in some extra to cover
918 what we're likely to use for other reasons. */
919 newlim = re_max_failures * ratio + 200000;
d0381a7f
RS
920#ifdef __NetBSD__
921 /* NetBSD (at least NetBSD 1.2G and former) has a bug in its
922 stack allocation routine for new process that the allocation
923 fails if stack limit is not on page boundary. So, round up the
924 new limit to page boundary. */
925 newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize();
926#endif
509a8fcd 927 if (newlim > rlim.rlim_max)
6c2935e9
RS
928 {
929 newlim = rlim.rlim_max;
03effc23
KH
930 /* Don't let regex.c overflow the stack we have. */
931 re_max_failures = (newlim - 200000) / ratio;
6c2935e9 932 }
509a8fcd
RS
933 if (rlim.rlim_cur < newlim)
934 rlim.rlim_cur = newlim;
935
53c58b5d
RS
936 setrlimit (RLIMIT_STACK, &rlim);
937 }
ea2acec5 938#endif /* HAVE_SETRLIMIT and RLIMIT_STACK */
53c58b5d 939
f927c5ae
JB
940 /* Record (approximately) where the stack begins. */
941 stack_bottom = &stack_bottom_variable;
942
f927c5ae 943 clearerr (stdin);
9ae8f997 944
f927c5ae 945#ifndef SYSTEM_MALLOC
bf7f4e90
RS
946 /* Arrange to get warning messages as memory fills up. */
947 memory_warnings (0, malloc_warning);
9ac0d9e0 948
f5a3c8c4
AI
949 /* Call malloc at least once, to run the initial __malloc_hook.
950 Also call realloc and free for consistency. */
951 free (realloc (malloc (4), 4));
bf7f4e90 952
06ca62eb 953# ifndef SYNC_INPUT
bf7f4e90
RS
954 /* Arrange to disable interrupt input inside malloc etc. */
955 uninterrupt_malloc ();
06ca62eb 956# endif /* not SYNC_INPUT */
f927c5ae
JB
957#endif /* not SYSTEM_MALLOC */
958
3e9de9f6 959#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
333f1b6f 960 main_thread = pthread_self ();
3e9de9f6 961#endif /* FORWARD_SIGNAL_TO_MAIN_THREAD */
333f1b6f 962
edd3ff1d 963#if defined (MSDOS) || defined (WINDOWSNT)
29b89fe0
RS
964 /* We do all file input/output as binary files. When we need to translate
965 newlines, we do that manually. */
966 _fmode = O_BINARY;
edd3ff1d 967#endif /* MSDOS || WINDOWSNT */
18198bb2 968
edd3ff1d 969#ifdef MSDOS
18198bb2
RS
970#if __DJGPP__ >= 2
971 if (!isatty (fileno (stdin)))
972 setmode (fileno (stdin), O_BINARY);
973 if (!isatty (fileno (stdout)))
974 {
975 fflush (stdout);
976 setmode (fileno (stdout), O_BINARY);
977 }
978#else /* not __DJGPP__ >= 2 */
29b89fe0
RS
979 (stdin)->_flag &= ~_IOTEXT;
980 (stdout)->_flag &= ~_IOTEXT;
981 (stderr)->_flag &= ~_IOTEXT;
18198bb2 982#endif /* not __DJGPP__ >= 2 */
29b89fe0
RS
983#endif /* MSDOS */
984
a422068f 985#ifdef SET_EMACS_PRIORITY
3005da00 986 if (emacs_priority)
5aa7f46a 987 nice (emacs_priority);
f927c5ae 988 setuid (getuid ());
a422068f 989#endif /* SET_EMACS_PRIORITY */
f927c5ae 990
68c45bf0
PE
991 /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
992 The build procedure uses this while dumping, to ensure that the
993 dumped Emacs does not have its system locale tables initialized,
994 as that might cause screwups when the dumped Emacs starts up. */
995 {
996 char *lc_all = getenv ("LC_ALL");
997 do_initial_setlocale = ! lc_all || strcmp (lc_all, "C");
998 }
999
1000 /* Set locale now, so that initial error messages are localized properly.
1001 fixup_locale must wait until later, since it builds strings. */
1002 if (do_initial_setlocale)
1003 setlocale (LC_ALL, "");
1004
f927c5ae
JB
1005 inhibit_window_system = 0;
1006
7db35a48 1007 /* Handle the -t switch, which specifies filename to use as terminal. */
956e3c7e
RS
1008 while (1)
1009 {
1010 char *term;
1011 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
1012 {
1013 int result;
68c45bf0
PE
1014 emacs_close (0);
1015 emacs_close (1);
1016 result = emacs_open (term, O_RDWR, 0);
956e3c7e
RS
1017 if (result < 0)
1018 {
1019 char *errstring = strerror (errno);
186486eb 1020 fprintf (stderr, "%s: %s: %s\n", argv[0], term, errstring);
956e3c7e
RS
1021 exit (1);
1022 }
1023 dup (0);
1024 if (! isatty (0))
1025 {
186486eb 1026 fprintf (stderr, "%s: %s: not a tty\n", argv[0], term);
956e3c7e
RS
1027 exit (1);
1028 }
1029 fprintf (stderr, "Using %s\n", term);
8ba50e1a 1030#ifdef HAVE_WINDOW_SYSTEM
956e3c7e 1031 inhibit_window_system = 1; /* -t => -nw */
f927c5ae 1032#endif
956e3c7e
RS
1033 }
1034 else
1035 break;
1036 }
1037
400d6fa9
PJ
1038 /* Command line option --no-windows is deprecated and thus not mentioned
1039 in the manual and usage informations. */
1040 if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args)
1041 || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
e2925360 1042 inhibit_window_system = 1;
f927c5ae 1043
e2925360 1044 /* Handle the -batch switch, which means don't do interactive display. */
f927c5ae 1045 noninteractive = 0;
df6530f8 1046 if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
55f4edbc
RS
1047 {
1048 noninteractive = 1;
1049 Vundo_outer_limit = Qnil;
1050 }
6e910e07
RS
1051 if (argmatch (argv, argc, "-script", "--script", 3, &junk, &skip_args))
1052 {
1053 noninteractive = 1; /* Set batch mode. */
21a4ff8e 1054 /* Convert --script to -scriptload, un-skip it, and sort again
e09b9180 1055 so that it will be handled in proper sequence. */
a09a5b5b 1056 /* FIXME broken for --script=FILE - is that supposed to work? */
21a4ff8e 1057 argv[skip_args - 1] = "-scriptload";
6e910e07
RS
1058 skip_args -= 2;
1059 sort_args (argc, argv);
1060 }
e2925360 1061
7db35a48 1062 /* Handle the --help option, which gives a usage message. */
df6530f8 1063 if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
f927c5ae 1064 {
6b61353c
KH
1065 printf (USAGE1, argv[0], USAGE2);
1066 printf (USAGE3);
1067 printf (USAGE4, bug_reporting_address ());
e2925360 1068 exit (0);
f927c5ae
JB
1069 }
1070
edb85f59
RS
1071 if (! noninteractive)
1072 {
1073#ifdef BSD_PGRPS
1074 if (initialized)
1075 {
1076 inherited_pgroup = EMACS_GETPGRP (0);
1077 setpgrp (0, getpid ());
1078 }
1079#else
1080#if defined (USG5) && defined (INTERRUPT_INPUT)
1081 setpgrp ();
1082#endif
5467331d
YM
1083#endif
1084#if defined (HAVE_GTK_AND_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC)
1085 {
1086 extern void malloc_enable_thread P_ ((void));
1087
1088 malloc_enable_thread ();
1089 }
edb85f59
RS
1090#endif
1091 }
1092
fb8e9847 1093 init_signals ();
fb8e9847 1094
1efa2983
KH
1095 /* Don't catch SIGHUP if dumping. */
1096 if (1
1097#ifndef CANNOT_DUMP
1098 && initialized
1099#endif
1100 )
1101 {
57e3d22a 1102 sigblock (sigmask (SIGHUP));
1efa2983
KH
1103 /* In --batch mode, don't catch SIGHUP if already ignored.
1104 That makes nohup work. */
1105 if (! noninteractive
1106 || signal (SIGHUP, SIG_IGN) != SIG_IGN)
1107 signal (SIGHUP, fatal_error_signal);
57e3d22a 1108 sigunblock (sigmask (SIGHUP));
1efa2983
KH
1109 }
1110
f927c5ae
JB
1111 if (
1112#ifndef CANNOT_DUMP
1113 ! noninteractive || initialized
1114#else
1115 1
1116#endif
1117 )
1118 {
1efa2983 1119 /* Don't catch these signals in batch mode if dumping.
f927c5ae
JB
1120 On some machines, this sets static data that would make
1121 signal fail to work right when the dumped Emacs is run. */
f927c5ae
JB
1122 signal (SIGQUIT, fatal_error_signal);
1123 signal (SIGILL, fatal_error_signal);
1124 signal (SIGTRAP, fatal_error_signal);
7317d9e8 1125#ifdef SIGUSR1
71b28d05 1126 add_user_signal (SIGUSR1, "sigusr1");
7317d9e8 1127#endif
8247c60d 1128#ifdef SIGUSR2
71b28d05 1129 add_user_signal (SIGUSR2, "sigusr2");
7317d9e8 1130#endif
99e372cd
RS
1131#ifdef SIGABRT
1132 signal (SIGABRT, fatal_error_signal);
1133#endif
1134#ifdef SIGHWE
1135 signal (SIGHWE, fatal_error_signal);
1136#endif
1137#ifdef SIGPRE
1138 signal (SIGPRE, fatal_error_signal);
1139#endif
1140#ifdef SIGORE
1141 signal (SIGORE, fatal_error_signal);
1142#endif
1143#ifdef SIGUME
1144 signal (SIGUME, fatal_error_signal);
1145#endif
1146#ifdef SIGDLK
1147 signal (SIGDLK, fatal_error_signal);
1148#endif
1149#ifdef SIGCPULIM
1150 signal (SIGCPULIM, fatal_error_signal);
1151#endif
a90538cb
JB
1152#ifdef SIGIOT
1153 /* This is missing on some systems - OS/2, for example. */
f927c5ae 1154 signal (SIGIOT, fatal_error_signal);
a90538cb 1155#endif
f927c5ae
JB
1156#ifdef SIGEMT
1157 signal (SIGEMT, fatal_error_signal);
1158#endif
1159 signal (SIGFPE, fatal_error_signal);
00eaaa32 1160#ifdef SIGBUS
f927c5ae 1161 signal (SIGBUS, fatal_error_signal);
00eaaa32 1162#endif
f927c5ae 1163 signal (SIGSEGV, fatal_error_signal);
00eaaa32 1164#ifdef SIGSYS
f927c5ae 1165 signal (SIGSYS, fatal_error_signal);
00eaaa32 1166#endif
f927c5ae
JB
1167 signal (SIGTERM, fatal_error_signal);
1168#ifdef SIGXCPU
1169 signal (SIGXCPU, fatal_error_signal);
1170#endif
1171#ifdef SIGXFSZ
1172 signal (SIGXFSZ, fatal_error_signal);
1173#endif /* SIGXFSZ */
1174
271c7b7c
RS
1175#ifdef SIGDANGER
1176 /* This just means available memory is getting low. */
1177 signal (SIGDANGER, memory_warning_signal);
1178#endif
1179
f927c5ae 1180#ifdef AIX
56e034fa
RS
1181/* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
1182 signal (SIGXCPU, fatal_error_signal);
0aef8561 1183#ifndef _I386
f927c5ae 1184 signal (SIGIOINT, fatal_error_signal);
0aef8561 1185#endif
f927c5ae
JB
1186 signal (SIGGRANT, fatal_error_signal);
1187 signal (SIGRETRACT, fatal_error_signal);
1188 signal (SIGSOUND, fatal_error_signal);
1189 signal (SIGMSG, fatal_error_signal);
1190#endif /* AIX */
1191 }
1192
1193 noninteractive1 = noninteractive;
1194
7db35a48 1195/* Perform basic initializations (not merely interning symbols). */
f927c5ae
JB
1196
1197 if (!initialized)
1198 {
1199 init_alloc_once ();
1200 init_obarray ();
1201 init_eval_once ();
e37d7195 1202 init_character_once ();
270ce821
KH
1203 init_charset_once ();
1204 init_coding_once ();
f927c5ae 1205 init_syntax_once (); /* Create standard syntax table. */
270ce821 1206 init_category_once (); /* Create standard category table. */
7db35a48 1207 /* Must be done before init_buffer. */
f927c5ae 1208 init_casetab_once ();
7db35a48
PJ
1209 init_buffer_once (); /* Create buffer table and some buffers. */
1210 init_minibuf_once (); /* Create list of minibuffers. */
1211 /* Must precede init_window_once. */
1212
90d920b6
GM
1213 /* Call syms_of_xfaces before init_window_once because that
1214 function creates Vterminal_frame. Termcap frames now use
1215 faces, and the face implementation uses some symbols as
1216 face names. */
90d920b6 1217 syms_of_xfaces ();
4ea81208
KL
1218 /* XXX syms_of_keyboard uses some symbols in keymap.c. It would
1219 be better to arrange things not to have this dependency. */
1220 syms_of_keymap ();
7a18af49
KR
1221 /* Call syms_of_keyboard before init_window_once because
1222 keyboard sets up symbols that include some face names that
1223 the X support will want to use. This can happen when
1224 CANNOT_DUMP is defined. */
1225 syms_of_keyboard ();
90d920b6 1226
985773c9
MB
1227 /* Called before syms_of_fileio, because it sets up Qerror_condition. */
1228 syms_of_data ();
1229 syms_of_fileio ();
1230 /* Before syms_of_coding to initialize Vgc_cons_threshold. */
1231 syms_of_alloc ();
1232 /* Before syms_of_coding because it initializes Qcharsetp. */
1233 syms_of_charset ();
1234 /* Before init_window_once, because it sets up the
1235 Vcoding_system_hash_table. */
1236 syms_of_coding (); /* This should be after syms_of_fileio. */
1a578e9b 1237
7db35a48 1238 init_window_once (); /* Init the window system. */
680256a8 1239 init_fileio_once (); /* Must precede any path manipulation. */
6b61353c
KH
1240#ifdef HAVE_WINDOW_SYSTEM
1241 init_fringe_once (); /* Swap bitmaps if necessary. */
1242#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae
JB
1243 }
1244
1245 init_alloc ();
68c45bf0
PE
1246
1247 if (do_initial_setlocale)
1248 {
1249 fixup_locale ();
ca9c0567
PE
1250 Vsystem_messages_locale = Vprevious_system_messages_locale;
1251 Vsystem_time_locale = Vprevious_system_time_locale;
68c45bf0
PE
1252 }
1253
f927c5ae
JB
1254 init_eval ();
1255 init_data ();
ad067ea6 1256#ifdef CLASH_DETECTION
01f67d2c 1257 init_filelock ();
ad067ea6 1258#endif
ab5d0358 1259 init_atimer ();
7074fde6 1260 running_asynch_code = 0;
0e956009 1261
a08a816a
RS
1262 /* Handle --unibyte and the EMACS_UNIBYTE envvar,
1263 but not while dumping. */
e721aa94 1264 if (1)
a08a816a
RS
1265 {
1266 int inhibit_unibyte = 0;
1267
1268 /* --multibyte overrides EMACS_UNIBYTE. */
1269 if (argmatch (argv, argc, "-no-unibyte", "--no-unibyte", 4, NULL, &skip_args)
e721aa94
SM
1270 || argmatch (argv, argc, "-multibyte", "--multibyte", 4, NULL, &skip_args)
1271 /* Ignore EMACS_UNIBYTE before dumping. */
1272 || (!initialized && noninteractive))
a08a816a
RS
1273 inhibit_unibyte = 1;
1274
1275 /* --unibyte requests that we set up to do everything with single-byte
1276 buffers and strings. We need to handle this before calling
1277 init_lread, init_editfns and other places that generate Lisp strings
1278 from text in the environment. */
c0218e1b
DL
1279 /* Actually this shouldn't be needed as of 20.4 in a generally
1280 unibyte environment. As handa says, environment values
1281 aren't now decoded; also existing buffers are now made
1282 unibyte during startup if .emacs sets unibyte. Tested with
1283 8-bit data in environment variables and /etc/passwd, setting
7db35a48 1284 unibyte and Latin-1 in .emacs. -- Dave Love */
a08a816a
RS
1285 if (argmatch (argv, argc, "-unibyte", "--unibyte", 4, NULL, &skip_args)
1286 || argmatch (argv, argc, "-no-multibyte", "--no-multibyte", 4, NULL, &skip_args)
1287 || (getenv ("EMACS_UNIBYTE") && !inhibit_unibyte))
1288 {
1289 Lisp_Object old_log_max;
1290 Lisp_Object symbol, tail;
1291
1292 symbol = intern ("default-enable-multibyte-characters");
1293 Fset (symbol, Qnil);
1294
6524291c
KH
1295 if (initialized)
1296 {
1297 /* Erase pre-dump messages in *Messages* now so no abort. */
1298 old_log_max = Vmessage_log_max;
1299 XSETFASTINT (Vmessage_log_max, 0);
1300 message_dolog ("", 0, 1, 0);
1301 Vmessage_log_max = old_log_max;
1302 }
a08a816a 1303
3e75bb9e 1304 for (tail = Vbuffer_alist; CONSP (tail);
7539e11f 1305 tail = XCDR (tail))
a08a816a
RS
1306 {
1307 Lisp_Object buffer;
1308
7539e11f 1309 buffer = Fcdr (XCAR (tail));
8f924df7 1310 /* Make a multibyte buffer unibyte. */
f2b89e21
KH
1311 if (BUF_Z_BYTE (XBUFFER (buffer)) > BUF_Z (XBUFFER (buffer)))
1312 {
1313 struct buffer *current = current_buffer;
1314
1315 set_buffer_temp (XBUFFER (buffer));
8f924df7 1316 Fset_buffer_multibyte (Qnil);
f2b89e21
KH
1317 set_buffer_temp (current);
1318 }
a08a816a
RS
1319 }
1320 }
1321 }
1322
956e3c7e 1323 no_loadup
b96f9fb7 1324 = argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
956e3c7e 1325
edfda783
AR
1326#ifdef HAVE_NS
1327 ns_alloc_autorelease_pool();
1328 if (!noninteractive)
1329 {
1330 char *tmp;
1331 display_arg = 4;
1332#ifdef NS_IMPL_COCOA
1333 if (skip_args < argc)
1334 {
1335 if (!strncmp(argv[skip_args], "-psn", 4))
1336 {
1337 skip_args += 1;
1338 }
1339 else
1340 {
1341 if (skip_args+1 < argc && !strncmp(argv[skip_args+1], "-psn", 4))
1342 skip_args += 2;
1343 }
1344 }
1345#endif
1346 /* This used for remote operation.. not fully implemented yet. */
1347 if (argmatch (argv, argc, "-_NSMachLaunch", 0, 3, &tmp, &skip_args))
1348 display_arg = 4;
1349 else if (argmatch (argv, argc, "-MachLaunch", 0, 3, &tmp, &skip_args))
1350 display_arg = 4;
1351 else if (argmatch (argv, argc, "-macosx", 0, 2, NULL, &skip_args))
1352 display_arg = 4;
1353 else if (argmatch (argv, argc, "-NSHost", 0, 3, &tmp, &skip_args))
1354 display_arg = 4;
1355 }
1356#endif /* HAVE_NS */
1357
956e3c7e
RS
1358#ifdef HAVE_X_WINDOWS
1359 /* Stupid kludge to catch command-line display spec. We can't
1360 handle this argument entirely in window system dependent code
1361 because we don't even know which window system dependent code
1362 to run until we've recognized this argument. */
1363 {
1364 char *displayname = 0;
956e3c7e
RS
1365 int count_before = skip_args;
1366
1367 /* Skip any number of -d options, but only use the last one. */
1368 while (1)
1369 {
1370 int count_before_this = skip_args;
1371
1372 if (argmatch (argv, argc, "-d", "--display", 3, &displayname, &skip_args))
1373 display_arg = 1;
1374 else if (argmatch (argv, argc, "-display", 0, 3, &displayname, &skip_args))
1375 display_arg = 1;
1376 else
1377 break;
1378
1379 count_before = count_before_this;
1380 }
1381
1382 /* If we have the form --display=NAME,
1383 convert it into -d name.
1384 This requires inserting a new element into argv. */
1385 if (displayname != 0 && skip_args - count_before == 1)
1386 {
1387 char **new = (char **) xmalloc (sizeof (char *) * (argc + 2));
1388 int j;
1389
1390 for (j = 0; j < count_before + 1; j++)
1391 new[j] = argv[j];
1392 new[count_before + 1] = "-d";
1393 new[count_before + 2] = displayname;
1394 for (j = count_before + 2; j <argc; j++)
1395 new[j + 1] = argv[j];
1396 argv = new;
1397 argc++;
1398 }
1399 /* Change --display to -d, when its arg is separate. */
1400 else if (displayname != 0 && skip_args > count_before
1401 && argv[count_before + 1][1] == '-')
1402 argv[count_before + 1] = "-d";
1403
1404 /* Don't actually discard this arg. */
1405 skip_args = count_before;
1406 }
1407#endif
1408
1409 /* argmatch must not be used after here,
1410 except when bulding temacs
1411 because the -d argument has not been skipped in skip_args. */
1412
29b89fe0
RS
1413#ifdef MSDOS
1414 /* Call early 'cause init_environment needs it. */
1415 init_dosfns ();
1416 /* Set defaults for several environment variables. */
18198bb2
RS
1417 if (initialized)
1418 init_environment (argc, argv, skip_args);
1419 else
d1fc6752 1420 tzset ();
18198bb2 1421#endif /* MSDOS */
29b89fe0 1422
8ba50e1a 1423#ifdef WINDOWSNT
9785d95b 1424 globals_of_w32 ();
8ba50e1a 1425 /* Initialize environment from registry settings. */
a3a58294 1426 init_environment (argv);
7db35a48 1427 init_ntproc (); /* must precede init_editfns. */
8ba50e1a
GV
1428#endif
1429
edfda783
AR
1430#ifdef HAVE_NS
1431#ifndef CANNOT_DUMP
1432 if (initialized)
1433#endif
1434 ns_init_paths ();
1435#endif
1436
0e956009
JB
1437 /* egetenv is a pretty low-level facility, which may get called in
1438 many circumstances; it seems flimsy to put off initializing it
1439 until calling init_callproc. */
a13f8f50 1440 set_initial_environment ();
93aed04d 1441 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
5990851d
KL
1442 if this is not done. Do it after set_global_environment so that we
1443 don't pollute Vglobal_environment. */
fa09a82d 1444 /* Setting LANG here will defeat the startup locale processing... */
f2a77c3a 1445#ifdef AIX
93aed04d
RS
1446 putenv ("LANG=C");
1447#endif
0e956009 1448
7db35a48 1449 init_buffer (); /* Init default directory of main buffer. */
ace40a69 1450
7928f0b5 1451 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
ace40a69 1452 init_cmdargs (argc, argv, skip_args); /* Must precede init_lread. */
380e25b8
RS
1453
1454 if (initialized)
1455 {
7db35a48 1456 /* Erase any pre-dump messages in the message log, to avoid confusion. */
380e25b8
RS
1457 Lisp_Object old_log_max;
1458 old_log_max = Vmessage_log_max;
1459 XSETFASTINT (Vmessage_log_max, 0);
f6fe7bb5 1460 message_dolog ("", 0, 1, 0);
380e25b8
RS
1461 Vmessage_log_max = old_log_max;
1462 }
1463
7928f0b5 1464 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
fb8e9847 1465 init_lread ();
f927c5ae 1466
8bb697c0
RS
1467 /* Intern the names of all standard functions and variables;
1468 define standard keys. */
f927c5ae
JB
1469
1470 if (!initialized)
1471 {
7db35a48 1472 /* The basic levels of Lisp must come first. */
f927c5ae 1473 /* And data must come first of all
7db35a48 1474 for the sake of symbols like error-message. */
f927c5ae 1475 syms_of_data ();
e37d7195 1476 syms_of_chartab ();
fb8e9847 1477 syms_of_lread ();
f927c5ae
JB
1478 syms_of_print ();
1479 syms_of_eval ();
1480 syms_of_fns ();
f927c5ae 1481 syms_of_floatfns ();
f927c5ae 1482
f927c5ae
JB
1483 syms_of_buffer ();
1484 syms_of_bytecode ();
1485 syms_of_callint ();
1486 syms_of_casefiddle ();
1487 syms_of_casetab ();
1488 syms_of_callproc ();
270ce821
KH
1489 syms_of_category ();
1490 syms_of_ccl ();
e37d7195 1491 syms_of_character ();
f927c5ae
JB
1492 syms_of_cmds ();
1493#ifndef NO_DIR_LIBRARY
1494 syms_of_dired ();
1495#endif /* not NO_DIR_LIBRARY */
1496 syms_of_display ();
1497 syms_of_doc ();
1498 syms_of_editfns ();
1499 syms_of_emacs ();
f927c5ae
JB
1500#ifdef CLASH_DETECTION
1501 syms_of_filelock ();
1502#endif /* CLASH_DETECTION */
1503 syms_of_indent ();
c2c5ed2c 1504 syms_of_insdel ();
4ea81208 1505 /* syms_of_keymap (); */
f927c5ae
JB
1506 syms_of_macros ();
1507 syms_of_marker ();
1508 syms_of_minibuf ();
f927c5ae 1509 syms_of_process ();
f927c5ae 1510 syms_of_search ();
1cbd5d9d 1511 syms_of_frame ();
f927c5ae 1512 syms_of_syntax ();
ed8dad6b 1513 syms_of_terminal ();
0d934e7b 1514 syms_of_term ();
f927c5ae 1515 syms_of_undo ();
90d920b6
GM
1516#ifdef HAVE_SOUND
1517 syms_of_sound ();
1518#endif
bef79ee4 1519 syms_of_textprop ();
9d100795 1520 syms_of_composite ();
05687c54
RS
1521#ifdef WINDOWSNT
1522 syms_of_ntproc ();
1523#endif /* WINDOWSNT */
f927c5ae
JB
1524 syms_of_window ();
1525 syms_of_xdisp ();
d53f587b 1526 syms_of_font ();
4fa9161d 1527#ifdef HAVE_WINDOW_SYSTEM
6b61353c
KH
1528 syms_of_fringe ();
1529 syms_of_image ();
1530#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae 1531#ifdef HAVE_X_WINDOWS
72412588 1532 syms_of_xterm ();
f927c5ae 1533 syms_of_xfns ();
edfda783 1534 syms_of_xmenu ();
270ce821 1535 syms_of_fontset ();
28b1b672
JD
1536#ifdef HAVE_X_SM
1537 syms_of_xsmfns ();
1538#endif
72412588
JB
1539#ifdef HAVE_X11
1540 syms_of_xselect ();
1541#endif
f927c5ae
JB
1542#endif /* HAVE_X_WINDOWS */
1543
4e77ce60 1544 syms_of_menu ();
4e77ce60 1545
8ba50e1a 1546#ifdef HAVE_NTGUI
fbd6baed
GV
1547 syms_of_w32term ();
1548 syms_of_w32fns ();
fbd6baed
GV
1549 syms_of_w32select ();
1550 syms_of_w32menu ();
02062ac3 1551 syms_of_fontset ();
8ba50e1a
GV
1552#endif /* HAVE_NTGUI */
1553
edfda783
AR
1554#ifdef HAVE_NS
1555 syms_of_nsterm ();
1556 syms_of_nsfns ();
1557 syms_of_nsmenu ();
1558 syms_of_nsselect ();
1559 syms_of_fontset ();
1560#endif /* HAVE_NS */
1561
033b73e2
MA
1562#ifdef HAVE_DBUS
1563 syms_of_dbusbind ();
1564#endif /* HAVE_DBUS */
1565
f927c5ae
JB
1566#ifdef SYMS_SYSTEM
1567 SYMS_SYSTEM;
1568#endif
1569
1570#ifdef SYMS_MACHINE
1571 SYMS_MACHINE;
1572#endif
1573
1574 keys_of_casefiddle ();
1575 keys_of_cmds ();
1576 keys_of_buffer ();
1577 keys_of_keyboard ();
1578 keys_of_keymap ();
f927c5ae 1579 keys_of_window ();
9785d95b 1580 }
3b6536b1 1581 else
9785d95b 1582 {
3b6536b1
AS
1583 /* Initialization that must be done even if the global variable
1584 initialized is non zero. */
9785d95b
BK
1585#ifdef HAVE_NTGUI
1586 globals_of_w32fns ();
1587 globals_of_w32menu ();
52c7f9ee 1588 globals_of_w32select ();
3b6536b1 1589#endif /* HAVE_NTGUI */
f927c5ae
JB
1590 }
1591
cf411e8d
KH
1592 init_charset ();
1593
f7cf8b20 1594 init_editfns (); /* init_process uses Voperating_system_release. */
2491d293 1595 init_process (); /* init_display uses add_keyboard_wait_descriptor. */
7db35a48 1596 init_keyboard (); /* This too must precede init_sys_modes. */
0a125897 1597 if (!noninteractive)
7c2fb837 1598 init_display (); /* Determine terminal type. Calls init_sys_modes. */
90d920b6 1599 init_fns ();
8bb697c0 1600 init_xdisp ();
6b61353c
KH
1601#ifdef HAVE_WINDOW_SYSTEM
1602 init_fringe ();
1603 init_image ();
1604#endif /* HAVE_WINDOW_SYSTEM */
8bb697c0 1605 init_macros ();
8bb697c0 1606 init_floatfns ();
90d920b6
GM
1607#ifdef HAVE_SOUND
1608 init_sound ();
1609#endif
75816372 1610 init_window ();
8bb697c0 1611
f927c5ae
JB
1612 if (!initialized)
1613 {
e2925360 1614 char *file;
7db35a48 1615 /* Handle -l loadup, args passed by Makefile. */
df6530f8 1616 if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
f927c5ae 1617 Vtop_level = Fcons (intern ("load"),
e2925360 1618 Fcons (build_string (file), Qnil));
f927c5ae 1619 /* Unless next switch is -nl, load "loadup.el" first thing. */
956e3c7e 1620 if (! no_loadup)
f927c5ae
JB
1621 Vtop_level = Fcons (intern ("load"),
1622 Fcons (build_string ("loadup.el"), Qnil));
f927c5ae
JB
1623 }
1624
93572b43
KH
1625 if (initialized)
1626 {
0269dedb
RS
1627#ifdef HAVE_TZSET
1628 {
1629 /* If the execution TZ happens to be the same as the dump TZ,
1630 change it to some other value and then change it back,
1631 to force the underlying implementation to reload the TZ info.
1632 This is needed on implementations that load TZ info from files,
1633 since the TZ file contents may differ between dump and execution. */
1634 char *tz = getenv ("TZ");
1635 if (tz && !strcmp (tz, dump_tz))
1636 {
1637 ++*tz;
1638 tzset ();
1639 --*tz;
1640 }
1641 }
1642#endif
93572b43
KH
1643 }
1644
ecf783fa
EZ
1645 /* Set up for profiling. This is known to work on FreeBSD,
1646 GNU/Linux and MinGW. It might work on some other systems too.
1647 Give it a try and tell us if it works on your system. To compile
5a693cc0
EZ
1648 for profiling, add -pg to the switches your platform uses in
1649 CFLAGS and LDFLAGS. For example:
665b5955 1650 `make CFLAGS="-pg -g -O -DPROFILING=1" LDFLAGS="-pg -g"'. */
ecf783fa 1651#if defined (__FreeBSD__) || defined (GNU_LINUX) || defined(__MINGW32__)
e610ea43
RS
1652#ifdef PROFILING
1653 if (initialized)
1654 {
7db35a48 1655 extern void _mcleanup ();
ecf783fa
EZ
1656#ifdef __MINGW32__
1657 extern unsigned char etext asm ("etext");
1658#else
e610ea43 1659 extern char etext;
ecf783fa 1660#endif
90d920b6 1661 extern void safe_bcopy ();
67a5596f
GM
1662 extern void dump_opcode_frequencies ();
1663
e610ea43 1664 atexit (_mcleanup);
90d920b6
GM
1665 /* This uses safe_bcopy because that function comes first in the
1666 Emacs executable. It might be better to use something that
1667 gives the start of the text segment, but start_of_text is not
1668 defined on all systems now. */
1669 monstartup (safe_bcopy, &etext);
e610ea43
RS
1670 }
1671 else
1672 moncontrol (0);
1673#endif
1674#endif
1675
f927c5ae
JB
1676 initialized = 1;
1677
e7536cff
RS
1678#ifdef LOCALTIME_CACHE
1679 /* Some versions of localtime have a bug. They cache the value of the time
279cc2b8
JB
1680 zone rather than looking it up every time. Since localtime() is
1681 called to bolt the undumping time into the undumped emacs, this
afe9fae9 1682 results in localtime ignoring the TZ environment variable.
7db35a48 1683 This flushes the new TZ value into localtime. */
afe9fae9 1684 tzset ();
e7536cff 1685#endif /* defined (LOCALTIME_CACHE) */
279cc2b8 1686
f927c5ae
JB
1687 /* Enter editor command loop. This never returns. */
1688 Frecursive_edit ();
1689 /* NOTREACHED */
6bbd7a29 1690 return 0;
f927c5ae
JB
1691}
1692\f
081bef73
RS
1693/* Sort the args so we can find the most important ones
1694 at the beginning of argv. */
1695
1696/* First, here's a table of all the standard options. */
1697
1698struct standard_args
1699{
1700 char *name;
1701 char *longname;
1702 int priority;
1703 int nargs;
1704};
1705
1706struct standard_args standard_args[] =
1707{
05922407
RS
1708 { "-version", "--version", 150, 0 },
1709#ifdef HAVE_SHM
1710 { "-nl", "--no-shared-memory", 140, 0 },
2725719a 1711#endif
05922407 1712 { "-t", "--terminal", 120, 1 },
400d6fa9 1713 { "-nw", "--no-window-system", 110, 0 },
05922407
RS
1714 { "-nw", "--no-windows", 110, 0 },
1715 { "-batch", "--batch", 100, 0 },
6e910e07 1716 { "-script", "--script", 100, 1 },
05922407 1717 { "-help", "--help", 90, 0 },
956e3c7e
RS
1718 { "-no-unibyte", "--no-unibyte", 83, 0 },
1719 { "-multibyte", "--multibyte", 82, 0 },
1720 { "-unibyte", "--unibyte", 81, 0 },
1721 { "-no-multibyte", "--no-multibyte", 80, 0 },
956e3c7e 1722 { "-nl", "--no-loadup", 70, 0 },
956e3c7e
RS
1723 /* -d must come last before the options handled in startup.el. */
1724 { "-d", "--display", 60, 1 },
1725 { "-display", 0, 60, 1 },
05922407 1726 /* Now for the options handled in startup.el. */
a1716a57
RS
1727 { "-Q", "--quick", 55, 0 },
1728 { "-quick", 0, 55, 0 },
081bef73
RS
1729 { "-q", "--no-init-file", 50, 0 },
1730 { "-no-init-file", 0, 50, 0 },
1731 { "-no-site-file", "--no-site-file", 40, 0 },
1732 { "-u", "--user", 30, 1 },
1733 { "-user", 0, 30, 1 },
1734 { "-debug-init", "--debug-init", 20, 0 },
f9e36a6d 1735 { "-nbi", "--no-bitmap-icon", 15, 0 },
f2bc3538 1736 { "-iconic", "--iconic", 15, 0 },
a1716a57 1737 { "-D", "--basic-display", 12, 0},
e09b9180 1738 { "-basic-display", 0, 12, 0},
081bef73
RS
1739 { "-bg", "--background-color", 10, 1 },
1740 { "-background", 0, 10, 1 },
1741 { "-fg", "--foreground-color", 10, 1 },
1742 { "-foreground", 0, 10, 1 },
1743 { "-bd", "--border-color", 10, 1 },
1744 { "-bw", "--border-width", 10, 1 },
1745 { "-ib", "--internal-border", 10, 1 },
1746 { "-ms", "--mouse-color", 10, 1 },
1747 { "-cr", "--cursor-color", 10, 1 },
49ca717b 1748 { "-nbc", "--no-blinking-cursor", 10, 0 },
081bef73
RS
1749 { "-fn", "--font", 10, 1 },
1750 { "-font", 0, 10, 1 },
94452530
EZ
1751 { "-fs", "--fullscreen", 10, 0 },
1752 { "-fw", "--fullwidth", 10, 0 },
1753 { "-fh", "--fullheight", 10, 0 },
081bef73
RS
1754 { "-g", "--geometry", 10, 1 },
1755 { "-geometry", 0, 10, 1 },
1756 { "-T", "--title", 10, 1 },
ae63ae52 1757 { "-title", 0, 10, 1 },
081bef73
RS
1758 { "-name", "--name", 10, 1 },
1759 { "-xrm", "--xrm", 10, 1 },
1540a61a 1760 { "-parent-id", "--parent-id", 10, 1 },
fcdeb5d9
RS
1761 { "-r", "--reverse-video", 5, 0 },
1762 { "-rv", 0, 5, 0 },
1763 { "-reverse", 0, 5, 0 },
ae63ae52 1764 { "-hb", "--horizontal-scroll-bars", 5, 0 },
fcdeb5d9 1765 { "-vb", "--vertical-scroll-bars", 5, 0 },
d20e1b1e 1766 { "-color", "--color", 5, 0},
16706228
JL
1767 { "-no-splash", "--no-splash", 3, 0 },
1768 { "-no-desktop", "--no-desktop", 3, 0 },
edfda783
AR
1769#ifdef HAVE_NS
1770 { "-NSAutoLaunch", 0, 5, 1 },
1771 { "-NXAutoLaunch", 0, 5, 1 },
1772 { "-disable-font-backend", "--disable-font-backend", 65, 0 },
1773 { "-_NSMachLaunch", 0, 85, 1 },
1774 { "-MachLaunch", 0, 85, 1 },
1775 { "-macosx", 0, 85, 0 },
1776 { "-NSHost", 0, 85, 1 },
1777#endif
fcdeb5d9
RS
1778 /* These have the same priority as ordinary file name args,
1779 so they are not reordered with respect to those. */
4af9e0b3
RS
1780 { "-L", "--directory", 0, 1 },
1781 { "-directory", 0, 0, 1 },
fcdeb5d9
RS
1782 { "-l", "--load", 0, 1 },
1783 { "-load", 0, 0, 1 },
21a4ff8e
GM
1784 /* This has no longname, because using --scriptload confuses sort_args,
1785 because then the --script long option seems to match twice; ie
1786 you can't have a long option which is a prefix of another long
1787 option. In any case, this is entirely an internal option. */
1788 { "-scriptload", NULL, 0, 1 },
fcdeb5d9
RS
1789 { "-f", "--funcall", 0, 1 },
1790 { "-funcall", 0, 0, 1 },
575985b1 1791 { "-eval", "--eval", 0, 1 },
67a5596f 1792 { "-execute", "--execute", 0, 1 },
2e13f8e9
RS
1793 { "-find-file", "--find-file", 0, 1 },
1794 { "-visit", "--visit", 0, 1 },
67a5596f 1795 { "-file", "--file", 0, 1 },
fcdeb5d9 1796 { "-insert", "--insert", 0, 1 },
edfda783
AR
1797#ifdef HAVE_NS
1798 { "-NXOpen", 0, 0, 1 },
1799 { "-NXOpenTemp", 0, 0, 1 },
1800 { "-NSOpen", 0, 0, 1 },
1801 { "-NSOpenTemp", 0, 0, 1 },
1802 { "-GSFilePath", 0, 0, 1 },
1803#endif
f2bc3538 1804 /* This should be processed after ordinary file name args and the like. */
fcdeb5d9 1805 { "-kill", "--kill", -10, 0 },
081bef73
RS
1806};
1807
1808/* Reorder the elements of ARGV (assumed to have ARGC elements)
1809 so that the highest priority ones come first.
1810 Do not change the order of elements of equal priority.
956e3c7e
RS
1811 If an option takes an argument, keep it and its argument together.
1812
1813 If an option that takes no argument appears more
1814 than once, eliminate all but one copy of it. */
081bef73
RS
1815
1816static void
1817sort_args (argc, argv)
1818 int argc;
1819 char **argv;
1820{
1821 char **new = (char **) xmalloc (sizeof (char *) * argc);
1822 /* For each element of argv,
1823 the corresponding element of options is:
1824 0 for an option that takes no arguments,
1825 1 for an option that takes one argument, etc.
1826 -1 for an ordinary non-option argument. */
6dad9359 1827 int *options = (int *) xmalloc (sizeof (int) * argc);
081bef73
RS
1828 int *priority = (int *) xmalloc (sizeof (int) * argc);
1829 int to = 1;
956e3c7e 1830 int incoming_used = 1;
081bef73
RS
1831 int from;
1832 int i;
1833
1834 /* Categorize all the options,
1835 and figure out which argv elts are option arguments. */
1836 for (from = 1; from < argc; from++)
1837 {
1838 options[from] = -1;
fcdeb5d9 1839 priority[from] = 0;
081bef73
RS
1840 if (argv[from][0] == '-')
1841 {
1842 int match, thislen;
1843 char *equals;
1844
c96f26f4
RS
1845 /* If we have found "--", don't consider
1846 any more arguments as options. */
249443b6 1847 if (argv[from][1] == '-' && argv[from][2] == 0)
c96f26f4
RS
1848 {
1849 /* Leave the "--", and everything following it, at the end. */
1850 for (; from < argc; from++)
1851 {
1852 priority[from] = -100;
1853 options[from] = -1;
1854 }
1855 break;
1856 }
1857
081bef73
RS
1858 /* Look for a match with a known old-fashioned option. */
1859 for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1860 if (!strcmp (argv[from], standard_args[i].name))
1861 {
1862 options[from] = standard_args[i].nargs;
1863 priority[from] = standard_args[i].priority;
fd76ec52
RS
1864 if (from + standard_args[i].nargs >= argc)
1865 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
1866 from += standard_args[i].nargs;
1867 goto done;
1868 }
1869
1870 /* Look for a match with a known long option.
1871 MATCH is -1 if no match so far, -2 if two or more matches so far,
1872 >= 0 (the table index of the match) if just one match so far. */
1873 if (argv[from][1] == '-')
1874 {
1875 match = -1;
1876 thislen = strlen (argv[from]);
1877 equals = index (argv[from], '=');
1878 if (equals != 0)
1879 thislen = equals - argv[from];
1880
f609ef57
KH
1881 for (i = 0;
1882 i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1883 if (standard_args[i].longname
1884 && !strncmp (argv[from], standard_args[i].longname,
1885 thislen))
081bef73
RS
1886 {
1887 if (match == -1)
1888 match = i;
1889 else
1890 match = -2;
1891 }
1892
1893 /* If we found exactly one match, use that. */
1894 if (match >= 0)
1895 {
1896 options[from] = standard_args[match].nargs;
1897 priority[from] = standard_args[match].priority;
1898 /* If --OPTION=VALUE syntax is used,
1899 this option uses just one argv element. */
1900 if (equals != 0)
1901 options[from] = 0;
fd76ec52
RS
1902 if (from + options[from] >= argc)
1903 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
1904 from += options[from];
1905 }
a09a5b5b
GM
1906 /* FIXME When match < 0, shouldn't there be some error,
1907 or at least indication to the user that there was a
1908 problem? */
081bef73
RS
1909 }
1910 done: ;
1911 }
1912 }
1913
1914 /* Copy the arguments, in order of decreasing priority, to NEW. */
1915 new[0] = argv[0];
956e3c7e 1916 while (incoming_used < argc)
081bef73
RS
1917 {
1918 int best = -1;
2c70c992 1919 int best_priority = -9999;
081bef73
RS
1920
1921 /* Find the highest priority remaining option.
1922 If several have equal priority, take the first of them. */
1923 for (from = 1; from < argc; from++)
1924 {
1925 if (argv[from] != 0 && priority[from] > best_priority)
1926 {
1927 best_priority = priority[from];
1928 best = from;
1929 }
1930 /* Skip option arguments--they are tied to the options. */
1931 if (options[from] > 0)
1932 from += options[from];
1933 }
7db35a48 1934
081bef73
RS
1935 if (best < 0)
1936 abort ();
1937
956e3c7e
RS
1938 /* Copy the highest priority remaining option, with its args, to NEW.
1939 Unless it is a duplicate of the previous one. */
1940 if (! (options[best] == 0
1941 && ! strcmp (new[to - 1], argv[best])))
1942 {
1943 new[to++] = argv[best];
1944 for (i = 0; i < options[best]; i++)
1945 new[to++] = argv[best + i + 1];
1946 }
1947
1948 incoming_used += 1 + (options[best] > 0 ? options[best] : 0);
081bef73
RS
1949
1950 /* Clear out this option in ARGV. */
1951 argv[best] = 0;
1952 for (i = 0; i < options[best]; i++)
1953 argv[best + i + 1] = 0;
1954 }
1955
81b7af72
RS
1956 /* If duplicate options were deleted, fill up extra space with null ptrs. */
1957 while (to < argc)
1958 new[to++] = 0;
1959
6dad9359 1960 bcopy (new, argv, sizeof (char *) * argc);
0bf591da 1961
68db37aa
KS
1962 xfree (options);
1963 xfree (new);
1964 xfree (priority);
081bef73
RS
1965}
1966\f
f927c5ae 1967DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
7db35a48
PJ
1968 doc: /* Exit the Emacs job and kill it.
1969If ARG is an integer, return ARG as the exit program code.
b224de9b 1970If ARG is a string, stuff it as keyboard input.
7db35a48
PJ
1971
1972The value of `kill-emacs-hook', if not void,
1973is a list of functions (of no args),
1974all of which are called before Emacs is actually killed. */)
1975 (arg)
f927c5ae
JB
1976 Lisp_Object arg;
1977{
f927c5ae
JB
1978 struct gcpro gcpro1;
1979
1980 GCPRO1 (arg);
1981
1982 if (feof (stdin))
1983 arg = Qt;
1984
2447c626 1985 if (!NILP (Vrun_hooks) && !noninteractive)
f927c5ae
JB
1986 call1 (Vrun_hooks, intern ("kill-emacs-hook"));
1987
f927c5ae
JB
1988 UNGCPRO;
1989
d0068e25 1990 shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil);
40be253a 1991
58545838
KH
1992 /* If we have an auto-save list file,
1993 kill it because we are exiting Emacs deliberately (not crashing).
1994 Do it after shut_down_emacs, which does an auto-save. */
1995 if (STRINGP (Vauto_save_list_file_name))
d5db4077 1996 unlink (SDATA (Vauto_save_list_file_name));
58545838 1997
fa439170 1998 exit (INTEGERP (arg) ? XINT (arg) : EXIT_SUCCESS);
f927c5ae 1999 /* NOTREACHED */
f1145b54 2000 return Qnil;
f927c5ae 2001}
40be253a
JB
2002
2003
2004/* Perform an orderly shutdown of Emacs. Autosave any modified
2005 buffers, kill any child processes, clean up the terminal modes (if
2006 we're in the foreground), and other stuff like that. Don't perform
2007 any redisplay; this may be called when Emacs is shutting down in
2008 the background, or after its X connection has died.
2009
2010 If SIG is a signal number, print a message for it.
2011
2012 This is called by fatal signal handlers, X protocol error handlers,
2013 and Fkill_emacs. */
f7ab4e3d 2014
40be253a 2015void
f7ab4e3d 2016shut_down_emacs (sig, no_x, stuff)
41423a80 2017 int sig, no_x;
f7ab4e3d 2018 Lisp_Object stuff;
40be253a 2019{
829d872b
RS
2020 /* Prevent running of hooks from now on. */
2021 Vrun_hooks = Qnil;
2022
9db03f6c
KS
2023 /* Don't update display from now on. */
2024 Vinhibit_redisplay = Qt;
2025
7db35a48 2026 /* If we are controlling the terminal, reset terminal modes. */
40be253a
JB
2027#ifdef EMACS_HAVE_TTY_PGRP
2028 {
d04d81d2
RS
2029 int pgrp = EMACS_GETPGRP (0);
2030
40be253a
JB
2031 int tpgrp;
2032 if (EMACS_GET_TTY_PGRP (0, &tpgrp) != -1
5a570e37 2033 && tpgrp == pgrp)
40be253a 2034 {
28d440ab 2035 reset_all_sys_modes ();
40be253a 2036 if (sig && sig != SIGTERM)
6b61353c 2037 fprintf (stderr, "Fatal error (%d)", sig);
40be253a
JB
2038 }
2039 }
2040#else
2041 fflush (stdout);
0a125897 2042 reset_all_sys_modes ();
40be253a
JB
2043#endif
2044
f7ab4e3d
RS
2045 stuff_buffered_input (stuff);
2046
ba7c29f3 2047#ifdef subprocesses
92d835a4 2048 inhibit_sentinels = 1;
ba7c29f3 2049#endif
40be253a
JB
2050 kill_buffer_processes (Qnil);
2051 Fdo_auto_save (Qt, Qnil);
2052
2053#ifdef CLASH_DETECTION
2054 unlock_all_files ();
2055#endif
2056
5e7f8733 2057#if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
41423a80 2058#ifdef HAVE_X_WINDOWS
f7511647 2059 /* It's not safe to call intern here. Maybe we are crashing. */
2246281f
KL
2060 if (!noninteractive && SYMBOLP (Vinitial_window_system)
2061 && SCHARS (SYMBOL_NAME (Vinitial_window_system)) == 1
2062 && SREF (SYMBOL_NAME (Vinitial_window_system), 0) == 'x'
f7511647 2063 && ! no_x)
41423a80
RS
2064 Fx_close_current_connection ();
2065#endif /* HAVE_X_WINDOWS */
5e7f8733 2066#endif
41423a80 2067
40be253a
JB
2068#ifdef SIGIO
2069 /* There is a tendency for a SIGIO signal to arrive within exit,
2070 and cause a SIGHUP because the input descriptor is already closed. */
2071 unrequest_sigio ();
2072 signal (SIGIO, SIG_IGN);
2073#endif
41f339d4
RS
2074
2075#ifdef WINDOWSNT
2076 term_ntproc ();
2077#endif
d546e578 2078
cd8d4168
GM
2079 /* Do this only if terminating normally, we want glyph matrices
2080 etc. in a core dump. */
200f868e 2081 if (sig == 0 || sig == SIGTERM)
cd8d4168
GM
2082 {
2083 check_glyph_memory ();
2084 check_message_stack ();
2085 }
90d920b6 2086
d546e578
EZ
2087#ifdef MSDOS
2088 dos_cleanup ();
2089#endif
edfda783
AR
2090
2091#ifdef HAVE_NS
2092 ns_term_shutdown (sig);
2093#endif
40be253a
JB
2094}
2095
2096
f927c5ae
JB
2097\f
2098#ifndef CANNOT_DUMP
f927c5ae
JB
2099
2100#ifdef HAVE_SHM
2101
2102DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0,
7db35a48
PJ
2103 doc: /* Dump current state of Emacs into data file FILENAME.
2104This function exists on systems that use HAVE_SHM. */)
2105 (filename)
c9aae259 2106 Lisp_Object filename;
f927c5ae 2107{
55697f5b 2108 extern char my_edata[];
f927c5ae 2109 Lisp_Object tem;
f927c5ae 2110
4fab758d 2111 check_pure_size ();
b7826503 2112 CHECK_STRING (filename);
c9aae259 2113 filename = Fexpand_file_name (filename, Qnil);
f927c5ae
JB
2114
2115 tem = Vpurify_flag;
2116 Vpurify_flag = Qnil;
2117
2118 fflush (stdout);
7db35a48 2119 /* Tell malloc where start of impure now is. */
f927c5ae
JB
2120 /* Also arrange for warnings when nearly out of space. */
2121#ifndef SYSTEM_MALLOC
1090a161 2122 memory_warnings (my_edata, malloc_warning);
f927c5ae 2123#endif
d5db4077 2124 map_out_data (SDATA (filename));
f927c5ae
JB
2125
2126 Vpurify_flag = tem;
2127
2128 return Qnil;
2129}
2130
2131#else /* not HAVE_SHM */
2132
2133DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
7db35a48
PJ
2134 doc: /* Dump current state of Emacs into executable file FILENAME.
2135Take symbols from SYMFILE (presumably the file you executed to run Emacs).
2136This is used in the file `loadup.el' when building Emacs.
2137
2138You must run Emacs in batch mode in order to dump it. */)
2139 (filename, symfile)
c9aae259 2140 Lisp_Object filename, symfile;
f927c5ae 2141{
55697f5b 2142 extern char my_edata[];
f927c5ae 2143 Lisp_Object tem;
1b7ddf4f 2144 Lisp_Object symbol;
331379bf 2145 int count = SPECPDL_INDEX ();
4fab758d
GM
2146
2147 check_pure_size ();
f927c5ae 2148
87a98b1a
RS
2149 if (! noninteractive)
2150 error ("Dumping Emacs works only in batch mode");
2151
848a925e 2152#ifdef GNU_LINUX
dede2792
JD
2153 if (heap_bss_diff > MAX_HEAP_BSS_DIFF)
2154 {
2155 fprintf (stderr, "**************************************************\n");
2156 fprintf (stderr, "Warning: Your system has a gap between BSS and the\n");
e79beb56 2157 fprintf (stderr, "heap (%lu bytes). This usually means that exec-shield\n",
c37caf9d
JD
2158 heap_bss_diff);
2159 fprintf (stderr, "or something similar is in effect. The dump may\n");
e79beb56 2160 fprintf (stderr, "fail because of this. See the section about\n");
c37caf9d 2161 fprintf (stderr, "exec-shield in etc/PROBLEMS for more information.\n");
dede2792
JD
2162 fprintf (stderr, "**************************************************\n");
2163 }
848a925e 2164#endif /* GNU_LINUX */
dede2792 2165
1b7ddf4f
RS
2166 /* Bind `command-line-processed' to nil before dumping,
2167 so that the dumped Emacs will process its command line
2168 and set up to work with X windows if appropriate. */
4aaa3607 2169 symbol = intern ("command-line-processed");
1b7ddf4f
RS
2170 specbind (symbol, Qnil);
2171
b7826503 2172 CHECK_STRING (filename);
c9aae259
EN
2173 filename = Fexpand_file_name (filename, Qnil);
2174 if (!NILP (symfile))
f927c5ae 2175 {
b7826503 2176 CHECK_STRING (symfile);
d5db4077 2177 if (SCHARS (symfile))
c9aae259 2178 symfile = Fexpand_file_name (symfile, Qnil);
f927c5ae
JB
2179 }
2180
2181 tem = Vpurify_flag;
2182 Vpurify_flag = Qnil;
2183
0269dedb
RS
2184#ifdef HAVE_TZSET
2185 set_time_zone_rule (dump_tz);
2186#ifndef LOCALTIME_CACHE
2187 /* Force a tz reload, since set_time_zone_rule doesn't. */
2188 tzset ();
2189#endif
2190#endif
2191
f927c5ae 2192 fflush (stdout);
7db35a48 2193 /* Tell malloc where start of impure now is. */
f927c5ae
JB
2194 /* Also arrange for warnings when nearly out of space. */
2195#ifndef SYSTEM_MALLOC
cc5f52cb
RS
2196#ifndef WINDOWSNT
2197 /* On Windows, this was done before dumping, and that once suffices.
2198 Meanwhile, my_edata is not valid on Windows. */
cb37cf78 2199 memory_warnings (my_edata, malloc_warning);
cc5f52cb 2200#endif /* not WINDOWSNT */
15aaf1b5 2201#endif
06ca62eb 2202#if !defined (SYSTEM_MALLOC) && defined (HAVE_GTK_AND_PTHREAD) && !defined SYNC_INPUT
aa477689
JD
2203 /* Pthread may call malloc before main, and then we will get an endless
2204 loop, because pthread_self (see alloc.c) calls malloc the first time
2205 it is called on some systems. */
2206 reset_malloc_hooks ();
2207#endif
15aaf1b5
RS
2208#ifdef DOUG_LEA_MALLOC
2209 malloc_state_ptr = malloc_get_state ();
f927c5ae 2210#endif
2b7377ca 2211
a74c5ec1 2212#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2213 mmap_set_vars (0);
2214#endif
d5db4077
KR
2215 unexec (SDATA (filename),
2216 !NILP (symfile) ? SDATA (symfile) : 0, my_edata, 0, 0);
a74c5ec1 2217#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2218 mmap_set_vars (1);
2219#endif
15aaf1b5
RS
2220#ifdef DOUG_LEA_MALLOC
2221 free (malloc_state_ptr);
2222#endif
f927c5ae
JB
2223
2224 Vpurify_flag = tem;
2225
1b7ddf4f 2226 return unbind_to (count, Qnil);
f927c5ae
JB
2227}
2228
2229#endif /* not HAVE_SHM */
2230
2231#endif /* not CANNOT_DUMP */
2232\f
68c45bf0
PE
2233#if HAVE_SETLOCALE
2234/* Recover from setlocale (LC_ALL, ""). */
2235void
2236fixup_locale ()
2237{
68c45bf0
PE
2238 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
2239 so that numbers are read and printed properly for Emacs Lisp. */
2240 setlocale (LC_NUMERIC, "C");
68c45bf0
PE
2241}
2242
0c8559bb
PE
2243/* Set system locale CATEGORY, with previous locale *PLOCALE, to
2244 DESIRED_LOCALE. */
68c45bf0
PE
2245static void
2246synchronize_locale (category, plocale, desired_locale)
2247 int category;
2248 Lisp_Object *plocale;
2249 Lisp_Object desired_locale;
2250{
0c8559bb
PE
2251 if (! EQ (*plocale, desired_locale))
2252 {
2253 *plocale = desired_locale;
2254 setlocale (category, (STRINGP (desired_locale)
3b6536b1 2255 ? (char *) SDATA (desired_locale)
0c8559bb
PE
2256 : ""));
2257 }
68c45bf0
PE
2258}
2259
ca9c0567 2260/* Set system time locale to match Vsystem_time_locale, if possible. */
68c45bf0 2261void
ca9c0567 2262synchronize_system_time_locale ()
68c45bf0 2263{
ca9c0567
PE
2264 synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
2265 Vsystem_time_locale);
68c45bf0
PE
2266}
2267
ca9c0567
PE
2268/* Set system messages locale to match Vsystem_messages_locale, if
2269 possible. */
68c45bf0 2270void
ca9c0567 2271synchronize_system_messages_locale ()
68c45bf0
PE
2272{
2273#ifdef LC_MESSAGES
ca9c0567
PE
2274 synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
2275 Vsystem_messages_locale);
68c45bf0
PE
2276#endif
2277}
2278#endif /* HAVE_SETLOCALE */
2279\f
4b163808 2280#ifndef SEPCHAR
f927c5ae
JB
2281#define SEPCHAR ':'
2282#endif
2283
2284Lisp_Object
2285decode_env_path (evarname, defalt)
2286 char *evarname, *defalt;
2287{
2288 register char *path, *p;
213d0b1f 2289 Lisp_Object lpath, element, tem;
f927c5ae 2290
2447c626
JB
2291 /* It's okay to use getenv here, because this function is only used
2292 to initialize variables when Emacs starts up, and isn't called
2293 after that. */
e065a56e
JB
2294 if (evarname != 0)
2295 path = (char *) getenv (evarname);
2296 else
2297 path = 0;
f927c5ae
JB
2298 if (!path)
2299 path = defalt;
6a30e6d6
RS
2300#ifdef DOS_NT
2301 /* Ensure values from the environment use the proper directory separator. */
2302 if (path)
2303 {
2304 p = alloca (strlen (path) + 1);
2305 strcpy (p, path);
2306 path = p;
2307
2308 if ('/' == DIRECTORY_SEP)
2309 dostounix_filename (path);
2310 else
2311 unixtodos_filename (path);
2312 }
2313#endif
f927c5ae
JB
2314 lpath = Qnil;
2315 while (1)
2316 {
2317 p = index (path, SEPCHAR);
2318 if (!p) p = path + strlen (path);
213d0b1f
RS
2319 element = (p - path ? make_string (path, p - path)
2320 : build_string ("."));
2321
2322 /* Add /: to the front of the name
2323 if it would otherwise be treated as magic. */
2324 tem = Ffind_file_name_handler (element, Qt);
ca3df2d5
RS
2325
2326 /* However, if the handler says "I'm safe",
2327 don't bother adding /:. */
2328 if (SYMBOLP (tem))
2329 {
2330 Lisp_Object prop;
2331 prop = Fget (tem, intern ("safe-magic"));
2332 if (! NILP (prop))
2333 tem = Qnil;
2334 }
2335
213d0b1f
RS
2336 if (! NILP (tem))
2337 element = concat2 (build_string ("/:"), element);
2338
2339 lpath = Fcons (element, lpath);
f927c5ae
JB
2340 if (*p)
2341 path = p + 1;
2342 else
2343 break;
2344 }
2345 return Fnreverse (lpath);
2346}
2347
dfcf069d 2348void
f927c5ae
JB
2349syms_of_emacs ()
2350{
213d0b1f
RS
2351 Qfile_name_handler_alist = intern ("file-name-handler-alist");
2352 staticpro (&Qfile_name_handler_alist);
2353
83591e66 2354#ifndef CANNOT_DUMP
f927c5ae
JB
2355#ifdef HAVE_SHM
2356 defsubr (&Sdump_emacs_data);
2357#else
2358 defsubr (&Sdump_emacs);
83591e66 2359#endif
f927c5ae
JB
2360#endif
2361
2362 defsubr (&Skill_emacs);
2363
59653951 2364 defsubr (&Sinvocation_name);
ace40a69 2365 defsubr (&Sinvocation_directory);
59653951 2366
f927c5ae 2367 DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
2a9d2ed6
RS
2368 doc: /* Args passed by shell to Emacs, as a list of strings.
2369Many arguments are deleted from the list as they are processed. */);
f927c5ae
JB
2370
2371 DEFVAR_LISP ("system-type", &Vsystem_type,
40a8993a
NR
2372 doc: /* Value is symbol indicating type of operating system you are using.
2373Special values:
44ac2d3e 2374 `gnu' compiled for a GNU Hurd system.
40a8993a
NR
2375 `gnu/linux' compiled for a GNU/Linux system.
2376 `darwin' compiled for Darwin (GNU-Darwin, Mac OS X, ...).
40a8993a
NR
2377 `ms-dos' compiled as an MS-DOS application.
2378 `windows-nt' compiled as a native W32 application.
2379 `cygwin' compiled using the Cygwin library.
40a8993a 2380Anything else indicates some sort of Unix system. */);
f927c5ae
JB
2381 Vsystem_type = intern (SYSTEM_TYPE);
2382
271c7b7c 2383 DEFVAR_LISP ("system-configuration", &Vsystem_configuration,
7db35a48
PJ
2384 doc: /* Value is string indicating configuration Emacs was built for.
2385On MS-Windows, the value reflects the OS flavor and version on which
2386Emacs is running. */);
f7511647 2387 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
271c7b7c 2388
f0fc0b1a 2389 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options,
7db35a48 2390 doc: /* String containing the configuration options Emacs was built with. */);
f0fc0b1a
KH
2391 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2392
f927c5ae 2393 DEFVAR_BOOL ("noninteractive", &noninteractive1,
7db35a48 2394 doc: /* Non-nil means Emacs is running without interactive terminal. */);
e5d77022 2395
e5d77022 2396 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
e79beb56 2397 doc: /* Hook to be run when `kill-emacs' is called.
d77b70e5 2398Since `kill-emacs' may be invoked when the terminal is disconnected (or
7db35a48
PJ
2399in other similar situations), functions placed on this hook should not
2400expect to be able to interact with the user. To ask for confirmation,
d77b70e5
MR
2401see `kill-emacs-query-functions' instead.
2402
2403The hook is not run in batch mode, i.e., if `noninteractive' is non-nil. */);
edc8ae07 2404 Vkill_emacs_hook = Qnil;
3005da00
RS
2405
2406 DEFVAR_INT ("emacs-priority", &emacs_priority,
7db35a48
PJ
2407 doc: /* Priority for Emacs to run at.
2408This value is effective only if set before Emacs is dumped,
2409and only if the Emacs executable is installed with setuid to permit
2410it to change priority. (Emacs sets its uid back to the real uid.)
2411Currently, you need to define SET_EMACS_PRIORITY in `config.h'
2412before you compile Emacs, to enable the code for this feature. */);
e7a9e1c3 2413 emacs_priority = 0;
074a066b
GV
2414
2415 DEFVAR_LISP ("path-separator", &Vpath_separator,
c7ed3276
EZ
2416 doc: /* String containing the character that separates directories in
2417search paths, such as PATH and other similar environment variables. */);
074a066b
GV
2418 {
2419 char c = SEPCHAR;
2420 Vpath_separator = make_string (&c, 1);
2421 }
59653951 2422
f67de86f 2423 DEFVAR_LISP ("invocation-name", &Vinvocation_name,
7db35a48
PJ
2424 doc: /* The program name that was used to run Emacs.
2425Any directory names are omitted. */);
f67de86f
RS
2426
2427 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory,
7db35a48
PJ
2428 doc: /* The directory in which the Emacs executable was found, to run it.
2429The value is nil if that directory's name is not known. */);
f67de86f
RS
2430
2431 DEFVAR_LISP ("installation-directory", &Vinstallation_directory,
7db35a48 2432 doc: /* A directory within which to look for the `lib-src' and `etc' directories.
e58a672c
RS
2433This is non-nil when we can't find those directories in their standard
2434installed locations, but we can find them near where the Emacs executable
2435was found. */);
07f4d123 2436 Vinstallation_directory = Qnil;
68c45bf0 2437
ca9c0567 2438 DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale,
7db35a48 2439 doc: /* System locale for messages. */);
ca9c0567 2440 Vsystem_messages_locale = Qnil;
68c45bf0 2441
ca9c0567 2442 DEFVAR_LISP ("previous-system-messages-locale",
7db35a48
PJ
2443 &Vprevious_system_messages_locale,
2444 doc: /* Most recently used system locale for messages. */);
ca9c0567 2445 Vprevious_system_messages_locale = Qnil;
68c45bf0 2446
ca9c0567 2447 DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale,
7db35a48 2448 doc: /* System locale for time. */);
ca9c0567 2449 Vsystem_time_locale = Qnil;
68c45bf0 2450
ca9c0567 2451 DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale,
7db35a48 2452 doc: /* Most recently used system locale for time. */);
ca9c0567 2453 Vprevious_system_time_locale = Qnil;
f927c5ae 2454}
6b61353c
KH
2455
2456/* arch-tag: 7bfd356a-c720-4612-8ab6-aa4222931c2e
2457 (do not change this comment) */