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