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