(gud-display-line): Support hl-line in the source buffer.
[bpt/emacs.git] / src / emacs.c
CommitLineData
f927c5ae 1/* Fully extensible Emacs, running on Unix, intended for GNU.
0b5538bd
TTN
2 Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 1998, 1999,
3 2001, 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
4fc5845f
LK
19the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20Boston, MA 02110-1301, 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. */
fa8459a3 151extern int 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 268--no-window-system, -nw do not communicate with X, ignoring $DISPLAY\n\
bae52079 269--quick, -Q equivalent to -q --no-site-file --no-splash\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\
f9e36a6d 314--no-bitmap-icon, -nbi do not use picture of gnu for Emacs icon\n\
bb0b59bf
EZ
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));
d7b94c98 899 printf ("Copyright (C) 2005 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");
711877f3
MY
921
922 /* A flag to turn off address randomization which is introduced
923 in linux kernel shipped with fedora core 4 */
924#define ADD_NO_RANDOMIZE 0x0040000
925 personality (PER_LINUX32 | ADD_NO_RANDOMIZE);
926#undef ADD_NO_RANDOMIZE
927
dede2792
JD
928 execvp (argv[0], argv);
929
930 /* If the exec fails, try to dump anyway. */
931 perror ("execvp");
932 }
933 }
934#endif /* HAVE_PERSONALITY_LINUX32 */
935
936
f927c5ae
JB
937/* Map in shared memory, if we are using that. */
938#ifdef HAVE_SHM
df6530f8 939 if (argmatch (argv, argc, "-nl", "--no-shared-memory", 6, NULL, &skip_args))
f927c5ae
JB
940 {
941 map_in_data (0);
942 /* The shared memory was just restored, which clobbered this. */
943 skip_args = 1;
944 }
945 else
946 {
947 map_in_data (1);
948 /* The shared memory was just restored, which clobbered this. */
949 skip_args = 0;
950 }
951#endif
952
19a36ec6 953#ifdef NeXT
b9df9faa
KH
954 {
955 extern int malloc_cookie;
956 /* This helps out unexnext.c. */
957 if (initialized)
958 if (malloc_jumpstart (malloc_cookie) != 0)
959 printf ("malloc jumpstart failed!\n");
960 }
19a36ec6
RS
961#endif /* NeXT */
962
e0f712ba
AC
963#ifdef MAC_OSX
964 /* Skip process serial number passed in the form -psn_x_y as
a4f8f6cf
YM
965 command-line argument. The WindowServer adds this option when
966 Emacs is invoked from the Finder or by the `open' command. In
967 these cases, the working directory becomes `/', so we change it
968 to the user's home directory. */
e0f712ba 969 if (argc > skip_args + 1 && strncmp (argv[skip_args+1], "-psn_", 5) == 0)
a4f8f6cf
YM
970 {
971 chdir (getenv ("HOME"));
972 skip_args++;
973 }
e0f712ba
AC
974#endif /* MAC_OSX */
975
f927c5ae 976#ifdef VMS
7db35a48 977 /* If -map specified, map the data file in. */
e2925360
KH
978 {
979 char *file;
70646bb5 980 if (argmatch (argv, argc, "-map", "--map-data", 3, &file, &skip_args))
e2925360
KH
981 mapin_data (file);
982 }
f927c5ae
JB
983
984#ifdef LINK_CRTL_SHARE
34035df3 985#ifdef SHARABLE_LIB_BUG
7db35a48 986 /* Bletcherous shared libraries! */
f927c5ae
JB
987 if (!stdin)
988 stdin = fdopen (0, "r");
989 if (!stdout)
990 stdout = fdopen (1, "w");
991 if (!stderr)
992 stderr = fdopen (2, "w");
993 if (!environ)
994 environ = envp;
34035df3 995#endif /* SHARABLE_LIB_BUG */
f927c5ae
JB
996#endif /* LINK_CRTL_SHARE */
997#endif /* VMS */
998
ea2acec5 999#if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
6c2935e9
RS
1000 /* Extend the stack space available.
1001 Don't do that if dumping, since some systems (e.g. DJGPP)
1002 might define a smaller stack limit at that time. */
1003 if (1
1004#ifndef CANNOT_DUMP
1005 && (!noninteractive || initialized)
1006#endif
1007 && !getrlimit (RLIMIT_STACK, &rlim))
53c58b5d 1008 {
509a8fcd 1009 long newlim;
fa8459a3 1010 extern size_t re_max_failures;
03effc23
KH
1011 /* Approximate the amount regex.c needs per unit of re_max_failures. */
1012 int ratio = 20 * sizeof (char *);
1013 /* Then add 33% to cover the size of the smaller stacks that regex.c
1014 successively allocates and discards, on its way to the maximum. */
1015 ratio += ratio / 3;
1016 /* Add in some extra to cover
1017 what we're likely to use for other reasons. */
1018 newlim = re_max_failures * ratio + 200000;
d0381a7f
RS
1019#ifdef __NetBSD__
1020 /* NetBSD (at least NetBSD 1.2G and former) has a bug in its
1021 stack allocation routine for new process that the allocation
1022 fails if stack limit is not on page boundary. So, round up the
1023 new limit to page boundary. */
1024 newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize();
1025#endif
509a8fcd 1026 if (newlim > rlim.rlim_max)
6c2935e9
RS
1027 {
1028 newlim = rlim.rlim_max;
03effc23
KH
1029 /* Don't let regex.c overflow the stack we have. */
1030 re_max_failures = (newlim - 200000) / ratio;
6c2935e9 1031 }
509a8fcd
RS
1032 if (rlim.rlim_cur < newlim)
1033 rlim.rlim_cur = newlim;
1034
53c58b5d
RS
1035 setrlimit (RLIMIT_STACK, &rlim);
1036 }
ea2acec5 1037#endif /* HAVE_SETRLIMIT and RLIMIT_STACK */
53c58b5d 1038
f927c5ae
JB
1039 /* Record (approximately) where the stack begins. */
1040 stack_bottom = &stack_bottom_variable;
1041
f927c5ae
JB
1042#ifdef USG_SHARED_LIBRARIES
1043 if (bss_end)
1d233b80 1044 brk ((void *)bss_end);
f927c5ae
JB
1045#endif
1046
1047 clearerr (stdin);
9ae8f997 1048
f927c5ae 1049#ifndef SYSTEM_MALLOC
bf7f4e90
RS
1050 /* Arrange to get warning messages as memory fills up. */
1051 memory_warnings (0, malloc_warning);
9ac0d9e0 1052
f5a3c8c4
AI
1053 /* Call malloc at least once, to run the initial __malloc_hook.
1054 Also call realloc and free for consistency. */
1055 free (realloc (malloc (4), 4));
bf7f4e90 1056
06ca62eb 1057# ifndef SYNC_INPUT
bf7f4e90
RS
1058 /* Arrange to disable interrupt input inside malloc etc. */
1059 uninterrupt_malloc ();
06ca62eb 1060# endif /* not SYNC_INPUT */
f927c5ae
JB
1061#endif /* not SYSTEM_MALLOC */
1062
333f1b6f
JD
1063#ifdef HAVE_GTK_AND_PTHREAD
1064 main_thread = pthread_self ();
1065#endif /* HAVE_GTK_AND_PTHREAD */
1066
edd3ff1d 1067#if defined (MSDOS) || defined (WINDOWSNT)
29b89fe0
RS
1068 /* We do all file input/output as binary files. When we need to translate
1069 newlines, we do that manually. */
1070 _fmode = O_BINARY;
edd3ff1d 1071#endif /* MSDOS || WINDOWSNT */
18198bb2 1072
edd3ff1d 1073#ifdef MSDOS
18198bb2
RS
1074#if __DJGPP__ >= 2
1075 if (!isatty (fileno (stdin)))
1076 setmode (fileno (stdin), O_BINARY);
1077 if (!isatty (fileno (stdout)))
1078 {
1079 fflush (stdout);
1080 setmode (fileno (stdout), O_BINARY);
1081 }
1082#else /* not __DJGPP__ >= 2 */
29b89fe0
RS
1083 (stdin)->_flag &= ~_IOTEXT;
1084 (stdout)->_flag &= ~_IOTEXT;
1085 (stderr)->_flag &= ~_IOTEXT;
18198bb2 1086#endif /* not __DJGPP__ >= 2 */
29b89fe0
RS
1087#endif /* MSDOS */
1088
a422068f 1089#ifdef SET_EMACS_PRIORITY
3005da00 1090 if (emacs_priority)
5aa7f46a 1091 nice (emacs_priority);
f927c5ae 1092 setuid (getuid ());
a422068f 1093#endif /* SET_EMACS_PRIORITY */
f927c5ae 1094
68c45bf0
PE
1095 /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
1096 The build procedure uses this while dumping, to ensure that the
1097 dumped Emacs does not have its system locale tables initialized,
1098 as that might cause screwups when the dumped Emacs starts up. */
1099 {
1100 char *lc_all = getenv ("LC_ALL");
1101 do_initial_setlocale = ! lc_all || strcmp (lc_all, "C");
1102 }
1103
1104 /* Set locale now, so that initial error messages are localized properly.
1105 fixup_locale must wait until later, since it builds strings. */
1106 if (do_initial_setlocale)
1107 setlocale (LC_ALL, "");
1108
d8b3a65d 1109#ifdef EXTRA_INITIALIZE
a9260219 1110 EXTRA_INITIALIZE;
d8b3a65d
RS
1111#endif
1112
f927c5ae
JB
1113 inhibit_window_system = 0;
1114
7db35a48 1115 /* Handle the -t switch, which specifies filename to use as terminal. */
956e3c7e
RS
1116 while (1)
1117 {
1118 char *term;
1119 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
1120 {
1121 int result;
68c45bf0
PE
1122 emacs_close (0);
1123 emacs_close (1);
1124 result = emacs_open (term, O_RDWR, 0);
956e3c7e
RS
1125 if (result < 0)
1126 {
1127 char *errstring = strerror (errno);
186486eb 1128 fprintf (stderr, "%s: %s: %s\n", argv[0], term, errstring);
956e3c7e
RS
1129 exit (1);
1130 }
1131 dup (0);
1132 if (! isatty (0))
1133 {
186486eb 1134 fprintf (stderr, "%s: %s: not a tty\n", argv[0], term);
956e3c7e
RS
1135 exit (1);
1136 }
1137 fprintf (stderr, "Using %s\n", term);
8ba50e1a 1138#ifdef HAVE_WINDOW_SYSTEM
956e3c7e 1139 inhibit_window_system = 1; /* -t => -nw */
f927c5ae 1140#endif
956e3c7e
RS
1141 }
1142 else
1143 break;
1144 }
1145
400d6fa9
PJ
1146 /* Command line option --no-windows is deprecated and thus not mentioned
1147 in the manual and usage informations. */
1148 if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args)
1149 || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
e2925360 1150 inhibit_window_system = 1;
f927c5ae 1151
e2925360 1152 /* Handle the -batch switch, which means don't do interactive display. */
f927c5ae 1153 noninteractive = 0;
df6530f8 1154 if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
55f4edbc
RS
1155 {
1156 noninteractive = 1;
1157 Vundo_outer_limit = Qnil;
1158 }
6e910e07
RS
1159 if (argmatch (argv, argc, "-script", "--script", 3, &junk, &skip_args))
1160 {
1161 noninteractive = 1; /* Set batch mode. */
e09b9180
RS
1162 /* Convert --script to --scriptload, un-skip it, and sort again
1163 so that it will be handled in proper sequence. */
1164 argv[skip_args - 1] = "-scriptload";
6e910e07
RS
1165 skip_args -= 2;
1166 sort_args (argc, argv);
1167 }
e2925360 1168
7db35a48 1169 /* Handle the --help option, which gives a usage message. */
df6530f8 1170 if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
f927c5ae 1171 {
f8125c39
EZ
1172 printf (USAGE1, argv[0], USAGE2);
1173 printf (USAGE3);
1174 printf (USAGE4, bug_reporting_address ());
e2925360 1175 exit (0);
f927c5ae
JB
1176 }
1177
edb85f59
RS
1178 if (! noninteractive)
1179 {
1180#ifdef BSD_PGRPS
1181 if (initialized)
1182 {
1183 inherited_pgroup = EMACS_GETPGRP (0);
1184 setpgrp (0, getpid ());
1185 }
1186#else
1187#if defined (USG5) && defined (INTERRUPT_INPUT)
1188 setpgrp ();
1189#endif
1190#endif
1191 }
1192
fb8e9847 1193 init_signals ();
fb8e9847 1194
1efa2983
KH
1195 /* Don't catch SIGHUP if dumping. */
1196 if (1
1197#ifndef CANNOT_DUMP
1198 && initialized
1199#endif
1200 )
1201 {
57e3d22a 1202 sigblock (sigmask (SIGHUP));
1efa2983
KH
1203 /* In --batch mode, don't catch SIGHUP if already ignored.
1204 That makes nohup work. */
1205 if (! noninteractive
1206 || signal (SIGHUP, SIG_IGN) != SIG_IGN)
1207 signal (SIGHUP, fatal_error_signal);
57e3d22a 1208 sigunblock (sigmask (SIGHUP));
1efa2983
KH
1209 }
1210
f927c5ae
JB
1211 if (
1212#ifndef CANNOT_DUMP
1213 ! noninteractive || initialized
1214#else
1215 1
1216#endif
1217 )
1218 {
1efa2983 1219 /* Don't catch these signals in batch mode if dumping.
f927c5ae
JB
1220 On some machines, this sets static data that would make
1221 signal fail to work right when the dumped Emacs is run. */
f927c5ae
JB
1222 signal (SIGQUIT, fatal_error_signal);
1223 signal (SIGILL, fatal_error_signal);
1224 signal (SIGTRAP, fatal_error_signal);
7317d9e8
RS
1225#ifdef SIGUSR1
1226 signal (SIGUSR1, handle_USR1_signal);
1227#ifdef SIGUSR2
1228 signal (SIGUSR2, handle_USR2_signal);
1229#endif
1230#endif
99e372cd
RS
1231#ifdef SIGABRT
1232 signal (SIGABRT, fatal_error_signal);
1233#endif
1234#ifdef SIGHWE
1235 signal (SIGHWE, fatal_error_signal);
1236#endif
1237#ifdef SIGPRE
1238 signal (SIGPRE, fatal_error_signal);
1239#endif
1240#ifdef SIGORE
1241 signal (SIGORE, fatal_error_signal);
1242#endif
1243#ifdef SIGUME
1244 signal (SIGUME, fatal_error_signal);
1245#endif
1246#ifdef SIGDLK
1247 signal (SIGDLK, fatal_error_signal);
1248#endif
1249#ifdef SIGCPULIM
1250 signal (SIGCPULIM, fatal_error_signal);
1251#endif
a90538cb
JB
1252#ifdef SIGIOT
1253 /* This is missing on some systems - OS/2, for example. */
f927c5ae 1254 signal (SIGIOT, fatal_error_signal);
a90538cb 1255#endif
f927c5ae
JB
1256#ifdef SIGEMT
1257 signal (SIGEMT, fatal_error_signal);
1258#endif
1259 signal (SIGFPE, fatal_error_signal);
00eaaa32 1260#ifdef SIGBUS
f927c5ae 1261 signal (SIGBUS, fatal_error_signal);
00eaaa32 1262#endif
f927c5ae 1263 signal (SIGSEGV, fatal_error_signal);
00eaaa32 1264#ifdef SIGSYS
f927c5ae 1265 signal (SIGSYS, fatal_error_signal);
00eaaa32 1266#endif
f927c5ae
JB
1267 signal (SIGTERM, fatal_error_signal);
1268#ifdef SIGXCPU
1269 signal (SIGXCPU, fatal_error_signal);
1270#endif
1271#ifdef SIGXFSZ
1272 signal (SIGXFSZ, fatal_error_signal);
1273#endif /* SIGXFSZ */
1274
271c7b7c
RS
1275#ifdef SIGDANGER
1276 /* This just means available memory is getting low. */
1277 signal (SIGDANGER, memory_warning_signal);
1278#endif
1279
f927c5ae 1280#ifdef AIX
56e034fa
RS
1281/* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
1282 signal (SIGXCPU, fatal_error_signal);
0aef8561 1283#ifndef _I386
f927c5ae 1284 signal (SIGIOINT, fatal_error_signal);
0aef8561 1285#endif
f927c5ae
JB
1286 signal (SIGGRANT, fatal_error_signal);
1287 signal (SIGRETRACT, fatal_error_signal);
1288 signal (SIGSOUND, fatal_error_signal);
1289 signal (SIGMSG, fatal_error_signal);
1290#endif /* AIX */
1291 }
1292
1293 noninteractive1 = noninteractive;
1294
7db35a48 1295/* Perform basic initializations (not merely interning symbols). */
f927c5ae
JB
1296
1297 if (!initialized)
1298 {
1299 init_alloc_once ();
1300 init_obarray ();
1301 init_eval_once ();
270ce821
KH
1302 init_charset_once ();
1303 init_coding_once ();
f927c5ae 1304 init_syntax_once (); /* Create standard syntax table. */
270ce821 1305 init_category_once (); /* Create standard category table. */
7db35a48 1306 /* Must be done before init_buffer. */
f927c5ae 1307 init_casetab_once ();
7db35a48
PJ
1308 init_buffer_once (); /* Create buffer table and some buffers. */
1309 init_minibuf_once (); /* Create list of minibuffers. */
1310 /* Must precede init_window_once. */
1311
90d920b6
GM
1312 /* Call syms_of_xfaces before init_window_once because that
1313 function creates Vterminal_frame. Termcap frames now use
1314 faces, and the face implementation uses some symbols as
1315 face names. */
90d920b6 1316 syms_of_xfaces ();
7a18af49
KR
1317 /* Call syms_of_keyboard before init_window_once because
1318 keyboard sets up symbols that include some face names that
1319 the X support will want to use. This can happen when
1320 CANNOT_DUMP is defined. */
1321 syms_of_keyboard ();
90d920b6 1322
e0f712ba 1323#ifdef MAC_OS8
c1e279c2
AC
1324 /* init_window_once calls make_terminal_frame which on Mac OS
1325 creates a full-fledge output_mac type frame. This does not
1326 work correctly before syms_of_textprop, syms_of_macfns,
1327 syms_of_ccl, syms_of_fontset, syms_of_xterm, syms_of_search,
b15325b2 1328 syms_of_frame, mac_term_init, and init_keyboard have already
c1e279c2 1329 been called. */
1a578e9b
AC
1330 syms_of_textprop ();
1331 syms_of_macfns ();
1332 syms_of_ccl ();
1333 syms_of_fontset ();
1334 syms_of_macterm ();
1335 syms_of_macmenu ();
ab271aca 1336 syms_of_macselect ();
1a578e9b
AC
1337 syms_of_data ();
1338 syms_of_search ();
c1e279c2 1339 syms_of_frame ();
7db35a48 1340
34e1bbc2 1341 init_atimer ();
b15325b2 1342 mac_term_init (build_string ("Mac"), NULL, NULL);
1a578e9b
AC
1343 init_keyboard ();
1344#endif
1345
7db35a48 1346 init_window_once (); /* Init the window system. */
680256a8 1347 init_fileio_once (); /* Must precede any path manipulation. */
0fc4c63e
KS
1348#ifdef HAVE_WINDOW_SYSTEM
1349 init_fringe_once (); /* Swap bitmaps if necessary. */
1350#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae
JB
1351 }
1352
1353 init_alloc ();
68c45bf0
PE
1354
1355 if (do_initial_setlocale)
1356 {
1357 fixup_locale ();
ca9c0567
PE
1358 Vsystem_messages_locale = Vprevious_system_messages_locale;
1359 Vsystem_time_locale = Vprevious_system_time_locale;
68c45bf0
PE
1360 }
1361
f927c5ae
JB
1362 init_eval ();
1363 init_data ();
ad067ea6 1364#ifdef CLASH_DETECTION
01f67d2c 1365 init_filelock ();
ad067ea6 1366#endif
34e1bbc2 1367#ifndef MAC_OS8
ab5d0358 1368 init_atimer ();
34e1bbc2 1369#endif
7074fde6 1370 running_asynch_code = 0;
0e956009 1371
a08a816a
RS
1372 /* Handle --unibyte and the EMACS_UNIBYTE envvar,
1373 but not while dumping. */
e721aa94 1374 if (1)
a08a816a
RS
1375 {
1376 int inhibit_unibyte = 0;
1377
1378 /* --multibyte overrides EMACS_UNIBYTE. */
1379 if (argmatch (argv, argc, "-no-unibyte", "--no-unibyte", 4, NULL, &skip_args)
e721aa94
SM
1380 || argmatch (argv, argc, "-multibyte", "--multibyte", 4, NULL, &skip_args)
1381 /* Ignore EMACS_UNIBYTE before dumping. */
1382 || (!initialized && noninteractive))
a08a816a
RS
1383 inhibit_unibyte = 1;
1384
1385 /* --unibyte requests that we set up to do everything with single-byte
1386 buffers and strings. We need to handle this before calling
1387 init_lread, init_editfns and other places that generate Lisp strings
1388 from text in the environment. */
c0218e1b
DL
1389 /* Actually this shouldn't be needed as of 20.4 in a generally
1390 unibyte environment. As handa says, environment values
1391 aren't now decoded; also existing buffers are now made
1392 unibyte during startup if .emacs sets unibyte. Tested with
1393 8-bit data in environment variables and /etc/passwd, setting
7db35a48 1394 unibyte and Latin-1 in .emacs. -- Dave Love */
a08a816a
RS
1395 if (argmatch (argv, argc, "-unibyte", "--unibyte", 4, NULL, &skip_args)
1396 || argmatch (argv, argc, "-no-multibyte", "--no-multibyte", 4, NULL, &skip_args)
1397 || (getenv ("EMACS_UNIBYTE") && !inhibit_unibyte))
1398 {
1399 Lisp_Object old_log_max;
1400 Lisp_Object symbol, tail;
1401
1402 symbol = intern ("default-enable-multibyte-characters");
1403 Fset (symbol, Qnil);
1404
6524291c
KH
1405 if (initialized)
1406 {
1407 /* Erase pre-dump messages in *Messages* now so no abort. */
1408 old_log_max = Vmessage_log_max;
1409 XSETFASTINT (Vmessage_log_max, 0);
1410 message_dolog ("", 0, 1, 0);
1411 Vmessage_log_max = old_log_max;
1412 }
a08a816a 1413
3e75bb9e 1414 for (tail = Vbuffer_alist; CONSP (tail);
7539e11f 1415 tail = XCDR (tail))
a08a816a
RS
1416 {
1417 Lisp_Object buffer;
1418
7539e11f 1419 buffer = Fcdr (XCAR (tail));
a08a816a
RS
1420 /* Verify that all buffers are empty now, as they
1421 ought to be. */
1422 if (BUF_Z (XBUFFER (buffer)) > BUF_BEG (XBUFFER (buffer)))
1423 abort ();
1424 /* It is safe to do this crudely in an empty buffer. */
1425 XBUFFER (buffer)->enable_multibyte_characters = Qnil;
1426 }
1427 }
1428 }
1429
956e3c7e 1430 no_loadup
b96f9fb7 1431 = argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
956e3c7e
RS
1432
1433
1434#ifdef HAVE_X_WINDOWS
1435 /* Stupid kludge to catch command-line display spec. We can't
1436 handle this argument entirely in window system dependent code
1437 because we don't even know which window system dependent code
1438 to run until we've recognized this argument. */
1439 {
1440 char *displayname = 0;
956e3c7e
RS
1441 int count_before = skip_args;
1442
1443 /* Skip any number of -d options, but only use the last one. */
1444 while (1)
1445 {
1446 int count_before_this = skip_args;
1447
1448 if (argmatch (argv, argc, "-d", "--display", 3, &displayname, &skip_args))
1449 display_arg = 1;
1450 else if (argmatch (argv, argc, "-display", 0, 3, &displayname, &skip_args))
1451 display_arg = 1;
1452 else
1453 break;
1454
1455 count_before = count_before_this;
1456 }
1457
1458 /* If we have the form --display=NAME,
1459 convert it into -d name.
1460 This requires inserting a new element into argv. */
1461 if (displayname != 0 && skip_args - count_before == 1)
1462 {
1463 char **new = (char **) xmalloc (sizeof (char *) * (argc + 2));
1464 int j;
1465
1466 for (j = 0; j < count_before + 1; j++)
1467 new[j] = argv[j];
1468 new[count_before + 1] = "-d";
1469 new[count_before + 2] = displayname;
1470 for (j = count_before + 2; j <argc; j++)
1471 new[j + 1] = argv[j];
1472 argv = new;
1473 argc++;
1474 }
1475 /* Change --display to -d, when its arg is separate. */
1476 else if (displayname != 0 && skip_args > count_before
1477 && argv[count_before + 1][1] == '-')
1478 argv[count_before + 1] = "-d";
1479
1480 /* Don't actually discard this arg. */
1481 skip_args = count_before;
1482 }
1483#endif
1484
1485 /* argmatch must not be used after here,
1486 except when bulding temacs
1487 because the -d argument has not been skipped in skip_args. */
1488
29b89fe0
RS
1489#ifdef MSDOS
1490 /* Call early 'cause init_environment needs it. */
1491 init_dosfns ();
1492 /* Set defaults for several environment variables. */
18198bb2
RS
1493 if (initialized)
1494 init_environment (argc, argv, skip_args);
1495 else
d1fc6752 1496 tzset ();
18198bb2 1497#endif /* MSDOS */
29b89fe0 1498
8ba50e1a 1499#ifdef WINDOWSNT
9785d95b 1500 globals_of_w32 ();
8ba50e1a 1501 /* Initialize environment from registry settings. */
a3a58294 1502 init_environment (argv);
7db35a48 1503 init_ntproc (); /* must precede init_editfns. */
8ba50e1a
GV
1504#endif
1505
3ec33130 1506#if defined (MAC_OSX) && defined (HAVE_CARBON)
1000788b
AC
1507 if (initialized)
1508 init_mac_osx_environment ();
1509#endif
1510
0e956009
JB
1511 /* egetenv is a pretty low-level facility, which may get called in
1512 many circumstances; it seems flimsy to put off initializing it
1513 until calling init_callproc. */
1514 set_process_environment ();
93aed04d
RS
1515 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
1516 if this is not done. Do it after set_process_environment so that we
1517 don't pollute Vprocess_environment. */
fa09a82d
DL
1518 /* Setting LANG here will defeat the startup locale processing... */
1519#ifdef AIX3_2
93aed04d
RS
1520 putenv ("LANG=C");
1521#endif
0e956009 1522
7db35a48 1523 init_buffer (); /* Init default directory of main buffer. */
ace40a69 1524
7928f0b5 1525 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
ace40a69 1526 init_cmdargs (argc, argv, skip_args); /* Must precede init_lread. */
380e25b8
RS
1527
1528 if (initialized)
1529 {
7db35a48 1530 /* Erase any pre-dump messages in the message log, to avoid confusion. */
380e25b8
RS
1531 Lisp_Object old_log_max;
1532 old_log_max = Vmessage_log_max;
1533 XSETFASTINT (Vmessage_log_max, 0);
f6fe7bb5 1534 message_dolog ("", 0, 1, 0);
380e25b8
RS
1535 Vmessage_log_max = old_log_max;
1536 }
1537
7928f0b5 1538 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
fb8e9847 1539 init_lread ();
f927c5ae 1540
8bb697c0
RS
1541 /* Intern the names of all standard functions and variables;
1542 define standard keys. */
f927c5ae
JB
1543
1544 if (!initialized)
1545 {
7db35a48 1546 /* The basic levels of Lisp must come first. */
f927c5ae 1547 /* And data must come first of all
7db35a48 1548 for the sake of symbols like error-message. */
e0f712ba
AC
1549#ifndef MAC_OS8
1550 /* Called before init_window_once for Mac OS Classic. */
f927c5ae 1551 syms_of_data ();
1a578e9b 1552#endif
f927c5ae 1553 syms_of_alloc ();
fb8e9847 1554 syms_of_lread ();
f927c5ae
JB
1555 syms_of_print ();
1556 syms_of_eval ();
1557 syms_of_fns ();
f927c5ae 1558 syms_of_floatfns ();
f927c5ae
JB
1559
1560 syms_of_abbrev ();
1561 syms_of_buffer ();
1562 syms_of_bytecode ();
1563 syms_of_callint ();
1564 syms_of_casefiddle ();
1565 syms_of_casetab ();
1566 syms_of_callproc ();
270ce821 1567 syms_of_category ();
e0f712ba
AC
1568#ifndef MAC_OS8
1569 /* Called before init_window_once for Mac OS Classic. */
270ce821 1570 syms_of_ccl ();
1a578e9b 1571#endif
270ce821 1572 syms_of_charset ();
f927c5ae
JB
1573 syms_of_cmds ();
1574#ifndef NO_DIR_LIBRARY
1575 syms_of_dired ();
1576#endif /* not NO_DIR_LIBRARY */
1577 syms_of_display ();
1578 syms_of_doc ();
1579 syms_of_editfns ();
1580 syms_of_emacs ();
1581 syms_of_fileio ();
270ce821 1582 syms_of_coding (); /* This should be after syms_of_fileio. */
f927c5ae
JB
1583#ifdef CLASH_DETECTION
1584 syms_of_filelock ();
1585#endif /* CLASH_DETECTION */
1586 syms_of_indent ();
c2c5ed2c 1587 syms_of_insdel ();
f927c5ae
JB
1588 syms_of_keymap ();
1589 syms_of_macros ();
1590 syms_of_marker ();
1591 syms_of_minibuf ();
f927c5ae 1592 syms_of_process ();
e0f712ba
AC
1593#ifndef MAC_OS8
1594 /* Called before init_window_once for Mac OS Classic. */
f927c5ae 1595 syms_of_search ();
1cbd5d9d 1596 syms_of_frame ();
c1e279c2 1597#endif
f927c5ae 1598 syms_of_syntax ();
0d934e7b 1599 syms_of_term ();
f927c5ae 1600 syms_of_undo ();
90d920b6
GM
1601#ifdef HAVE_SOUND
1602 syms_of_sound ();
1603#endif
e0f712ba
AC
1604#ifndef MAC_OS8
1605 /* Called before init_window_once for Mac OS Classic. */
bef79ee4 1606 syms_of_textprop ();
1a578e9b 1607#endif
9d100795 1608 syms_of_composite ();
f927c5ae
JB
1609#ifdef VMS
1610 syms_of_vmsproc ();
1611#endif /* VMS */
05687c54
RS
1612#ifdef WINDOWSNT
1613 syms_of_ntproc ();
1614#endif /* WINDOWSNT */
f927c5ae
JB
1615 syms_of_window ();
1616 syms_of_xdisp ();
0fc4c63e
KS
1617#ifdef HAVE_WINDOW_SYSTEM
1618 syms_of_fringe ();
6e7e181d 1619 syms_of_image ();
0fc4c63e 1620#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae 1621#ifdef HAVE_X_WINDOWS
72412588 1622 syms_of_xterm ();
f927c5ae 1623 syms_of_xfns ();
270ce821 1624 syms_of_fontset ();
28b1b672
JD
1625#ifdef HAVE_X_SM
1626 syms_of_xsmfns ();
1627#endif
72412588
JB
1628#ifdef HAVE_X11
1629 syms_of_xselect ();
1630#endif
f927c5ae
JB
1631#endif /* HAVE_X_WINDOWS */
1632
1e9c210b 1633#ifndef HAVE_NTGUI
e0f712ba
AC
1634#ifndef MAC_OS
1635 /* Called before init_window_once for Mac OS Classic. */
6c850f3c 1636 syms_of_xmenu ();
1e9c210b 1637#endif
1a578e9b 1638#endif
6c850f3c 1639
8ba50e1a 1640#ifdef HAVE_NTGUI
fbd6baed
GV
1641 syms_of_w32term ();
1642 syms_of_w32fns ();
fbd6baed
GV
1643 syms_of_w32select ();
1644 syms_of_w32menu ();
02062ac3 1645 syms_of_fontset ();
8ba50e1a
GV
1646#endif /* HAVE_NTGUI */
1647
3ec33130 1648#if defined (MAC_OSX) && defined (HAVE_CARBON)
e0f712ba
AC
1649 syms_of_macterm ();
1650 syms_of_macfns ();
1651 syms_of_macmenu ();
ab271aca 1652 syms_of_macselect ();
e0f712ba 1653 syms_of_fontset ();
3ec33130 1654#endif /* MAC_OSX && HAVE_CARBON */
e0f712ba 1655
f927c5ae
JB
1656#ifdef SYMS_SYSTEM
1657 SYMS_SYSTEM;
1658#endif
1659
1660#ifdef SYMS_MACHINE
1661 SYMS_MACHINE;
1662#endif
1663
1664 keys_of_casefiddle ();
1665 keys_of_cmds ();
1666 keys_of_buffer ();
1667 keys_of_keyboard ();
1668 keys_of_keymap ();
f927c5ae
JB
1669 keys_of_minibuf ();
1670 keys_of_window ();
9785d95b 1671 }
3b6536b1 1672 else
9785d95b 1673 {
3b6536b1
AS
1674 /* Initialization that must be done even if the global variable
1675 initialized is non zero. */
9785d95b
BK
1676#ifdef HAVE_NTGUI
1677 globals_of_w32fns ();
1678 globals_of_w32menu ();
52c7f9ee 1679 globals_of_w32select ();
3b6536b1 1680#endif /* HAVE_NTGUI */
f927c5ae
JB
1681 }
1682
8bb697c0
RS
1683 if (!noninteractive)
1684 {
1685#ifdef VMS
7db35a48 1686 init_vms_input ();/* init_display calls get_frame_size, that needs this. */
8bb697c0 1687#endif /* VMS */
7db35a48 1688 init_display (); /* Determine terminal type. init_sys_modes uses results. */
8bb697c0 1689 }
e0f712ba
AC
1690#ifndef MAC_OS8
1691 /* Called before init_window_once for Mac OS Classic. */
7db35a48 1692 init_keyboard (); /* This too must precede init_sys_modes. */
1a578e9b 1693#endif
8bb697c0 1694#ifdef VMS
7db35a48 1695 init_vmsproc (); /* And this too. */
8bb697c0 1696#endif /* VMS */
7db35a48 1697 init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.). */
90d920b6 1698 init_fns ();
8bb697c0 1699 init_xdisp ();
0fc4c63e
KS
1700#ifdef HAVE_WINDOW_SYSTEM
1701 init_fringe ();
6e7e181d 1702 init_image ();
0fc4c63e 1703#endif /* HAVE_WINDOW_SYSTEM */
8bb697c0
RS
1704 init_macros ();
1705 init_editfns ();
8bb697c0 1706 init_floatfns ();
8bb697c0
RS
1707#ifdef VMS
1708 init_vmsfns ();
1709#endif /* VMS */
1710 init_process ();
90d920b6
GM
1711#ifdef HAVE_SOUND
1712 init_sound ();
1713#endif
75816372 1714 init_window ();
8bb697c0 1715
f927c5ae
JB
1716 if (!initialized)
1717 {
e2925360 1718 char *file;
7db35a48 1719 /* Handle -l loadup, args passed by Makefile. */
df6530f8 1720 if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
f927c5ae 1721 Vtop_level = Fcons (intern ("load"),
e2925360 1722 Fcons (build_string (file), Qnil));
f927c5ae 1723 /* Unless next switch is -nl, load "loadup.el" first thing. */
956e3c7e 1724 if (! no_loadup)
f927c5ae
JB
1725 Vtop_level = Fcons (intern ("load"),
1726 Fcons (build_string ("loadup.el"), Qnil));
f927c5ae
JB
1727 }
1728
93572b43
KH
1729 if (initialized)
1730 {
0269dedb
RS
1731#ifdef HAVE_TZSET
1732 {
1733 /* If the execution TZ happens to be the same as the dump TZ,
1734 change it to some other value and then change it back,
1735 to force the underlying implementation to reload the TZ info.
1736 This is needed on implementations that load TZ info from files,
1737 since the TZ file contents may differ between dump and execution. */
1738 char *tz = getenv ("TZ");
1739 if (tz && !strcmp (tz, dump_tz))
1740 {
1741 ++*tz;
1742 tzset ();
1743 --*tz;
1744 }
1745 }
1746#endif
93572b43
KH
1747 }
1748
37a0ae84
GM
1749 /* Set up for profiling. This is known to work on FreeBSD and
1750 GNU/Linux. It might work on some other systems too. Give it a
1751 try and tell us if it works on your system. To compile for
7db35a48 1752 profiling use something like `make CFLAGS="-pg -g -O -DPROFILING=1'. */
6a97197e 1753#if defined (__FreeBSD__) || defined (__linux)
e610ea43
RS
1754#ifdef PROFILING
1755 if (initialized)
1756 {
7db35a48 1757 extern void _mcleanup ();
e610ea43 1758 extern char etext;
90d920b6 1759 extern void safe_bcopy ();
67a5596f
GM
1760 extern void dump_opcode_frequencies ();
1761
e610ea43 1762 atexit (_mcleanup);
90d920b6
GM
1763 /* This uses safe_bcopy because that function comes first in the
1764 Emacs executable. It might be better to use something that
1765 gives the start of the text segment, but start_of_text is not
1766 defined on all systems now. */
1767 monstartup (safe_bcopy, &etext);
e610ea43
RS
1768 }
1769 else
1770 moncontrol (0);
1771#endif
1772#endif
1773
f927c5ae
JB
1774 initialized = 1;
1775
e7536cff
RS
1776#ifdef LOCALTIME_CACHE
1777 /* Some versions of localtime have a bug. They cache the value of the time
279cc2b8
JB
1778 zone rather than looking it up every time. Since localtime() is
1779 called to bolt the undumping time into the undumped emacs, this
afe9fae9 1780 results in localtime ignoring the TZ environment variable.
7db35a48 1781 This flushes the new TZ value into localtime. */
afe9fae9 1782 tzset ();
e7536cff 1783#endif /* defined (LOCALTIME_CACHE) */
279cc2b8 1784
f927c5ae
JB
1785 /* Enter editor command loop. This never returns. */
1786 Frecursive_edit ();
1787 /* NOTREACHED */
6bbd7a29 1788 return 0;
f927c5ae
JB
1789}
1790\f
081bef73
RS
1791/* Sort the args so we can find the most important ones
1792 at the beginning of argv. */
1793
1794/* First, here's a table of all the standard options. */
1795
1796struct standard_args
1797{
1798 char *name;
1799 char *longname;
1800 int priority;
1801 int nargs;
1802};
1803
1804struct standard_args standard_args[] =
1805{
05922407
RS
1806 { "-version", "--version", 150, 0 },
1807#ifdef HAVE_SHM
1808 { "-nl", "--no-shared-memory", 140, 0 },
1809#endif
2725719a 1810#ifdef VMS
05922407 1811 { "-map", "--map-data", 130, 0 },
2725719a 1812#endif
05922407 1813 { "-t", "--terminal", 120, 1 },
400d6fa9 1814 { "-nw", "--no-window-system", 110, 0 },
05922407
RS
1815 { "-nw", "--no-windows", 110, 0 },
1816 { "-batch", "--batch", 100, 0 },
6e910e07 1817 { "-script", "--script", 100, 1 },
05922407 1818 { "-help", "--help", 90, 0 },
956e3c7e
RS
1819 { "-no-unibyte", "--no-unibyte", 83, 0 },
1820 { "-multibyte", "--multibyte", 82, 0 },
1821 { "-unibyte", "--unibyte", 81, 0 },
1822 { "-no-multibyte", "--no-multibyte", 80, 0 },
956e3c7e 1823 { "-nl", "--no-loadup", 70, 0 },
956e3c7e
RS
1824 /* -d must come last before the options handled in startup.el. */
1825 { "-d", "--display", 60, 1 },
1826 { "-display", 0, 60, 1 },
05922407 1827 /* Now for the options handled in startup.el. */
a1716a57
RS
1828 { "-Q", "--quick", 55, 0 },
1829 { "-quick", 0, 55, 0 },
081bef73
RS
1830 { "-q", "--no-init-file", 50, 0 },
1831 { "-no-init-file", 0, 50, 0 },
1832 { "-no-site-file", "--no-site-file", 40, 0 },
af2bf12f 1833 { "-no-splash", "--no-splash", 40, 0 },
081bef73
RS
1834 { "-u", "--user", 30, 1 },
1835 { "-user", 0, 30, 1 },
1836 { "-debug-init", "--debug-init", 20, 0 },
f9e36a6d 1837 { "-nbi", "--no-bitmap-icon", 15, 0 },
f2bc3538 1838 { "-iconic", "--iconic", 15, 0 },
a1716a57 1839 { "-D", "--basic-display", 12, 0},
e09b9180 1840 { "-basic-display", 0, 12, 0},
081bef73
RS
1841 { "-bg", "--background-color", 10, 1 },
1842 { "-background", 0, 10, 1 },
1843 { "-fg", "--foreground-color", 10, 1 },
1844 { "-foreground", 0, 10, 1 },
1845 { "-bd", "--border-color", 10, 1 },
1846 { "-bw", "--border-width", 10, 1 },
1847 { "-ib", "--internal-border", 10, 1 },
1848 { "-ms", "--mouse-color", 10, 1 },
1849 { "-cr", "--cursor-color", 10, 1 },
49ca717b 1850 { "-nbc", "--no-blinking-cursor", 10, 0 },
081bef73
RS
1851 { "-fn", "--font", 10, 1 },
1852 { "-font", 0, 10, 1 },
94452530
EZ
1853 { "-fs", "--fullscreen", 10, 0 },
1854 { "-fw", "--fullwidth", 10, 0 },
1855 { "-fh", "--fullheight", 10, 0 },
081bef73
RS
1856 { "-g", "--geometry", 10, 1 },
1857 { "-geometry", 0, 10, 1 },
1858 { "-T", "--title", 10, 1 },
ae63ae52 1859 { "-title", 0, 10, 1 },
081bef73
RS
1860 { "-name", "--name", 10, 1 },
1861 { "-xrm", "--xrm", 10, 1 },
fcdeb5d9
RS
1862 { "-r", "--reverse-video", 5, 0 },
1863 { "-rv", 0, 5, 0 },
1864 { "-reverse", 0, 5, 0 },
ae63ae52 1865 { "-hb", "--horizontal-scroll-bars", 5, 0 },
fcdeb5d9 1866 { "-vb", "--vertical-scroll-bars", 5, 0 },
d20e1b1e 1867 { "-color", "--color", 5, 0},
fcdeb5d9
RS
1868 /* These have the same priority as ordinary file name args,
1869 so they are not reordered with respect to those. */
4af9e0b3
RS
1870 { "-L", "--directory", 0, 1 },
1871 { "-directory", 0, 0, 1 },
fcdeb5d9
RS
1872 { "-l", "--load", 0, 1 },
1873 { "-load", 0, 0, 1 },
e09b9180 1874 { "-scriptload", "--scriptload", 0, 1 },
fcdeb5d9
RS
1875 { "-f", "--funcall", 0, 1 },
1876 { "-funcall", 0, 0, 1 },
575985b1 1877 { "-eval", "--eval", 0, 1 },
67a5596f 1878 { "-execute", "--execute", 0, 1 },
2e13f8e9
RS
1879 { "-find-file", "--find-file", 0, 1 },
1880 { "-visit", "--visit", 0, 1 },
67a5596f 1881 { "-file", "--file", 0, 1 },
fcdeb5d9 1882 { "-insert", "--insert", 0, 1 },
f2bc3538 1883 /* This should be processed after ordinary file name args and the like. */
fcdeb5d9 1884 { "-kill", "--kill", -10, 0 },
081bef73
RS
1885};
1886
1887/* Reorder the elements of ARGV (assumed to have ARGC elements)
1888 so that the highest priority ones come first.
1889 Do not change the order of elements of equal priority.
956e3c7e
RS
1890 If an option takes an argument, keep it and its argument together.
1891
1892 If an option that takes no argument appears more
1893 than once, eliminate all but one copy of it. */
081bef73
RS
1894
1895static void
1896sort_args (argc, argv)
1897 int argc;
1898 char **argv;
1899{
1900 char **new = (char **) xmalloc (sizeof (char *) * argc);
1901 /* For each element of argv,
1902 the corresponding element of options is:
1903 0 for an option that takes no arguments,
1904 1 for an option that takes one argument, etc.
1905 -1 for an ordinary non-option argument. */
6dad9359 1906 int *options = (int *) xmalloc (sizeof (int) * argc);
081bef73
RS
1907 int *priority = (int *) xmalloc (sizeof (int) * argc);
1908 int to = 1;
956e3c7e 1909 int incoming_used = 1;
081bef73
RS
1910 int from;
1911 int i;
1912
1913 /* Categorize all the options,
1914 and figure out which argv elts are option arguments. */
1915 for (from = 1; from < argc; from++)
1916 {
1917 options[from] = -1;
fcdeb5d9 1918 priority[from] = 0;
081bef73
RS
1919 if (argv[from][0] == '-')
1920 {
1921 int match, thislen;
1922 char *equals;
1923
c96f26f4
RS
1924 /* If we have found "--", don't consider
1925 any more arguments as options. */
249443b6 1926 if (argv[from][1] == '-' && argv[from][2] == 0)
c96f26f4
RS
1927 {
1928 /* Leave the "--", and everything following it, at the end. */
1929 for (; from < argc; from++)
1930 {
1931 priority[from] = -100;
1932 options[from] = -1;
1933 }
1934 break;
1935 }
1936
081bef73
RS
1937 /* Look for a match with a known old-fashioned option. */
1938 for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1939 if (!strcmp (argv[from], standard_args[i].name))
1940 {
1941 options[from] = standard_args[i].nargs;
1942 priority[from] = standard_args[i].priority;
fd76ec52
RS
1943 if (from + standard_args[i].nargs >= argc)
1944 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
1945 from += standard_args[i].nargs;
1946 goto done;
1947 }
1948
1949 /* Look for a match with a known long option.
1950 MATCH is -1 if no match so far, -2 if two or more matches so far,
1951 >= 0 (the table index of the match) if just one match so far. */
1952 if (argv[from][1] == '-')
1953 {
1954 match = -1;
1955 thislen = strlen (argv[from]);
1956 equals = index (argv[from], '=');
1957 if (equals != 0)
1958 thislen = equals - argv[from];
1959
f609ef57
KH
1960 for (i = 0;
1961 i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1962 if (standard_args[i].longname
1963 && !strncmp (argv[from], standard_args[i].longname,
1964 thislen))
081bef73
RS
1965 {
1966 if (match == -1)
1967 match = i;
1968 else
1969 match = -2;
1970 }
1971
1972 /* If we found exactly one match, use that. */
1973 if (match >= 0)
1974 {
1975 options[from] = standard_args[match].nargs;
1976 priority[from] = standard_args[match].priority;
1977 /* If --OPTION=VALUE syntax is used,
1978 this option uses just one argv element. */
1979 if (equals != 0)
1980 options[from] = 0;
fd76ec52
RS
1981 if (from + options[from] >= argc)
1982 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
1983 from += options[from];
1984 }
1985 }
1986 done: ;
1987 }
1988 }
1989
1990 /* Copy the arguments, in order of decreasing priority, to NEW. */
1991 new[0] = argv[0];
956e3c7e 1992 while (incoming_used < argc)
081bef73
RS
1993 {
1994 int best = -1;
2c70c992 1995 int best_priority = -9999;
081bef73
RS
1996
1997 /* Find the highest priority remaining option.
1998 If several have equal priority, take the first of them. */
1999 for (from = 1; from < argc; from++)
2000 {
2001 if (argv[from] != 0 && priority[from] > best_priority)
2002 {
2003 best_priority = priority[from];
2004 best = from;
2005 }
2006 /* Skip option arguments--they are tied to the options. */
2007 if (options[from] > 0)
2008 from += options[from];
2009 }
7db35a48 2010
081bef73
RS
2011 if (best < 0)
2012 abort ();
2013
956e3c7e
RS
2014 /* Copy the highest priority remaining option, with its args, to NEW.
2015 Unless it is a duplicate of the previous one. */
2016 if (! (options[best] == 0
2017 && ! strcmp (new[to - 1], argv[best])))
2018 {
2019 new[to++] = argv[best];
2020 for (i = 0; i < options[best]; i++)
2021 new[to++] = argv[best + i + 1];
2022 }
2023
2024 incoming_used += 1 + (options[best] > 0 ? options[best] : 0);
081bef73
RS
2025
2026 /* Clear out this option in ARGV. */
2027 argv[best] = 0;
2028 for (i = 0; i < options[best]; i++)
2029 argv[best + i + 1] = 0;
2030 }
2031
81b7af72
RS
2032 /* If duplicate options were deleted, fill up extra space with null ptrs. */
2033 while (to < argc)
2034 new[to++] = 0;
2035
6dad9359 2036 bcopy (new, argv, sizeof (char *) * argc);
0bf591da 2037
68db37aa
KS
2038 xfree (options);
2039 xfree (new);
2040 xfree (priority);
081bef73
RS
2041}
2042\f
f927c5ae 2043DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
7db35a48
PJ
2044 doc: /* Exit the Emacs job and kill it.
2045If ARG is an integer, return ARG as the exit program code.
2046If ARG is a string, stuff it as keyboard input.
2047
2048The value of `kill-emacs-hook', if not void,
2049is a list of functions (of no args),
2050all of which are called before Emacs is actually killed. */)
2051 (arg)
f927c5ae
JB
2052 Lisp_Object arg;
2053{
f927c5ae
JB
2054 struct gcpro gcpro1;
2055
2056 GCPRO1 (arg);
2057
2058 if (feof (stdin))
2059 arg = Qt;
2060
2447c626 2061 if (!NILP (Vrun_hooks) && !noninteractive)
f927c5ae
JB
2062 call1 (Vrun_hooks, intern ("kill-emacs-hook"));
2063
f927c5ae
JB
2064 UNGCPRO;
2065
2066/* Is it really necessary to do this deassign
2067 when we are going to exit anyway? */
2068/* #ifdef VMS
2069 stop_vms_input ();
2070 #endif */
40be253a 2071
d0068e25 2072 shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil);
40be253a 2073
58545838
KH
2074 /* If we have an auto-save list file,
2075 kill it because we are exiting Emacs deliberately (not crashing).
2076 Do it after shut_down_emacs, which does an auto-save. */
2077 if (STRINGP (Vauto_save_list_file_name))
d5db4077 2078 unlink (SDATA (Vauto_save_list_file_name));
58545838 2079
fa439170 2080 exit (INTEGERP (arg) ? XINT (arg) : EXIT_SUCCESS);
f927c5ae 2081 /* NOTREACHED */
f1145b54 2082 return Qnil;
f927c5ae 2083}
40be253a
JB
2084
2085
2086/* Perform an orderly shutdown of Emacs. Autosave any modified
2087 buffers, kill any child processes, clean up the terminal modes (if
2088 we're in the foreground), and other stuff like that. Don't perform
2089 any redisplay; this may be called when Emacs is shutting down in
2090 the background, or after its X connection has died.
2091
2092 If SIG is a signal number, print a message for it.
2093
2094 This is called by fatal signal handlers, X protocol error handlers,
2095 and Fkill_emacs. */
f7ab4e3d 2096
40be253a 2097void
f7ab4e3d 2098shut_down_emacs (sig, no_x, stuff)
41423a80 2099 int sig, no_x;
f7ab4e3d 2100 Lisp_Object stuff;
40be253a 2101{
829d872b
RS
2102 /* Prevent running of hooks from now on. */
2103 Vrun_hooks = Qnil;
2104
9db03f6c
KS
2105 /* Don't update display from now on. */
2106 Vinhibit_redisplay = Qt;
2107
7db35a48 2108 /* If we are controlling the terminal, reset terminal modes. */
40be253a
JB
2109#ifdef EMACS_HAVE_TTY_PGRP
2110 {
d04d81d2
RS
2111 int pgrp = EMACS_GETPGRP (0);
2112
40be253a
JB
2113 int tpgrp;
2114 if (EMACS_GET_TTY_PGRP (0, &tpgrp) != -1
5a570e37 2115 && tpgrp == pgrp)
40be253a
JB
2116 {
2117 fflush (stdout);
2118 reset_sys_modes ();
2119 if (sig && sig != SIGTERM)
7c402969 2120 fprintf (stderr, "Fatal error (%d)", sig);
40be253a
JB
2121 }
2122 }
2123#else
2124 fflush (stdout);
2125 reset_sys_modes ();
2126#endif
2127
f7ab4e3d
RS
2128 stuff_buffered_input (stuff);
2129
40be253a
JB
2130 kill_buffer_processes (Qnil);
2131 Fdo_auto_save (Qt, Qnil);
2132
2133#ifdef CLASH_DETECTION
2134 unlock_all_files ();
2135#endif
2136
2137#ifdef VMS
2138 kill_vms_processes ();
2139#endif
2140
5e7f8733 2141#if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
41423a80 2142#ifdef HAVE_X_WINDOWS
f7511647
RS
2143 /* It's not safe to call intern here. Maybe we are crashing. */
2144 if (!noninteractive && SYMBOLP (Vwindow_system)
d5db4077
KR
2145 && SCHARS (SYMBOL_NAME (Vwindow_system)) == 1
2146 && SREF (SYMBOL_NAME (Vwindow_system), 0) == 'x'
f7511647 2147 && ! no_x)
41423a80
RS
2148 Fx_close_current_connection ();
2149#endif /* HAVE_X_WINDOWS */
5e7f8733 2150#endif
41423a80 2151
40be253a
JB
2152#ifdef SIGIO
2153 /* There is a tendency for a SIGIO signal to arrive within exit,
2154 and cause a SIGHUP because the input descriptor is already closed. */
2155 unrequest_sigio ();
2156 signal (SIGIO, SIG_IGN);
2157#endif
41f339d4
RS
2158
2159#ifdef WINDOWSNT
2160 term_ntproc ();
2161#endif
d546e578 2162
cd8d4168
GM
2163 /* Do this only if terminating normally, we want glyph matrices
2164 etc. in a core dump. */
200f868e 2165 if (sig == 0 || sig == SIGTERM)
cd8d4168
GM
2166 {
2167 check_glyph_memory ();
2168 check_message_stack ();
2169 }
90d920b6 2170
d546e578
EZ
2171#ifdef MSDOS
2172 dos_cleanup ();
2173#endif
40be253a
JB
2174}
2175
2176
f927c5ae
JB
2177\f
2178#ifndef CANNOT_DUMP
f927c5ae
JB
2179
2180#ifdef HAVE_SHM
2181
2182DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0,
7db35a48
PJ
2183 doc: /* Dump current state of Emacs into data file FILENAME.
2184This function exists on systems that use HAVE_SHM. */)
2185 (filename)
c9aae259 2186 Lisp_Object filename;
f927c5ae 2187{
55697f5b 2188 extern char my_edata[];
f927c5ae 2189 Lisp_Object tem;
f927c5ae 2190
4fab758d 2191 check_pure_size ();
b7826503 2192 CHECK_STRING (filename);
c9aae259 2193 filename = Fexpand_file_name (filename, Qnil);
f927c5ae
JB
2194
2195 tem = Vpurify_flag;
2196 Vpurify_flag = Qnil;
2197
2198 fflush (stdout);
7db35a48 2199 /* Tell malloc where start of impure now is. */
f927c5ae
JB
2200 /* Also arrange for warnings when nearly out of space. */
2201#ifndef SYSTEM_MALLOC
1090a161 2202 memory_warnings (my_edata, malloc_warning);
f927c5ae 2203#endif
d5db4077 2204 map_out_data (SDATA (filename));
f927c5ae
JB
2205
2206 Vpurify_flag = tem;
2207
2208 return Qnil;
2209}
2210
2211#else /* not HAVE_SHM */
2212
2213DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
7db35a48
PJ
2214 doc: /* Dump current state of Emacs into executable file FILENAME.
2215Take symbols from SYMFILE (presumably the file you executed to run Emacs).
2216This is used in the file `loadup.el' when building Emacs.
2217
2218You must run Emacs in batch mode in order to dump it. */)
2219 (filename, symfile)
c9aae259 2220 Lisp_Object filename, symfile;
f927c5ae 2221{
55697f5b 2222 extern char my_edata[];
f927c5ae 2223 Lisp_Object tem;
1b7ddf4f 2224 Lisp_Object symbol;
331379bf 2225 int count = SPECPDL_INDEX ();
4fab758d
GM
2226
2227 check_pure_size ();
f927c5ae 2228
87a98b1a
RS
2229 if (! noninteractive)
2230 error ("Dumping Emacs works only in batch mode");
2231
c37caf9d 2232#ifdef __linux__
dede2792
JD
2233 if (heap_bss_diff > MAX_HEAP_BSS_DIFF)
2234 {
2235 fprintf (stderr, "**************************************************\n");
2236 fprintf (stderr, "Warning: Your system has a gap between BSS and the\n");
9b33d596 2237 fprintf (stderr, "heap (%lu byte). This usually means that exec-shield\n",
c37caf9d
JD
2238 heap_bss_diff);
2239 fprintf (stderr, "or something similar is in effect. The dump may\n");
2240 fprintf (stderr, "fail because of this. See the section about \n");
2241 fprintf (stderr, "exec-shield in etc/PROBLEMS for more information.\n");
dede2792
JD
2242 fprintf (stderr, "**************************************************\n");
2243 }
c37caf9d 2244#endif /* __linux__ */
dede2792 2245
1b7ddf4f
RS
2246 /* Bind `command-line-processed' to nil before dumping,
2247 so that the dumped Emacs will process its command line
2248 and set up to work with X windows if appropriate. */
4aaa3607 2249 symbol = intern ("command-line-processed");
1b7ddf4f
RS
2250 specbind (symbol, Qnil);
2251
b7826503 2252 CHECK_STRING (filename);
c9aae259
EN
2253 filename = Fexpand_file_name (filename, Qnil);
2254 if (!NILP (symfile))
f927c5ae 2255 {
b7826503 2256 CHECK_STRING (symfile);
d5db4077 2257 if (SCHARS (symfile))
c9aae259 2258 symfile = Fexpand_file_name (symfile, Qnil);
f927c5ae
JB
2259 }
2260
2261 tem = Vpurify_flag;
2262 Vpurify_flag = Qnil;
2263
0269dedb
RS
2264#ifdef HAVE_TZSET
2265 set_time_zone_rule (dump_tz);
2266#ifndef LOCALTIME_CACHE
2267 /* Force a tz reload, since set_time_zone_rule doesn't. */
2268 tzset ();
2269#endif
2270#endif
2271
f927c5ae
JB
2272 fflush (stdout);
2273#ifdef VMS
d5db4077 2274 mapout_data (SDATA (filename));
f927c5ae 2275#else
7db35a48 2276 /* Tell malloc where start of impure now is. */
f927c5ae
JB
2277 /* Also arrange for warnings when nearly out of space. */
2278#ifndef SYSTEM_MALLOC
cc5f52cb
RS
2279#ifndef WINDOWSNT
2280 /* On Windows, this was done before dumping, and that once suffices.
2281 Meanwhile, my_edata is not valid on Windows. */
cb37cf78 2282 memory_warnings (my_edata, malloc_warning);
cc5f52cb 2283#endif /* not WINDOWSNT */
15aaf1b5 2284#endif
06ca62eb 2285#if !defined (SYSTEM_MALLOC) && defined (HAVE_GTK_AND_PTHREAD) && !defined SYNC_INPUT
aa477689
JD
2286 /* Pthread may call malloc before main, and then we will get an endless
2287 loop, because pthread_self (see alloc.c) calls malloc the first time
2288 it is called on some systems. */
2289 reset_malloc_hooks ();
2290#endif
15aaf1b5
RS
2291#ifdef DOUG_LEA_MALLOC
2292 malloc_state_ptr = malloc_get_state ();
f927c5ae 2293#endif
2b7377ca 2294
a74c5ec1 2295#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2296 mmap_set_vars (0);
2297#endif
d5db4077
KR
2298 unexec (SDATA (filename),
2299 !NILP (symfile) ? SDATA (symfile) : 0, my_edata, 0, 0);
a74c5ec1 2300#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2301 mmap_set_vars (1);
2302#endif
15aaf1b5
RS
2303#ifdef DOUG_LEA_MALLOC
2304 free (malloc_state_ptr);
2305#endif
f927c5ae
JB
2306#endif /* not VMS */
2307
2308 Vpurify_flag = tem;
2309
1b7ddf4f 2310 return unbind_to (count, Qnil);
f927c5ae
JB
2311}
2312
2313#endif /* not HAVE_SHM */
2314
2315#endif /* not CANNOT_DUMP */
2316\f
68c45bf0
PE
2317#if HAVE_SETLOCALE
2318/* Recover from setlocale (LC_ALL, ""). */
2319void
2320fixup_locale ()
2321{
68c45bf0
PE
2322 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
2323 so that numbers are read and printed properly for Emacs Lisp. */
2324 setlocale (LC_NUMERIC, "C");
68c45bf0
PE
2325}
2326
0c8559bb
PE
2327/* Set system locale CATEGORY, with previous locale *PLOCALE, to
2328 DESIRED_LOCALE. */
68c45bf0
PE
2329static void
2330synchronize_locale (category, plocale, desired_locale)
2331 int category;
2332 Lisp_Object *plocale;
2333 Lisp_Object desired_locale;
2334{
0c8559bb
PE
2335 if (! EQ (*plocale, desired_locale))
2336 {
2337 *plocale = desired_locale;
2338 setlocale (category, (STRINGP (desired_locale)
3b6536b1 2339 ? (char *) SDATA (desired_locale)
0c8559bb
PE
2340 : ""));
2341 }
68c45bf0
PE
2342}
2343
ca9c0567 2344/* Set system time locale to match Vsystem_time_locale, if possible. */
68c45bf0 2345void
ca9c0567 2346synchronize_system_time_locale ()
68c45bf0 2347{
ca9c0567
PE
2348 synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
2349 Vsystem_time_locale);
68c45bf0
PE
2350}
2351
ca9c0567
PE
2352/* Set system messages locale to match Vsystem_messages_locale, if
2353 possible. */
68c45bf0 2354void
ca9c0567 2355synchronize_system_messages_locale ()
68c45bf0
PE
2356{
2357#ifdef LC_MESSAGES
ca9c0567
PE
2358 synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
2359 Vsystem_messages_locale);
68c45bf0
PE
2360#endif
2361}
2362#endif /* HAVE_SETLOCALE */
2363\f
4b163808 2364#ifndef SEPCHAR
f927c5ae
JB
2365#define SEPCHAR ':'
2366#endif
2367
2368Lisp_Object
2369decode_env_path (evarname, defalt)
2370 char *evarname, *defalt;
2371{
2372 register char *path, *p;
213d0b1f 2373 Lisp_Object lpath, element, tem;
f927c5ae 2374
2447c626
JB
2375 /* It's okay to use getenv here, because this function is only used
2376 to initialize variables when Emacs starts up, and isn't called
2377 after that. */
e065a56e
JB
2378 if (evarname != 0)
2379 path = (char *) getenv (evarname);
2380 else
2381 path = 0;
f927c5ae
JB
2382 if (!path)
2383 path = defalt;
6a30e6d6
RS
2384#ifdef DOS_NT
2385 /* Ensure values from the environment use the proper directory separator. */
2386 if (path)
2387 {
2388 p = alloca (strlen (path) + 1);
2389 strcpy (p, path);
2390 path = p;
2391
2392 if ('/' == DIRECTORY_SEP)
2393 dostounix_filename (path);
2394 else
2395 unixtodos_filename (path);
2396 }
2397#endif
f927c5ae
JB
2398 lpath = Qnil;
2399 while (1)
2400 {
2401 p = index (path, SEPCHAR);
2402 if (!p) p = path + strlen (path);
213d0b1f
RS
2403 element = (p - path ? make_string (path, p - path)
2404 : build_string ("."));
2405
2406 /* Add /: to the front of the name
2407 if it would otherwise be treated as magic. */
2408 tem = Ffind_file_name_handler (element, Qt);
ca3df2d5
RS
2409
2410 /* However, if the handler says "I'm safe",
2411 don't bother adding /:. */
2412 if (SYMBOLP (tem))
2413 {
2414 Lisp_Object prop;
2415 prop = Fget (tem, intern ("safe-magic"));
2416 if (! NILP (prop))
2417 tem = Qnil;
2418 }
2419
213d0b1f
RS
2420 if (! NILP (tem))
2421 element = concat2 (build_string ("/:"), element);
2422
2423 lpath = Fcons (element, lpath);
f927c5ae
JB
2424 if (*p)
2425 path = p + 1;
2426 else
2427 break;
2428 }
2429 return Fnreverse (lpath);
2430}
2431
dfcf069d 2432void
f927c5ae
JB
2433syms_of_emacs ()
2434{
213d0b1f
RS
2435 Qfile_name_handler_alist = intern ("file-name-handler-alist");
2436 staticpro (&Qfile_name_handler_alist);
2437
83591e66 2438#ifndef CANNOT_DUMP
f927c5ae
JB
2439#ifdef HAVE_SHM
2440 defsubr (&Sdump_emacs_data);
2441#else
2442 defsubr (&Sdump_emacs);
83591e66 2443#endif
f927c5ae
JB
2444#endif
2445
2446 defsubr (&Skill_emacs);
2447
59653951 2448 defsubr (&Sinvocation_name);
ace40a69 2449 defsubr (&Sinvocation_directory);
59653951 2450
f927c5ae 2451 DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
2a9d2ed6
RS
2452 doc: /* Args passed by shell to Emacs, as a list of strings.
2453Many arguments are deleted from the list as they are processed. */);
f927c5ae
JB
2454
2455 DEFVAR_LISP ("system-type", &Vsystem_type,
40a8993a
NR
2456 doc: /* Value is symbol indicating type of operating system you are using.
2457Special values:
2458 `gnu/linux' compiled for a GNU/Linux system.
2459 `darwin' compiled for Darwin (GNU-Darwin, Mac OS X, ...).
2460 `macos' compiled for Mac OS 9.
2461 `ms-dos' compiled as an MS-DOS application.
2462 `windows-nt' compiled as a native W32 application.
2463 `cygwin' compiled using the Cygwin library.
2464 `vax-vms' or `axp-vms': compiled for a (Open)VMS system.
2465Anything else indicates some sort of Unix system. */);
f927c5ae
JB
2466 Vsystem_type = intern (SYSTEM_TYPE);
2467
271c7b7c 2468 DEFVAR_LISP ("system-configuration", &Vsystem_configuration,
7db35a48
PJ
2469 doc: /* Value is string indicating configuration Emacs was built for.
2470On MS-Windows, the value reflects the OS flavor and version on which
2471Emacs is running. */);
f7511647 2472 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
271c7b7c 2473
f0fc0b1a 2474 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options,
7db35a48 2475 doc: /* String containing the configuration options Emacs was built with. */);
f0fc0b1a
KH
2476 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2477
f927c5ae 2478 DEFVAR_BOOL ("noninteractive", &noninteractive1,
7db35a48 2479 doc: /* Non-nil means Emacs is running without interactive terminal. */);
e5d77022 2480
e5d77022 2481 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
d77b70e5
MR
2482 doc: /* Hook to be run when kill-emacs is called.
2483Since `kill-emacs' may be invoked when the terminal is disconnected (or
7db35a48
PJ
2484in other similar situations), functions placed on this hook should not
2485expect to be able to interact with the user. To ask for confirmation,
d77b70e5
MR
2486see `kill-emacs-query-functions' instead.
2487
2488The hook is not run in batch mode, i.e., if `noninteractive' is non-nil. */);
edc8ae07 2489 Vkill_emacs_hook = Qnil;
3005da00 2490
f9a6326d
SM
2491 empty_string = build_string ("");
2492 staticpro (&empty_string);
2493
3005da00 2494 DEFVAR_INT ("emacs-priority", &emacs_priority,
7db35a48
PJ
2495 doc: /* Priority for Emacs to run at.
2496This value is effective only if set before Emacs is dumped,
2497and only if the Emacs executable is installed with setuid to permit
2498it to change priority. (Emacs sets its uid back to the real uid.)
2499Currently, you need to define SET_EMACS_PRIORITY in `config.h'
2500before you compile Emacs, to enable the code for this feature. */);
e7a9e1c3 2501 emacs_priority = 0;
074a066b
GV
2502
2503 DEFVAR_LISP ("path-separator", &Vpath_separator,
ddb67bdc 2504 doc: /* The directory separator in search paths, as a string. */);
074a066b
GV
2505 {
2506 char c = SEPCHAR;
2507 Vpath_separator = make_string (&c, 1);
2508 }
59653951 2509
f67de86f 2510 DEFVAR_LISP ("invocation-name", &Vinvocation_name,
7db35a48
PJ
2511 doc: /* The program name that was used to run Emacs.
2512Any directory names are omitted. */);
f67de86f
RS
2513
2514 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory,
7db35a48
PJ
2515 doc: /* The directory in which the Emacs executable was found, to run it.
2516The value is nil if that directory's name is not known. */);
f67de86f
RS
2517
2518 DEFVAR_LISP ("installation-directory", &Vinstallation_directory,
7db35a48
PJ
2519 doc: /* A directory within which to look for the `lib-src' and `etc' directories.
2520This is non-nil when we can't find those directories in their standard
2521installed locations, but we can find them
2522near where the Emacs executable was found. */);
07f4d123 2523 Vinstallation_directory = Qnil;
68c45bf0 2524
ca9c0567 2525 DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale,
7db35a48 2526 doc: /* System locale for messages. */);
ca9c0567 2527 Vsystem_messages_locale = Qnil;
68c45bf0 2528
ca9c0567 2529 DEFVAR_LISP ("previous-system-messages-locale",
7db35a48
PJ
2530 &Vprevious_system_messages_locale,
2531 doc: /* Most recently used system locale for messages. */);
ca9c0567 2532 Vprevious_system_messages_locale = Qnil;
68c45bf0 2533
ca9c0567 2534 DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale,
7db35a48 2535 doc: /* System locale for time. */);
ca9c0567 2536 Vsystem_time_locale = Qnil;
68c45bf0 2537
ca9c0567 2538 DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale,
7db35a48 2539 doc: /* Most recently used system locale for time. */);
ca9c0567 2540 Vprevious_system_time_locale = Qnil;
f927c5ae 2541}
ab5796a9
MB
2542
2543/* arch-tag: 7bfd356a-c720-4612-8ab6-aa4222931c2e
2544 (do not change this comment) */