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