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