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