Simplify and avoid signal-handling races.
[bpt/emacs.git] / src / emacs.c
CommitLineData
f927c5ae 1/* Fully extensible Emacs, running on Unix, intended for GNU.
bd6bc222 2
acaf905b 3Copyright (C) 1985-1987, 1993-1995, 1997-1999, 2001-2012
bd6bc222 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 23#include <errno.h>
f927c5ae
JB
24#include <stdio.h>
25
26#include <sys/types.h>
27#include <sys/file.h>
cda4a5fd 28#include <unistd.h>
cda4a5fd 29
01108e3f
PE
30#include <ignore-value.h>
31
0898ca10
JB
32#include "lisp.h"
33
17a2cbbd
DC
34#ifdef HAVE_WINDOW_SYSTEM
35#include TERM_HEADER
36#endif /* HAVE_WINDOW_SYSTEM */
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 50#include "commands.h"
bef79ee4 51#include "intervals.h"
e5560ff7 52#include "character.h"
a08a816a 53#include "buffer.h"
3f6abfd7 54#include "window.h"
f927c5ae 55
edc8ae07 56#include "systty.h"
4d7e6e51 57#include "atimer.h"
6c3a4e9d 58#include "blockinput.h"
8090eb09 59#include "syssignal.h"
6c362a8b 60#include "process.h"
428a555e 61#include "frame.h"
5bda49c6 62#include "termhooks.h"
dfcf069d 63#include "keyboard.h"
e35f6ff7 64#include "keymap.h"
a41f8bed 65
8af55556
TZ
66#ifdef HAVE_GNUTLS
67#include "gnutls.h"
68#endif
69
9e4bf381
PE
70#if (defined PROFILING \
71 && (defined __FreeBSD__ || defined GNU_LINUX || defined __MINGW32__))
72# include <sys/gmon.h>
73extern void moncontrol (int mode);
74#endif
75
68c45bf0
PE
76#ifdef HAVE_SETLOCALE
77#include <locale.h>
78#endif
79
53c58b5d
RS
80#ifdef HAVE_SETRLIMIT
81#include <sys/time.h>
82#include <sys/resource.h>
83#endif
84
dede2792
JD
85#ifdef HAVE_PERSONALITY_LINUX32
86#include <sys/personality.h>
87#endif
88
f927c5ae
JB
89#ifndef O_RDWR
90#define O_RDWR 2
91#endif
92
16fab143 93static const char emacs_version[] = VERSION;
78f83752 94static const char emacs_copyright[] = COPYRIGHT;
8c5ff6dd 95
7e9fa161
JB
96/* Empty lisp strings. To avoid having to build any others. */
97Lisp_Object empty_unibyte_string, empty_multibyte_string;
f9a6326d 98
1882aa38
PE
99/* Set after Emacs has started up the first time.
100 Prevents reinitialization of the Lisp world and keymaps
101 on subsequent starts. */
102bool initialized;
f927c5ae 103
4393663b
JD
104#ifdef DARWIN_OS
105extern void unexec_init_emacs_zone (void);
106#endif
107
15aaf1b5
RS
108#ifdef DOUG_LEA_MALLOC
109/* Preserves a pointer to the memory allocated that copies that
110 static data inside glibc's malloc. */
35f08c38 111static void *malloc_state_ptr;
15aaf1b5 112/* From glibc, a routine that returns a copy of the malloc internal state. */
dd4c5104 113extern void *malloc_get_state (void);
15aaf1b5 114/* From glibc, a routine that overwrites the malloc internal state. */
dd4c5104 115extern int malloc_set_state (void*);
1882aa38 116/* True if the MALLOC_CHECK_ environment variable was set while
7c9cd446 117 dumping. Used to work around a bug in glibc's malloc. */
1882aa38 118static bool malloc_using_checking;
15aaf1b5
RS
119#endif
120
213d0b1f
RS
121Lisp_Object Qfile_name_handler_alist;
122
9dc3366b
GM
123Lisp_Object Qrisky_local_variable;
124
6c07aac2
AS
125Lisp_Object Qkill_emacs;
126
1882aa38 127/* If true, Emacs should not attempt to use a window-specific code,
7db35a48 128 but instead should use the virtual terminal under which it was started. */
1882aa38 129bool inhibit_window_system;
f927c5ae 130
1882aa38 131/* If true, a filter or a sentinel is running. Tested to save the match
7db35a48 132 data on the first attempt to change it inside asynchronous code. */
1882aa38 133bool running_asynch_code;
7074fde6 134
5e617bc2 135#if defined (HAVE_X_WINDOWS) || defined (HAVE_NS)
1882aa38
PE
136/* If true, -d was specified, meaning we're using some window system. */
137bool display_arg;
f927c5ae
JB
138#endif
139
140/* An address near the bottom of the stack.
141 Tells GC how to save a copy of the stack. */
142char *stack_bottom;
143
2949f33b 144#if defined (DOUG_LEA_MALLOC) || defined (GNU_LINUX)
dede2792
JD
145/* The address where the heap starts (from the first sbrk (0) call). */
146static void *my_heap_start;
2949f33b 147#endif
dede2792 148
b312a492 149#ifdef GNU_LINUX
dede2792 150/* The gap between BSS end and heap start as far as we can tell. */
b312a492
PE
151static uprintmax_t heap_bss_diff;
152#endif
dede2792 153
1882aa38
PE
154/* True means running Emacs without interactive terminal. */
155bool noninteractive;
f927c5ae 156
1882aa38
PE
157/* True means remove site-lisp directories from load-path. */
158bool no_site_lisp;
66b7b0fe 159
4ff029f6
DN
160/* Name for the server started by the daemon.*/
161static char *daemon_name;
eab2ee89 162
5790ef40
DN
163/* Pipe used to send exit notification to the daemon parent at
164 startup. */
ff808935 165int daemon_pipe[2];
fc012771 166
e29f86e4
RS
167/* Save argv and argc. */
168char **initial_argv;
169int initial_argc;
081bef73 170
dd4c5104 171static void sort_args (int argc, char **argv);
35f08c38 172static void syms_of_emacs (void);
bd4590ba 173
6b61353c
KH
174/* MSVC needs each string be shorter than 2048 bytes, so the usage
175 strings below are split to not overflow this limit. */
73ebcd25 176#define USAGE1 "\
bd4590ba
GM
177Usage: %s [OPTION-OR-FILENAME]...\n\
178\n\
179Run Emacs, the extensible, customizable, self-documenting real-time\n\
180display editor. The recommended way to start Emacs for normal editing\n\
181is with no options at all.\n\
182\n\
49ca717b 183Run M-x info RET m emacs RET m emacs invocation RET inside Emacs to\n\
bd4590ba
GM
184read the main documentation for these command-line arguments.\n\
185\n\
186Initialization options:\n\
187\n\
6b61353c 188--batch do not do interactive display; implies -q\n\
f63d0028 189--chdir DIR change to directory DIR\n\
598898a7 190--daemon start a server in the background\n\
6b61353c
KH
191--debug-init enable Emacs Lisp debugger for init file\n\
192--display, -d DISPLAY use X server DISPLAY\n\
6b61353c
KH
193--no-desktop do not load a saved desktop\n\
194--no-init-file, -q load neither ~/.emacs nor default.el\n\
195--no-shared-memory, -nl do not use shared memory\n\
196--no-site-file do not load site-start.el\n\
66b7b0fe 197--no-site-lisp, -nsl do not add site-lisp directories to load-path\n\
6b61353c 198--no-splash do not display a splash screen on startup\n\
2ff86b4e 199--no-window-system, -nw do not communicate with X, ignoring $DISPLAY\n\
66b7b0fe
GM
200--quick, -Q equivalent to:\n\
201 -q --no-site-file --no-site-lisp --no-splash\n\
6b61353c
KH
202--script FILE run FILE as an Emacs Lisp script\n\
203--terminal, -t DEVICE use DEVICE for terminal I/O\n\
6b61353c
KH
204--user, -u USER load ~USER/.emacs instead of your own\n\
205\n%s"
206
207#define USAGE2 "\
bd4590ba
GM
208Action options:\n\
209\n\
6b61353c 210FILE visit FILE using find-file\n\
9020b223
GM
211+LINE go to line LINE in next FILE\n\
212+LINE:COLUMN go to line LINE, column COLUMN, in next FILE\n\
6b61353c
KH
213--directory, -L DIR add DIR to variable load-path\n\
214--eval EXPR evaluate Emacs Lisp expression EXPR\n\
215--execute EXPR evaluate Emacs Lisp expression EXPR\n\
216--file FILE visit FILE using find-file\n\
217--find-file FILE visit FILE using find-file\n\
218--funcall, -f FUNC call Emacs Lisp function FUNC with no arguments\n\
219--insert FILE insert contents of FILE into current buffer\n\
220--kill exit without asking for confirmation\n\
221--load, -l FILE load Emacs Lisp FILE using the load function\n\
222--visit FILE visit FILE using find-file\n\
73ebcd25
AI
223\n"
224
6b61353c 225#define USAGE3 "\
5b2ca26b 226Display options:\n\
bd4590ba 227\n\
6b61353c 228--background-color, -bg COLOR window background color\n\
2ff86b4e
NR
229--basic-display, -D disable many display features;\n\
230 used for debugging Emacs\n\
6b61353c
KH
231--border-color, -bd COLOR main border color\n\
232--border-width, -bw WIDTH width of main border\n\
ced74849 233--color, --color=MODE override color mode for character terminals;\n\
62973b41
JB
234 MODE defaults to `auto', and\n\
235 can also be `never', `always',\n\
6b61353c
KH
236 or a mode name like `ansi8'\n\
237--cursor-color, -cr COLOR color of the Emacs cursor indicating point\n\
238--font, -fn FONT default font; must be fixed-width\n\
239--foreground-color, -fg COLOR window foreground color\n\
240--fullheight, -fh make the first frame high as the screen\n\
62973b41 241--fullscreen, -fs make the first frame fullscreen\n\
6b61353c 242--fullwidth, -fw make the first frame wide as the screen\n\
3f1c6666 243--maximized, -mm make the first frame maximized\n\
6b61353c 244--geometry, -g GEOMETRY window geometry\n\
f9e36a6d 245--no-bitmap-icon, -nbi do not use picture of gnu for Emacs icon\n\
6b61353c
KH
246--iconic start Emacs in iconified state\n\
247--internal-border, -ib WIDTH width between text and main border\n\
248--line-spacing, -lsp PIXELS additional space to put between lines\n\
249--mouse-color, -ms COLOR mouse cursor color in Emacs window\n\
250--name NAME title for initial Emacs frame\n\
49ca717b 251--no-blinking-cursor, -nbc disable blinking cursor\n\
6b61353c
KH
252--reverse-video, -r, -rv switch foreground and background\n\
253--title, -T TITLE title for initial Emacs frame\n\
254--vertical-scroll-bars, -vb enable vertical scroll bars\n\
255--xrm XRESOURCES set additional X resources\n\
1540a61a 256--parent-id XID set parent window\n\
6b61353c
KH
257--help display this help and exit\n\
258--version output version information and exit\n\
07beadff
JR
259\n"
260
261#define USAGE4 "\
bd4590ba
GM
262You can generally also specify long option names with a single -; for\n\
263example, -batch as well as --batch. You can use any unambiguous\n\
264abbreviation for a --option.\n\
265\n\
266Various environment variables and window system resources also affect\n\
267Emacs' operation. See the main documentation.\n\
07beadff 268\n\
17284745 269Report bugs to bug-gnu-emacs@gnu.org. First, please see the Bugs\n\
bd4590ba
GM
270section of the Emacs manual or the file BUGS.\n"
271
f927c5ae 272\f
1882aa38
PE
273/* True if handling a fatal error already. */
274bool fatal_error_in_progress;
f927c5ae 275
204ee57f
JD
276#ifdef HAVE_NS
277/* NS autrelease pool, for memory management. */
278static void *ns_pool;
9e4bf381
PE
279#endif
280
204ee57f 281
4fab758d 282
cf29dd84
PE
283/* Report a fatal error due to signal SIG, output a backtrace of at
284 most BACKTRACE_LIMIT lines, and exit. */
285_Noreturn void
4d7e6e51 286terminate_due_to_signal (int sig, int backtrace_limit)
cf29dd84 287{
4d7e6e51 288 totally_unblock_input ();
061b7f94 289
f927c5ae 290 /* If fatal error occurs in code below, avoid infinite recursion. */
8090eb09
JB
291 if (! fatal_error_in_progress)
292 {
293 fatal_error_in_progress = 1;
f927c5ae 294
9c524fcb 295 if (sig == SIGTERM || sig == SIGHUP || sig == SIGINT)
f63d0028
JD
296 Fkill_emacs (make_number (sig));
297
1882aa38 298 shut_down_emacs (sig, Qnil);
cf29dd84 299 emacs_backtrace (backtrace_limit);
8090eb09 300 }
f927c5ae 301
8090eb09 302 /* Signal the same code; this time it will really be fatal.
4d7e6e51
PE
303 Since we're in a signal handler, the signal is blocked, so we
304 have to unblock it if we want to really receive it. */
29b89fe0 305#ifndef MSDOS
2fe28299
PE
306 {
307 sigset_t unblocked;
308 sigemptyset (&unblocked);
4d7e6e51 309 sigaddset (&unblocked, sig);
2fe28299
PE
310 pthread_sigmask (SIG_UNBLOCK, &unblocked, 0);
311 }
29b89fe0 312#endif
4fab758d 313
4d7e6e51 314 emacs_raise (sig);
cf29dd84
PE
315
316 /* This shouldn't be executed, but it prevents a warning. */
317 exit (1);
f927c5ae 318}
271c7b7c
RS
319
320#ifdef SIGDANGER
321
16c323ee 322/* Handler for SIGDANGER. */
20ef56db
PE
323static void
324handle_danger_signal (int sig)
325{
271c7b7c 326 malloc_warning ("Operating system warns that virtual memory is running low.\n");
55796183
RS
327
328 /* It might be unsafe to call do_auto_save now. */
329 force_auto_save_soon ();
271c7b7c 330}
20ef56db
PE
331
332static void
333deliver_danger_signal (int sig)
334{
4d7e6e51 335 deliver_process_signal (sig, handle_danger_signal);
20ef56db 336}
271c7b7c 337#endif
f927c5ae 338\f
7db35a48 339/* Code for dealing with Lisp access to the Unix command line. */
f927c5ae 340
dfcf069d 341static void
dd4c5104 342init_cmdargs (int argc, char **argv, int skip_args)
f927c5ae
JB
343{
344 register int i;
74f10ca7 345 Lisp_Object name, dir, handler;
d311d28c 346 ptrdiff_t count = SPECPDL_INDEX ();
213d0b1f 347 Lisp_Object raw_name;
f927c5ae 348
e29f86e4
RS
349 initial_argv = argv;
350 initial_argc = argc;
351
213d0b1f
RS
352 raw_name = build_string (argv[0]);
353
354 /* Add /: to the front of the name
355 if it would otherwise be treated as magic. */
74f10ca7
PE
356 handler = Ffind_file_name_handler (raw_name, Qt);
357 if (! NILP (handler))
213d0b1f
RS
358 raw_name = concat2 (build_string ("/:"), raw_name);
359
360 Vinvocation_name = Ffile_name_nondirectory (raw_name);
361 Vinvocation_directory = Ffile_name_directory (raw_name);
362
ace40a69
RS
363 /* If we got no directory in argv[0], search PATH to find where
364 Emacs actually came from. */
365 if (NILP (Vinvocation_directory))
366 {
367 Lisp_Object found;
368 int yes = openp (Vexec_path, Vinvocation_name,
10c0915e 369 Vexec_suffixes, &found, make_number (X_OK));
e443f843 370 if (yes == 1)
213d0b1f
RS
371 {
372 /* Add /: to the front of the name
373 if it would otherwise be treated as magic. */
74f10ca7
PE
374 handler = Ffind_file_name_handler (found, Qt);
375 if (! NILP (handler))
213d0b1f
RS
376 found = concat2 (build_string ("/:"), found);
377 Vinvocation_directory = Ffile_name_directory (found);
378 }
ace40a69 379 }
59653951 380
4133b300
RS
381 if (!NILP (Vinvocation_directory)
382 && NILP (Ffile_name_absolute_p (Vinvocation_directory)))
213d0b1f
RS
383 /* Emacs was started with relative path, like ./emacs.
384 Make it absolute. */
4133b300
RS
385 Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, Qnil);
386
07f4d123
RS
387 Vinstallation_directory = Qnil;
388
389 if (!NILP (Vinvocation_directory))
390 {
391 dir = Vinvocation_directory;
76151e2c
EZ
392#ifdef WINDOWSNT
393 /* If we are running from the build directory, set DIR to the
394 src subdirectory of the Emacs tree, like on Posix
395 platforms. */
396 if (SBYTES (dir) > sizeof ("/i386/") - 1
397 && 0 == strcmp (SSDATA (dir) + SBYTES (dir) - sizeof ("/i386/") + 1,
398 "/i386/"))
399 dir = Fexpand_file_name (build_string ("../.."), dir);
400#else /* !WINDOWSNT */
401#endif
07f4d123
RS
402 name = Fexpand_file_name (Vinvocation_name, dir);
403 while (1)
404 {
f5ab9736 405 Lisp_Object tem, lib_src_exists;
07f4d123
RS
406 Lisp_Object etc_exists, info_exists;
407
f5ab9736
RS
408 /* See if dir contains subdirs for use by Emacs.
409 Check for the ones that would exist in a build directory,
410 not including lisp and info. */
411 tem = Fexpand_file_name (build_string ("lib-src"), dir);
412 lib_src_exists = Ffile_exists_p (tem);
de004cc6 413
70344b34 414#ifdef MSDOS
de004cc6
RS
415 /* MSDOS installations frequently remove lib-src, but we still
416 must set installation-directory, or else info won't find
417 its files (it uses the value of installation-directory). */
418 tem = Fexpand_file_name (build_string ("info"), dir);
419 info_exists = Ffile_exists_p (tem);
70344b34
EZ
420#else
421 info_exists = Qnil;
422#endif
de004cc6
RS
423
424 if (!NILP (lib_src_exists) || !NILP (info_exists))
07f4d123 425 {
f5ab9736
RS
426 tem = Fexpand_file_name (build_string ("etc"), dir);
427 etc_exists = Ffile_exists_p (tem);
428 if (!NILP (etc_exists))
07f4d123 429 {
f5ab9736
RS
430 Vinstallation_directory
431 = Ffile_name_as_directory (dir);
432 break;
07f4d123
RS
433 }
434 }
435
436 /* See if dir's parent contains those subdirs. */
f5ab9736
RS
437 tem = Fexpand_file_name (build_string ("../lib-src"), dir);
438 lib_src_exists = Ffile_exists_p (tem);
de004cc6 439
70344b34
EZ
440
441#ifdef MSDOS
442 /* See the MSDOS commentary above. */
de004cc6
RS
443 tem = Fexpand_file_name (build_string ("../info"), dir);
444 info_exists = Ffile_exists_p (tem);
70344b34
EZ
445#else
446 info_exists = Qnil;
447#endif
de004cc6
RS
448
449 if (!NILP (lib_src_exists) || !NILP (info_exists))
07f4d123 450 {
f5ab9736
RS
451 tem = Fexpand_file_name (build_string ("../etc"), dir);
452 etc_exists = Ffile_exists_p (tem);
453 if (!NILP (etc_exists))
07f4d123 454 {
f5ab9736
RS
455 tem = Fexpand_file_name (build_string (".."), dir);
456 Vinstallation_directory
457 = Ffile_name_as_directory (tem);
458 break;
07f4d123
RS
459 }
460 }
461
462 /* If the Emacs executable is actually a link,
463 next try the dir that the link points into. */
464 tem = Ffile_symlink_p (name);
465 if (!NILP (tem))
466 {
260ec24d 467 name = Fexpand_file_name (tem, dir);
07f4d123
RS
468 dir = Ffile_name_directory (name);
469 }
470 else
471 break;
472 }
473 }
474
f927c5ae
JB
475 Vcommand_line_args = Qnil;
476
477 for (i = argc - 1; i >= 0; i--)
478 {
479 if (i == 0 || i > skip_args)
a520393d
KH
480 /* For the moment, we keep arguments as is in unibyte strings.
481 They are decoded in the function command-line after we know
482 locale-coding-system. */
f927c5ae 483 Vcommand_line_args
68db37aa 484 = Fcons (make_unibyte_string (argv[i], strlen (argv[i])),
a520393d 485 Vcommand_line_args);
f927c5ae 486 }
213d0b1f
RS
487
488 unbind_to (count, Qnil);
f927c5ae 489}
59653951
JB
490
491DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
7db35a48
PJ
492 doc: /* Return the program name that was used to run Emacs.
493Any directory names are omitted. */)
5842a27b 494 (void)
59653951
JB
495{
496 return Fcopy_sequence (Vinvocation_name);
497}
498
ace40a69 499DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
7db35a48
PJ
500 0, 0, 0,
501 doc: /* Return the directory name in which the Emacs executable was located. */)
5842a27b 502 (void)
ace40a69
RS
503{
504 return Fcopy_sequence (Vinvocation_directory);
505}
506
f927c5ae 507\f
0269dedb
RS
508#ifdef HAVE_TZSET
509/* A valid but unlikely value for the TZ environment value.
510 It is OK (though a bit slower) if the user actually chooses this value. */
511static char dump_tz[] = "UtC0";
512#endif
513
a90538cb 514#ifndef ORDINARY_LINK
efd241cc
RS
515/* We don't include crtbegin.o and crtend.o in the link,
516 so these functions and variables might be missed.
517 Provide dummy definitions to avoid error.
518 (We don't have any real constructors or destructors.) */
519#ifdef __GNUC__
244fc23d
PE
520
521/* Define a dummy function F. Declare F too, to pacify gcc
522 -Wmissing-prototypes. */
35f08c38 523#define DEFINE_DUMMY_FUNCTION(f) \
5994c183 524 void f (void) ATTRIBUTE_CONST EXTERNALLY_VISIBLE; void f (void) {}
244fc23d 525
46e65b73 526#ifndef GCC_CTORS_IN_LIBC
244fc23d
PE
527DEFINE_DUMMY_FUNCTION (__do_global_ctors)
528DEFINE_DUMMY_FUNCTION (__do_global_ctors_aux)
529DEFINE_DUMMY_FUNCTION (__do_global_dtors)
554061d8 530/* GNU/Linux has a bug in its library; avoid an error. */
8a2a6032 531#ifndef GNU_LINUX
35f08c38 532char * __CTOR_LIST__[2] EXTERNALLY_VISIBLE = { (char *) (-1), 0 };
64c1864a 533#endif
35f08c38 534char * __DTOR_LIST__[2] EXTERNALLY_VISIBLE = { (char *) (-1), 0 };
46e65b73 535#endif /* GCC_CTORS_IN_LIBC */
244fc23d 536DEFINE_DUMMY_FUNCTION (__main)
efd241cc 537#endif /* __GNUC__ */
a90538cb 538#endif /* ORDINARY_LINK */
efd241cc 539
e2925360
KH
540/* Test whether the next argument in ARGV matches SSTR or a prefix of
541 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
542 (the argument is supposed to have a value) store in *VALPTR either
543 the next argument or the portion of this one after the equal sign.
544 ARGV is read starting at position *SKIPPTR; this index is advanced
545 by the number of arguments used.
546
547 Too bad we can't just use getopt for all of this, but we don't have
548 enough information to do it right. */
081bef73 549
1882aa38 550static bool
62973b41
JB
551argmatch (char **argv, int argc, const char *sstr, const char *lstr,
552 int minlen, char **valptr, int *skipptr)
e2925360 553{
6bbd7a29 554 char *p = NULL;
0b963a93 555 ptrdiff_t arglen;
df6530f8
RS
556 char *arg;
557
558 /* Don't access argv[argc]; give up in advance. */
559 if (argc <= *skipptr + 1)
560 return 0;
561
562 arg = argv[*skipptr+1];
e2925360
KH
563 if (arg == NULL)
564 return 0;
565 if (strcmp (arg, sstr) == 0)
566 {
567 if (valptr != NULL)
568 {
569 *valptr = argv[*skipptr+2];
570 *skipptr += 2;
571 }
572 else
573 *skipptr += 1;
574 return 1;
575 }
8966b757 576 arglen = (valptr != NULL && (p = strchr (arg, '=')) != NULL
e2925360 577 ? p - arg : strlen (arg));
c03e1113 578 if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
e2925360
KH
579 return 0;
580 else if (valptr == NULL)
581 {
582 *skipptr += 1;
583 return 1;
584 }
585 else if (p != NULL)
586 {
587 *valptr = p+1;
588 *skipptr += 1;
589 return 1;
590 }
591 else if (argv[*skipptr+2] != NULL)
592 {
593 *valptr = argv[*skipptr+2];
594 *skipptr += 2;
595 return 1;
596 }
597 else
598 {
599 return 0;
600 }
601}
602
b6779252 603#ifdef DOUG_LEA_MALLOC
f927c5ae 604
b6779252
KH
605/* malloc can be invoked even before main (e.g. by the dynamic
606 linker), so the dumped malloc state must be restored as early as
607 possible using this special hook. */
608
609static void
dd4c5104 610malloc_initialize_hook (void)
b6779252 611{
15aaf1b5
RS
612 if (initialized)
613 {
7c9cd446
AS
614 if (!malloc_using_checking)
615 /* Work around a bug in glibc's malloc. MALLOC_CHECK_ must be
616 ignored if the heap to be restored was constructed without
d942e12a
AS
617 malloc checking. Can't use unsetenv, since that calls malloc. */
618 {
619 char **p;
620
a57c4026 621 for (p = environ; p && *p; p++)
d942e12a
AS
622 if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0)
623 {
624 do
625 *p = p[1];
626 while (*++p);
627 break;
628 }
629 }
b6779252 630
15aaf1b5 631 malloc_set_state (malloc_state_ptr);
68db37aa 632#ifndef XMALLOC_OVERRUN_CHECK
15aaf1b5 633 free (malloc_state_ptr);
68db37aa 634#endif
15aaf1b5 635 }
7c9cd446 636 else
dede2792
JD
637 {
638 if (my_heap_start == 0)
639 my_heap_start = sbrk (0);
640 malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL;
641 }
b6779252
KH
642}
643
698d32e2 644void (*__malloc_initialize_hook) (void) EXTERNALLY_VISIBLE = malloc_initialize_hook;
b6779252
KH
645
646#endif /* DOUG_LEA_MALLOC */
647
d883731c 648
b6779252
KH
649/* ARGSUSED */
650int
7c2fb837 651main (int argc, char **argv)
b6779252 652{
2313132f 653#if GC_MARK_STACK
39ec21ea
GM
654 Lisp_Object dummy;
655#endif
b6779252 656 char stack_bottom_variable;
1882aa38 657 bool do_initial_setlocale;
4d7e6e51 658 bool dumping;
b6779252 659 int skip_args = 0;
b6779252
KH
660#ifdef HAVE_SETRLIMIT
661 struct rlimit rlim;
662#endif
1882aa38 663 bool no_loadup = 0;
6e910e07 664 char *junk = 0;
4ff029f6 665 char *dname_arg = 0;
b3243e6f
AR
666#ifdef NS_IMPL_COCOA
667 char dname_arg2[80];
668#endif
f63d0028 669 char *ch_to_dir;
b6779252 670
2313132f 671#if GC_MARK_STACK
39ec21ea
GM
672 stack_base = &dummy;
673#endif
674
a4ef73c8
CY
675#if defined (USE_GTK) && defined (G_SLICE_ALWAYS_MALLOC)
676 /* This is used by the Cygwin build. */
677 setenv ("G_SLICE", "always-malloc", 1);
678#endif
679
b312a492 680#ifdef GNU_LINUX
dede2792
JD
681 if (!initialized)
682 {
683 extern char my_endbss[];
684 extern char *my_endbss_static;
685
686 if (my_heap_start == 0)
687 my_heap_start = sbrk (0);
688
689 heap_bss_diff = (char *)my_heap_start - max (my_endbss, my_endbss_static);
690 }
b312a492 691#endif
dede2792 692
d785cf9e
RS
693#ifdef RUN_TIME_REMAP
694 if (initialized)
695 run_time_remap (argv[0]);
696#endif
697
14145fa3
AR
698/* If using unexmacosx.c (set by s/darwin.h), we must do this. */
699#ifdef DARWIN_OS
e0f712ba
AC
700 if (!initialized)
701 unexec_init_emacs_zone ();
702#endif
703
081bef73 704 sort_args (argc, argv);
956e3c7e
RS
705 argc = 0;
706 while (argv[argc]) argc++;
081bef73 707
8c5ff6dd 708 if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args))
1702afef 709 {
8c5ff6dd
KR
710 const char *version, *copyright;
711 if (initialized)
5cf9ca93 712 {
8c5ff6dd
KR
713 Lisp_Object tem, tem2;
714 tem = Fsymbol_value (intern_c_string ("emacs-version"));
715 tem2 = Fsymbol_value (intern_c_string ("emacs-copyright"));
716 if (!STRINGP (tem))
717 {
718 fprintf (stderr, "Invalid value of `emacs-version'\n");
719 exit (1);
720 }
721 if (!STRINGP (tem2))
722 {
723 fprintf (stderr, "Invalid value of `emacs-copyright'\n");
724 exit (1);
725 }
726 else
727 {
42a5b22f
PE
728 version = SSDATA (tem);
729 copyright = SSDATA (tem2);
8c5ff6dd 730 }
5cf9ca93 731 }
1702afef
RS
732 else
733 {
8c5ff6dd
KR
734 version = emacs_version;
735 copyright = emacs_copyright;
1702afef 736 }
8c5ff6dd
KR
737 printf ("GNU Emacs %s\n", version);
738 printf ("%s\n", copyright);
739 printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
740 printf ("You may redistribute copies of Emacs\n");
741 printf ("under the terms of the GNU General Public License.\n");
742 printf ("For more information about these matters, ");
743 printf ("see the file named COPYING.\n");
744 exit (0);
1702afef 745 }
947f5e01
JM
746
747 if (argmatch (argv, argc, "-chdir", "--chdir", 4, &ch_to_dir, &skip_args))
748 if (chdir (ch_to_dir) == -1)
749 {
750 fprintf (stderr, "%s: Can't chdir to %s: %s\n",
751 argv[0], ch_to_dir, strerror (errno));
752 exit (1);
753 }
f63d0028 754
4d7e6e51
PE
755 dumping = !initialized && (strcmp (argv[argc - 1], "dump") == 0
756 || strcmp (argv[argc - 1], "bootstrap") == 0);
1702afef 757
dede2792 758#ifdef HAVE_PERSONALITY_LINUX32
4d7e6e51 759 if (dumping && ! getenv ("EMACS_HEAP_EXEC"))
dede2792 760 {
42ca4633 761 static char heapexec[] = "EMACS_HEAP_EXEC=true";
fd75ddb2 762 /* Set this so we only do this once. */
5e617bc2 763 putenv (heapexec);
711877f3 764
fd75ddb2
JD
765 /* A flag to turn off address randomization which is introduced
766 in linux kernel shipped with fedora core 4 */
711877f3 767#define ADD_NO_RANDOMIZE 0x0040000
fd75ddb2 768 personality (PER_LINUX32 | ADD_NO_RANDOMIZE);
711877f3
MY
769#undef ADD_NO_RANDOMIZE
770
fd75ddb2 771 execvp (argv[0], argv);
dede2792 772
fd75ddb2
JD
773 /* If the exec fails, try to dump anyway. */
774 perror ("execvp");
dede2792
JD
775 }
776#endif /* HAVE_PERSONALITY_LINUX32 */
777
ea2acec5 778#if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
6c2935e9
RS
779 /* Extend the stack space available.
780 Don't do that if dumping, since some systems (e.g. DJGPP)
781 might define a smaller stack limit at that time. */
782 if (1
783#ifndef CANNOT_DUMP
784 && (!noninteractive || initialized)
785#endif
786 && !getrlimit (RLIMIT_STACK, &rlim))
53c58b5d 787 {
509a8fcd 788 long newlim;
fa8459a3 789 extern size_t re_max_failures;
03effc23
KH
790 /* Approximate the amount regex.c needs per unit of re_max_failures. */
791 int ratio = 20 * sizeof (char *);
792 /* Then add 33% to cover the size of the smaller stacks that regex.c
793 successively allocates and discards, on its way to the maximum. */
794 ratio += ratio / 3;
795 /* Add in some extra to cover
796 what we're likely to use for other reasons. */
797 newlim = re_max_failures * ratio + 200000;
d0381a7f
RS
798#ifdef __NetBSD__
799 /* NetBSD (at least NetBSD 1.2G and former) has a bug in its
800 stack allocation routine for new process that the allocation
801 fails if stack limit is not on page boundary. So, round up the
802 new limit to page boundary. */
5e617bc2 803 newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize ();
d0381a7f 804#endif
509a8fcd 805 if (newlim > rlim.rlim_max)
6c2935e9
RS
806 {
807 newlim = rlim.rlim_max;
03effc23
KH
808 /* Don't let regex.c overflow the stack we have. */
809 re_max_failures = (newlim - 200000) / ratio;
6c2935e9 810 }
509a8fcd
RS
811 if (rlim.rlim_cur < newlim)
812 rlim.rlim_cur = newlim;
813
53c58b5d
RS
814 setrlimit (RLIMIT_STACK, &rlim);
815 }
ea2acec5 816#endif /* HAVE_SETRLIMIT and RLIMIT_STACK */
53c58b5d 817
f927c5ae
JB
818 /* Record (approximately) where the stack begins. */
819 stack_bottom = &stack_bottom_variable;
820
f927c5ae 821 clearerr (stdin);
9ae8f997 822
f927c5ae 823#ifndef SYSTEM_MALLOC
bf7f4e90
RS
824 /* Arrange to get warning messages as memory fills up. */
825 memory_warnings (0, malloc_warning);
9ac0d9e0 826
0caaedb1 827 /* Call malloc at least once, to run malloc_initialize_hook.
f5a3c8c4
AI
828 Also call realloc and free for consistency. */
829 free (realloc (malloc (4), 4));
bf7f4e90 830
f927c5ae
JB
831#endif /* not SYSTEM_MALLOC */
832
edd3ff1d 833#if defined (MSDOS) || defined (WINDOWSNT)
29b89fe0
RS
834 /* We do all file input/output as binary files. When we need to translate
835 newlines, we do that manually. */
836 _fmode = O_BINARY;
edd3ff1d 837#endif /* MSDOS || WINDOWSNT */
18198bb2 838
edd3ff1d 839#ifdef MSDOS
18198bb2
RS
840 if (!isatty (fileno (stdin)))
841 setmode (fileno (stdin), O_BINARY);
842 if (!isatty (fileno (stdout)))
843 {
844 fflush (stdout);
845 setmode (fileno (stdout), O_BINARY);
846 }
29b89fe0
RS
847#endif /* MSDOS */
848
68c45bf0
PE
849 /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
850 The build procedure uses this while dumping, to ensure that the
851 dumped Emacs does not have its system locale tables initialized,
852 as that might cause screwups when the dumped Emacs starts up. */
853 {
854 char *lc_all = getenv ("LC_ALL");
855 do_initial_setlocale = ! lc_all || strcmp (lc_all, "C");
856 }
857
858 /* Set locale now, so that initial error messages are localized properly.
859 fixup_locale must wait until later, since it builds strings. */
860 if (do_initial_setlocale)
861 setlocale (LC_ALL, "");
862
f927c5ae
JB
863 inhibit_window_system = 0;
864
7db35a48 865 /* Handle the -t switch, which specifies filename to use as terminal. */
956e3c7e
RS
866 while (1)
867 {
868 char *term;
869 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
870 {
871 int result;
68c45bf0
PE
872 emacs_close (0);
873 emacs_close (1);
874 result = emacs_open (term, O_RDWR, 0);
9055082e 875 if (result < 0 || dup (0) < 0)
956e3c7e
RS
876 {
877 char *errstring = strerror (errno);
186486eb 878 fprintf (stderr, "%s: %s: %s\n", argv[0], term, errstring);
956e3c7e
RS
879 exit (1);
880 }
956e3c7e
RS
881 if (! isatty (0))
882 {
186486eb 883 fprintf (stderr, "%s: %s: not a tty\n", argv[0], term);
956e3c7e
RS
884 exit (1);
885 }
886 fprintf (stderr, "Using %s\n", term);
8ba50e1a 887#ifdef HAVE_WINDOW_SYSTEM
956e3c7e 888 inhibit_window_system = 1; /* -t => -nw */
f927c5ae 889#endif
956e3c7e
RS
890 }
891 else
892 break;
893 }
894
400d6fa9 895 /* Command line option --no-windows is deprecated and thus not mentioned
333f9019 896 in the manual and usage information. */
400d6fa9
PJ
897 if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args)
898 || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
e2925360 899 inhibit_window_system = 1;
f927c5ae 900
e2925360 901 /* Handle the -batch switch, which means don't do interactive display. */
f927c5ae 902 noninteractive = 0;
df6530f8 903 if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
55f4edbc
RS
904 {
905 noninteractive = 1;
906 Vundo_outer_limit = Qnil;
907 }
6e910e07
RS
908 if (argmatch (argv, argc, "-script", "--script", 3, &junk, &skip_args))
909 {
910 noninteractive = 1; /* Set batch mode. */
21a4ff8e 911 /* Convert --script to -scriptload, un-skip it, and sort again
e09b9180 912 so that it will be handled in proper sequence. */
a09a5b5b 913 /* FIXME broken for --script=FILE - is that supposed to work? */
c03cd23f 914 argv[skip_args - 1] = (char *) "-scriptload";
6e910e07
RS
915 skip_args -= 2;
916 sort_args (argc, argv);
917 }
e2925360 918
7db35a48 919 /* Handle the --help option, which gives a usage message. */
df6530f8 920 if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
f927c5ae 921 {
6b61353c
KH
922 printf (USAGE1, argv[0], USAGE2);
923 printf (USAGE3);
17284745 924 printf (USAGE4);
e2925360 925 exit (0);
f927c5ae
JB
926 }
927
4ff029f6
DN
928 if (argmatch (argv, argc, "-daemon", "--daemon", 5, NULL, &skip_args)
929 || argmatch (argv, argc, "-daemon", "--daemon", 5, &dname_arg, &skip_args))
eab2ee89 930 {
9d29095c 931#ifndef DOS_NT
5790ef40
DN
932 pid_t f;
933
934 /* Start as a daemon: fork a new child process which will run the
935 rest of the initialization code, then exit.
936
fc012771
SM
937 Detaching a daemon requires the following steps:
938 - fork
939 - setsid
940 - exit the parent
941 - close the tty file-descriptors
942
943 We only want to do the last 2 steps once the daemon is ready to
944 serve requests, i.e. after loading .emacs (initialization).
945 OTOH initialization may start subprocesses (e.g. ispell) and these
946 should be run from the proper process (the one that will end up
947 running as daemon) and with the proper "session id" in order for
948 them to keep working after detaching, so fork and setsid need to be
949 performed before initialization.
950
5790ef40
DN
951 We want to avoid exiting before the server socket is ready, so
952 use a pipe for synchronization. The parent waits for the child
953 to close its end of the pipe (using `daemon-initialized')
954 before exiting. */
955 if (pipe (daemon_pipe) == -1)
956 {
957 fprintf (stderr, "Cannot pipe!\n");
958 exit (1);
959 }
960
b3243e6f 961#ifndef NS_IMPL_COCOA
8b3115e7
DN
962#ifdef USE_GTK
963 fprintf (stderr, "\nWarning: due to a long standing Gtk+ bug\nhttp://bugzilla.gnome.org/show_bug.cgi?id=85715\n\
964Emacs might crash when run in daemon mode and the X11 connection is unexpectedly lost.\n\
965Using an Emacs configured with --with-x-toolkit=lucid does not have this problem.\n");
966#endif
5790ef40 967 f = fork ();
cfa6accb
AR
968#else /* NS_IMPL_COCOA */
969 /* Under Cocoa we must do fork+exec as CoreFoundation lib fails in
970 forked process: http://developer.apple.com/ReleaseNotes/
971 CoreFoundation/CoreFoundation.html)
b3243e6f
AR
972 We mark being in the exec'd process by a daemon name argument of
973 form "--daemon=\nFD0,FD1\nNAME" where FD are the pipe file descriptors,
974 NAME is the original daemon name, if any. */
975 if (!dname_arg || !strchr (dname_arg, '\n'))
976 f = fork (); /* in orig */
977 else
978 f = 0; /* in exec'd */
cfa6accb 979#endif /* NS_IMPL_COCOA */
eab2ee89 980 if (f > 0)
5790ef40
DN
981 {
982 int retval;
983 char buf[1];
984
985 /* Close unused writing end of the pipe. */
986 close (daemon_pipe[1]);
987
988 /* Just wait for the child to close its end of the pipe. */
989 do
990 {
991 retval = read (daemon_pipe[0], &buf, 1);
992 }
993 while (retval == -1 && errno == EINTR);
994
995 if (retval < 0)
996 {
997 fprintf (stderr, "Error reading status from child\n");
998 exit (1);
999 }
fd95644b
DN
1000 else if (retval == 0)
1001 {
1002 fprintf (stderr, "Error: server did not start correctly\n");
1003 exit (1);
1004 }
5790ef40
DN
1005
1006 close (daemon_pipe[0]);
1007 exit (0);
1008 }
eab2ee89
DN
1009 if (f < 0)
1010 {
1011 fprintf (stderr, "Cannot fork!\n");
9d0a6e42 1012 exit (1);
eab2ee89
DN
1013 }
1014
b3243e6f
AR
1015#ifdef NS_IMPL_COCOA
1016 {
cfa6accb 1017 /* In orig process, forked as child, OR in exec'd. */
b3243e6f 1018 if (!dname_arg || !strchr (dname_arg, '\n'))
cfa6accb 1019 { /* In orig, child: now exec w/special daemon name. */
b3243e6f 1020 char fdStr[80];
66c6fdd5
PE
1021 int fdStrlen =
1022 snprintf (fdStr, sizeof fdStr,
1023 "--daemon=\n%d,%d\n%s", daemon_pipe[0],
1024 daemon_pipe[1], dname_arg ? dname_arg : "");
b3243e6f 1025
66c6fdd5 1026 if (! (0 <= fdStrlen && fdStrlen < sizeof fdStr))
b3243e6f
AR
1027 {
1028 fprintf (stderr, "daemon: child name too long\n");
1029 exit (1);
1030 }
1031
b3243e6f
AR
1032 argv[skip_args] = fdStr;
1033
1034 execv (argv[0], argv);
cff11156 1035 fprintf (stderr, "emacs daemon: exec failed: %d\n", errno);
b3243e6f
AR
1036 exit (1);
1037 }
1038
cfa6accb 1039 /* In exec'd: parse special dname into pipe and name info. */
b3243e6f
AR
1040 if (!dname_arg || !strchr (dname_arg, '\n')
1041 || strlen (dname_arg) < 1 || strlen (dname_arg) > 70)
1042 {
1043 fprintf (stderr, "emacs daemon: daemon name absent or too long\n");
5e617bc2 1044 exit (1);
b3243e6f
AR
1045 }
1046 dname_arg2[0] = '\0';
1047 sscanf (dname_arg, "\n%d,%d\n%s", &(daemon_pipe[0]), &(daemon_pipe[1]),
1048 dname_arg2);
0b963a93 1049 dname_arg = *dname_arg2 ? dname_arg2 : NULL;
b3243e6f 1050 }
cfa6accb 1051#endif /* NS_IMPL_COCOA */
b3243e6f 1052
4ff029f6
DN
1053 if (dname_arg)
1054 daemon_name = xstrdup (dname_arg);
5790ef40
DN
1055 /* Close unused reading end of the pipe. */
1056 close (daemon_pipe[0]);
7c19d3ae
DN
1057 /* Make sure that the used end of the pipe is closed on exec, so
1058 that it is not accessible to programs started from .emacs. */
1059 fcntl (daemon_pipe[1], F_SETFD, FD_CLOEXEC);
1060
eab2ee89 1061#ifdef HAVE_SETSID
5e617bc2 1062 setsid ();
eab2ee89 1063#endif
eab2ee89 1064#else /* DOS_NT */
9d29095c
DN
1065 fprintf (stderr, "This platform does not support the -daemon flag.\n");
1066 exit (1);
eab2ee89 1067#endif /* DOS_NT */
9d29095c 1068 }
eab2ee89 1069
edb85f59
RS
1070 if (! noninteractive)
1071 {
edb85f59
RS
1072#if defined (USG5) && defined (INTERRUPT_INPUT)
1073 setpgrp ();
1074#endif
ae9e757a 1075#if defined (HAVE_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC)
5467331d 1076 {
f57e2426 1077 extern void malloc_enable_thread (void);
5467331d
YM
1078
1079 malloc_enable_thread ();
1080 }
edb85f59
RS
1081#endif
1082 }
1083
4d7e6e51 1084 init_signals (dumping);
f927c5ae
JB
1085
1086 noninteractive1 = noninteractive;
1087
7db35a48 1088/* Perform basic initializations (not merely interning symbols). */
f927c5ae
JB
1089
1090 if (!initialized)
1091 {
1092 init_alloc_once ();
1093 init_obarray ();
1094 init_eval_once ();
270ce821
KH
1095 init_charset_once ();
1096 init_coding_once ();
f927c5ae 1097 init_syntax_once (); /* Create standard syntax table. */
270ce821 1098 init_category_once (); /* Create standard category table. */
7db35a48 1099 /* Must be done before init_buffer. */
f927c5ae 1100 init_casetab_once ();
7db35a48
PJ
1101 init_buffer_once (); /* Create buffer table and some buffers. */
1102 init_minibuf_once (); /* Create list of minibuffers. */
1103 /* Must precede init_window_once. */
1104
90d920b6
GM
1105 /* Call syms_of_xfaces before init_window_once because that
1106 function creates Vterminal_frame. Termcap frames now use
1107 faces, and the face implementation uses some symbols as
1108 face names. */
90d920b6 1109 syms_of_xfaces ();
4ea81208
KL
1110 /* XXX syms_of_keyboard uses some symbols in keymap.c. It would
1111 be better to arrange things not to have this dependency. */
1112 syms_of_keymap ();
7a18af49
KR
1113 /* Call syms_of_keyboard before init_window_once because
1114 keyboard sets up symbols that include some face names that
1115 the X support will want to use. This can happen when
1116 CANNOT_DUMP is defined. */
1117 syms_of_keyboard ();
90d920b6 1118
985773c9
MB
1119 /* Called before syms_of_fileio, because it sets up Qerror_condition. */
1120 syms_of_data ();
1121 syms_of_fileio ();
1122 /* Before syms_of_coding to initialize Vgc_cons_threshold. */
1123 syms_of_alloc ();
1124 /* Before syms_of_coding because it initializes Qcharsetp. */
1125 syms_of_charset ();
1126 /* Before init_window_once, because it sets up the
1127 Vcoding_system_hash_table. */
1128 syms_of_coding (); /* This should be after syms_of_fileio. */
1a578e9b 1129
7db35a48 1130 init_window_once (); /* Init the window system. */
6b61353c
KH
1131#ifdef HAVE_WINDOW_SYSTEM
1132 init_fringe_once (); /* Swap bitmaps if necessary. */
1133#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae
JB
1134 }
1135
1136 init_alloc ();
68c45bf0
PE
1137
1138 if (do_initial_setlocale)
1139 {
1140 fixup_locale ();
ca9c0567
PE
1141 Vsystem_messages_locale = Vprevious_system_messages_locale;
1142 Vsystem_time_locale = Vprevious_system_time_locale;
68c45bf0
PE
1143 }
1144
f927c5ae 1145 init_eval ();
ab5d0358 1146 init_atimer ();
7074fde6 1147 running_asynch_code = 0;
0e23ef9d 1148 init_random ();
0e956009 1149
956e3c7e 1150 no_loadup
b96f9fb7 1151 = argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
956e3c7e 1152
66b7b0fe
GM
1153 no_site_lisp
1154 = argmatch (argv, argc, "-nsl", "--no-site-lisp", 11, NULL, &skip_args);
1155
edfda783 1156#ifdef HAVE_NS
204ee57f 1157 ns_pool = ns_alloc_autorelease_pool ();
edfda783
AR
1158 if (!noninteractive)
1159 {
edfda783
AR
1160#ifdef NS_IMPL_COCOA
1161 if (skip_args < argc)
1162 {
32299e33
PE
1163 /* FIXME: Do the right thing if getenv returns NULL, or if
1164 chdir fails. */
5e617bc2 1165 if (!strncmp (argv[skip_args], "-psn", 4))
edfda783
AR
1166 {
1167 skip_args += 1;
3d0a4431 1168 chdir (getenv ("HOME"));
edfda783 1169 }
5e617bc2 1170 else if (skip_args+1 < argc && !strncmp (argv[skip_args+1], "-psn", 4))
edfda783 1171 {
95889848 1172 skip_args += 2;
3d0a4431 1173 chdir (getenv ("HOME"));
edfda783
AR
1174 }
1175 }
9b68317c 1176#endif /* COCOA */
edfda783
AR
1177 }
1178#endif /* HAVE_NS */
1179
956e3c7e
RS
1180#ifdef HAVE_X_WINDOWS
1181 /* Stupid kludge to catch command-line display spec. We can't
1182 handle this argument entirely in window system dependent code
1183 because we don't even know which window system dependent code
1184 to run until we've recognized this argument. */
1185 {
1186 char *displayname = 0;
956e3c7e
RS
1187 int count_before = skip_args;
1188
1189 /* Skip any number of -d options, but only use the last one. */
1190 while (1)
1191 {
1192 int count_before_this = skip_args;
1193
1194 if (argmatch (argv, argc, "-d", "--display", 3, &displayname, &skip_args))
1195 display_arg = 1;
1196 else if (argmatch (argv, argc, "-display", 0, 3, &displayname, &skip_args))
1197 display_arg = 1;
1198 else
1199 break;
1200
1201 count_before = count_before_this;
1202 }
1203
1204 /* If we have the form --display=NAME,
1205 convert it into -d name.
1206 This requires inserting a new element into argv. */
0065d054 1207 if (displayname && count_before < skip_args)
956e3c7e 1208 {
0065d054
PE
1209 if (skip_args == count_before + 1)
1210 {
1211 memmove (argv + count_before + 3, argv + count_before + 2,
1212 (argc - (count_before + 2)) * sizeof *argv);
1213 argv[count_before + 2] = displayname;
1214 argc++;
1215 }
1216 argv[count_before + 1] = (char *) "-d";
956e3c7e 1217 }
956e3c7e 1218
66b7b0fe
GM
1219 if (! no_site_lisp)
1220 {
1221 if (argmatch (argv, argc, "-Q", "--quick", 3, NULL, &skip_args)
1222 || argmatch (argv, argc, "-quick", 0, 2, NULL, &skip_args))
1223 no_site_lisp = 1;
1224 }
1225
956e3c7e
RS
1226 /* Don't actually discard this arg. */
1227 skip_args = count_before;
1228 }
66b7b0fe
GM
1229#else /* !HAVE_X_WINDOWS */
1230 if (! no_site_lisp)
1231 {
1232 int count_before = skip_args;
1233
1234 if (argmatch (argv, argc, "-Q", "--quick", 3, NULL, &skip_args)
1235 || argmatch (argv, argc, "-quick", 0, 2, NULL, &skip_args))
1236 no_site_lisp = 1;
1237
1238 skip_args = count_before;
1239 }
956e3c7e
RS
1240#endif
1241
1242 /* argmatch must not be used after here,
91af3942 1243 except when building temacs
956e3c7e
RS
1244 because the -d argument has not been skipped in skip_args. */
1245
29b89fe0
RS
1246#ifdef MSDOS
1247 /* Call early 'cause init_environment needs it. */
1248 init_dosfns ();
1249 /* Set defaults for several environment variables. */
18198bb2
RS
1250 if (initialized)
1251 init_environment (argc, argv, skip_args);
1252 else
d1fc6752 1253 tzset ();
18198bb2 1254#endif /* MSDOS */
29b89fe0 1255
8ba50e1a 1256#ifdef WINDOWSNT
9785d95b 1257 globals_of_w32 ();
8ba50e1a 1258 /* Initialize environment from registry settings. */
a3a58294 1259 init_environment (argv);
7db35a48 1260 init_ntproc (); /* must precede init_editfns. */
8ba50e1a
GV
1261#endif
1262
8b4eb796
KR
1263 /* Initialize and GC-protect Vinitial_environment and
1264 Vprocess_environment before set_initial_environment fills them
1265 in. */
1266 if (!initialized)
1267 syms_of_callproc ();
0e956009
JB
1268 /* egetenv is a pretty low-level facility, which may get called in
1269 many circumstances; it seems flimsy to put off initializing it
738db178 1270 until calling init_callproc. Do not do it when dumping. */
4d7e6e51 1271 if (! dumping)
738db178
DN
1272 set_initial_environment ();
1273
93aed04d 1274 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
5990851d
KL
1275 if this is not done. Do it after set_global_environment so that we
1276 don't pollute Vglobal_environment. */
fa09a82d 1277 /* Setting LANG here will defeat the startup locale processing... */
f2a77c3a 1278#ifdef AIX
93aed04d
RS
1279 putenv ("LANG=C");
1280#endif
0e956009 1281
7db35a48 1282 init_buffer (); /* Init default directory of main buffer. */
ace40a69 1283
7928f0b5 1284 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
ace40a69 1285 init_cmdargs (argc, argv, skip_args); /* Must precede init_lread. */
380e25b8
RS
1286
1287 if (initialized)
1288 {
7db35a48 1289 /* Erase any pre-dump messages in the message log, to avoid confusion. */
380e25b8
RS
1290 Lisp_Object old_log_max;
1291 old_log_max = Vmessage_log_max;
1292 XSETFASTINT (Vmessage_log_max, 0);
f6fe7bb5 1293 message_dolog ("", 0, 1, 0);
380e25b8
RS
1294 Vmessage_log_max = old_log_max;
1295 }
1296
7928f0b5 1297 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
fb8e9847 1298 init_lread ();
76151e2c
EZ
1299#ifdef WINDOWSNT
1300 /* Check to see if Emacs has been installed correctly. */
1301 check_windows_init_file ();
1302#endif
f927c5ae 1303
8bb697c0
RS
1304 /* Intern the names of all standard functions and variables;
1305 define standard keys. */
f927c5ae
JB
1306
1307 if (!initialized)
1308 {
4230ab74
KR
1309 /* The basic levels of Lisp must come first. Note that
1310 syms_of_data and some others have already been called. */
e37d7195 1311 syms_of_chartab ();
fb8e9847 1312 syms_of_lread ();
f927c5ae
JB
1313 syms_of_print ();
1314 syms_of_eval ();
1315 syms_of_fns ();
f927c5ae 1316 syms_of_floatfns ();
f927c5ae 1317
f927c5ae
JB
1318 syms_of_buffer ();
1319 syms_of_bytecode ();
1320 syms_of_callint ();
1321 syms_of_casefiddle ();
1322 syms_of_casetab ();
270ce821
KH
1323 syms_of_category ();
1324 syms_of_ccl ();
e37d7195 1325 syms_of_character ();
f927c5ae 1326 syms_of_cmds ();
f927c5ae 1327 syms_of_dired ();
f927c5ae
JB
1328 syms_of_display ();
1329 syms_of_doc ();
1330 syms_of_editfns ();
1331 syms_of_emacs ();
f927c5ae 1332 syms_of_filelock ();
f927c5ae 1333 syms_of_indent ();
c2c5ed2c 1334 syms_of_insdel ();
4ea81208 1335 /* syms_of_keymap (); */
f927c5ae
JB
1336 syms_of_macros ();
1337 syms_of_marker ();
1338 syms_of_minibuf ();
f927c5ae 1339 syms_of_process ();
f927c5ae 1340 syms_of_search ();
1cbd5d9d 1341 syms_of_frame ();
f927c5ae 1342 syms_of_syntax ();
ed8dad6b 1343 syms_of_terminal ();
0d934e7b 1344 syms_of_term ();
f927c5ae 1345 syms_of_undo ();
90d920b6
GM
1346#ifdef HAVE_SOUND
1347 syms_of_sound ();
1348#endif
bef79ee4 1349 syms_of_textprop ();
9d100795 1350 syms_of_composite ();
05687c54
RS
1351#ifdef WINDOWSNT
1352 syms_of_ntproc ();
1353#endif /* WINDOWSNT */
f927c5ae
JB
1354 syms_of_window ();
1355 syms_of_xdisp ();
d53f587b 1356 syms_of_font ();
4fa9161d 1357#ifdef HAVE_WINDOW_SYSTEM
6b61353c
KH
1358 syms_of_fringe ();
1359 syms_of_image ();
1360#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae 1361#ifdef HAVE_X_WINDOWS
72412588 1362 syms_of_xterm ();
f927c5ae 1363 syms_of_xfns ();
edfda783 1364 syms_of_xmenu ();
270ce821 1365 syms_of_fontset ();
637fa988 1366 syms_of_xsettings ();
28b1b672
JD
1367#ifdef HAVE_X_SM
1368 syms_of_xsmfns ();
1369#endif
72412588
JB
1370#ifdef HAVE_X11
1371 syms_of_xselect ();
1372#endif
f927c5ae
JB
1373#endif /* HAVE_X_WINDOWS */
1374
381408e2
LMI
1375#ifdef HAVE_LIBXML2
1376 syms_of_xml ();
1377#endif
1378
4e77ce60 1379 syms_of_menu ();
4e77ce60 1380
8ba50e1a 1381#ifdef HAVE_NTGUI
fbd6baed
GV
1382 syms_of_w32term ();
1383 syms_of_w32fns ();
fbd6baed
GV
1384 syms_of_w32select ();
1385 syms_of_w32menu ();
02062ac3 1386 syms_of_fontset ();
8ba50e1a
GV
1387#endif /* HAVE_NTGUI */
1388
40da1153
EZ
1389#ifdef MSDOS
1390 syms_of_xmenu ();
5e617bc2
JB
1391 syms_of_dosfns ();
1392 syms_of_msdos ();
1393 syms_of_win16select ();
40da1153
EZ
1394#endif /* MSDOS */
1395
edfda783
AR
1396#ifdef HAVE_NS
1397 syms_of_nsterm ();
1398 syms_of_nsfns ();
1399 syms_of_nsmenu ();
1400 syms_of_nsselect ();
1401 syms_of_fontset ();
1402#endif /* HAVE_NS */
1403
8af55556
TZ
1404#ifdef HAVE_GNUTLS
1405 syms_of_gnutls ();
1406#endif
1407
033b73e2
MA
1408#ifdef HAVE_DBUS
1409 syms_of_dbusbind ();
1410#endif /* HAVE_DBUS */
1411
2e31d424
DN
1412#ifdef WINDOWSNT
1413 syms_of_ntterm ();
1414#endif /* WINDOWSNT */
f927c5ae
JB
1415
1416 keys_of_casefiddle ();
1417 keys_of_cmds ();
1418 keys_of_buffer ();
1419 keys_of_keyboard ();
1420 keys_of_keymap ();
f927c5ae 1421 keys_of_window ();
9785d95b 1422 }
3b6536b1 1423 else
9785d95b 1424 {
3b6536b1
AS
1425 /* Initialization that must be done even if the global variable
1426 initialized is non zero. */
9785d95b 1427#ifdef HAVE_NTGUI
db4f02f2 1428 globals_of_w32font ();
9785d95b
BK
1429 globals_of_w32fns ();
1430 globals_of_w32menu ();
52c7f9ee 1431 globals_of_w32select ();
3b6536b1 1432#endif /* HAVE_NTGUI */
f927c5ae
JB
1433 }
1434
cf411e8d
KH
1435 init_charset ();
1436
b82da769
GM
1437 init_editfns (); /* init_process_emacs uses Voperating_system_release. */
1438 init_process_emacs (); /* init_display uses add_keyboard_wait_descriptor. */
7db35a48 1439 init_keyboard (); /* This too must precede init_sys_modes. */
0a125897 1440 if (!noninteractive)
7c2fb837 1441 init_display (); /* Determine terminal type. Calls init_sys_modes. */
8bb697c0 1442 init_xdisp ();
6b61353c
KH
1443#ifdef HAVE_WINDOW_SYSTEM
1444 init_fringe ();
6b61353c 1445#endif /* HAVE_WINDOW_SYSTEM */
8bb697c0 1446 init_macros ();
75816372 1447 init_window ();
74d75424 1448 init_font ();
087fc47a 1449
f927c5ae
JB
1450 if (!initialized)
1451 {
e2925360 1452 char *file;
7db35a48 1453 /* Handle -l loadup, args passed by Makefile. */
df6530f8 1454 if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
d67b4f80 1455 Vtop_level = Fcons (intern_c_string ("load"),
e2925360 1456 Fcons (build_string (file), Qnil));
f927c5ae 1457 /* Unless next switch is -nl, load "loadup.el" first thing. */
956e3c7e 1458 if (! no_loadup)
d67b4f80 1459 Vtop_level = Fcons (intern_c_string ("load"),
f927c5ae 1460 Fcons (build_string ("loadup.el"), Qnil));
f927c5ae
JB
1461 }
1462
93572b43
KH
1463 if (initialized)
1464 {
0269dedb
RS
1465#ifdef HAVE_TZSET
1466 {
1467 /* If the execution TZ happens to be the same as the dump TZ,
1468 change it to some other value and then change it back,
1469 to force the underlying implementation to reload the TZ info.
1470 This is needed on implementations that load TZ info from files,
1471 since the TZ file contents may differ between dump and execution. */
1472 char *tz = getenv ("TZ");
1473 if (tz && !strcmp (tz, dump_tz))
1474 {
1475 ++*tz;
1476 tzset ();
1477 --*tz;
1478 }
1479 }
1480#endif
93572b43
KH
1481 }
1482
ecf783fa
EZ
1483 /* Set up for profiling. This is known to work on FreeBSD,
1484 GNU/Linux and MinGW. It might work on some other systems too.
1485 Give it a try and tell us if it works on your system. To compile
7b3a82d7 1486 for profiling, use the configure option --enable-profiling. */
5e617bc2 1487#if defined (__FreeBSD__) || defined (GNU_LINUX) || defined (__MINGW32__)
e610ea43
RS
1488#ifdef PROFILING
1489 if (initialized)
1490 {
ecf783fa
EZ
1491#ifdef __MINGW32__
1492 extern unsigned char etext asm ("etext");
1493#else
e610ea43 1494 extern char etext;
ecf783fa 1495#endif
67a5596f 1496
e610ea43 1497 atexit (_mcleanup);
9e4bf381 1498 monstartup ((uintptr_t) __executable_start, (uintptr_t) &etext);
e610ea43
RS
1499 }
1500 else
1501 moncontrol (0);
1502#endif
1503#endif
1504
f927c5ae
JB
1505 initialized = 1;
1506
e7536cff
RS
1507#ifdef LOCALTIME_CACHE
1508 /* Some versions of localtime have a bug. They cache the value of the time
279cc2b8
JB
1509 zone rather than looking it up every time. Since localtime() is
1510 called to bolt the undumping time into the undumped emacs, this
afe9fae9 1511 results in localtime ignoring the TZ environment variable.
7db35a48 1512 This flushes the new TZ value into localtime. */
afe9fae9 1513 tzset ();
e7536cff 1514#endif /* defined (LOCALTIME_CACHE) */
279cc2b8 1515
f927c5ae
JB
1516 /* Enter editor command loop. This never returns. */
1517 Frecursive_edit ();
1518 /* NOTREACHED */
6bbd7a29 1519 return 0;
f927c5ae
JB
1520}
1521\f
081bef73
RS
1522/* Sort the args so we can find the most important ones
1523 at the beginning of argv. */
1524
1525/* First, here's a table of all the standard options. */
1526
1527struct standard_args
1528{
5e2327cf
DN
1529 const char *name;
1530 const char *longname;
081bef73
RS
1531 int priority;
1532 int nargs;
1533};
1534
35f08c38 1535static const struct standard_args standard_args[] =
081bef73 1536{
05922407 1537 { "-version", "--version", 150, 0 },
f63d0028 1538 { "-chdir", "--chdir", 130, 1 },
05922407 1539 { "-t", "--terminal", 120, 1 },
400d6fa9 1540 { "-nw", "--no-window-system", 110, 0 },
05922407
RS
1541 { "-nw", "--no-windows", 110, 0 },
1542 { "-batch", "--batch", 100, 0 },
6e910e07 1543 { "-script", "--script", 100, 1 },
eab2ee89 1544 { "-daemon", "--daemon", 99, 0 },
05922407 1545 { "-help", "--help", 90, 0 },
956e3c7e 1546 { "-nl", "--no-loadup", 70, 0 },
66b7b0fe 1547 { "-nsl", "--no-site-lisp", 65, 0 },
956e3c7e
RS
1548 /* -d must come last before the options handled in startup.el. */
1549 { "-d", "--display", 60, 1 },
1550 { "-display", 0, 60, 1 },
4fe22cdf 1551 /* Now for the options handled in `command-line' (startup.el). */
66b7b0fe 1552 /* (Note that to imply -nsl, -Q is partially handled here.) */
a1716a57
RS
1553 { "-Q", "--quick", 55, 0 },
1554 { "-quick", 0, 55, 0 },
081bef73
RS
1555 { "-q", "--no-init-file", 50, 0 },
1556 { "-no-init-file", 0, 50, 0 },
1557 { "-no-site-file", "--no-site-file", 40, 0 },
1558 { "-u", "--user", 30, 1 },
1559 { "-user", 0, 30, 1 },
1560 { "-debug-init", "--debug-init", 20, 0 },
f2bc3538 1561 { "-iconic", "--iconic", 15, 0 },
a1716a57 1562 { "-D", "--basic-display", 12, 0},
e09b9180 1563 { "-basic-display", 0, 12, 0},
4fe22cdf
CY
1564 { "-nbc", "--no-blinking-cursor", 12, 0 },
1565 /* Now for the options handled in `command-line-1' (startup.el). */
1566 { "-nbi", "--no-bitmap-icon", 10, 0 },
081bef73
RS
1567 { "-bg", "--background-color", 10, 1 },
1568 { "-background", 0, 10, 1 },
1569 { "-fg", "--foreground-color", 10, 1 },
1570 { "-foreground", 0, 10, 1 },
1571 { "-bd", "--border-color", 10, 1 },
1572 { "-bw", "--border-width", 10, 1 },
1573 { "-ib", "--internal-border", 10, 1 },
1574 { "-ms", "--mouse-color", 10, 1 },
1575 { "-cr", "--cursor-color", 10, 1 },
1576 { "-fn", "--font", 10, 1 },
1577 { "-font", 0, 10, 1 },
94452530
EZ
1578 { "-fs", "--fullscreen", 10, 0 },
1579 { "-fw", "--fullwidth", 10, 0 },
1580 { "-fh", "--fullheight", 10, 0 },
3f1c6666 1581 { "-mm", "--maximized", 10, 0 },
081bef73
RS
1582 { "-g", "--geometry", 10, 1 },
1583 { "-geometry", 0, 10, 1 },
1584 { "-T", "--title", 10, 1 },
ae63ae52 1585 { "-title", 0, 10, 1 },
081bef73
RS
1586 { "-name", "--name", 10, 1 },
1587 { "-xrm", "--xrm", 10, 1 },
1540a61a 1588 { "-parent-id", "--parent-id", 10, 1 },
fcdeb5d9
RS
1589 { "-r", "--reverse-video", 5, 0 },
1590 { "-rv", 0, 5, 0 },
1591 { "-reverse", 0, 5, 0 },
ae63ae52 1592 { "-hb", "--horizontal-scroll-bars", 5, 0 },
fcdeb5d9 1593 { "-vb", "--vertical-scroll-bars", 5, 0 },
d20e1b1e 1594 { "-color", "--color", 5, 0},
16706228
JL
1595 { "-no-splash", "--no-splash", 3, 0 },
1596 { "-no-desktop", "--no-desktop", 3, 0 },
edfda783
AR
1597#ifdef HAVE_NS
1598 { "-NSAutoLaunch", 0, 5, 1 },
1599 { "-NXAutoLaunch", 0, 5, 1 },
1600 { "-disable-font-backend", "--disable-font-backend", 65, 0 },
1601 { "-_NSMachLaunch", 0, 85, 1 },
1602 { "-MachLaunch", 0, 85, 1 },
1603 { "-macosx", 0, 85, 0 },
1604 { "-NSHost", 0, 85, 1 },
1605#endif
fcdeb5d9
RS
1606 /* These have the same priority as ordinary file name args,
1607 so they are not reordered with respect to those. */
4af9e0b3
RS
1608 { "-L", "--directory", 0, 1 },
1609 { "-directory", 0, 0, 1 },
fcdeb5d9
RS
1610 { "-l", "--load", 0, 1 },
1611 { "-load", 0, 0, 1 },
21a4ff8e
GM
1612 /* This has no longname, because using --scriptload confuses sort_args,
1613 because then the --script long option seems to match twice; ie
1614 you can't have a long option which is a prefix of another long
1615 option. In any case, this is entirely an internal option. */
1616 { "-scriptload", NULL, 0, 1 },
fcdeb5d9
RS
1617 { "-f", "--funcall", 0, 1 },
1618 { "-funcall", 0, 0, 1 },
575985b1 1619 { "-eval", "--eval", 0, 1 },
67a5596f 1620 { "-execute", "--execute", 0, 1 },
2e13f8e9
RS
1621 { "-find-file", "--find-file", 0, 1 },
1622 { "-visit", "--visit", 0, 1 },
67a5596f 1623 { "-file", "--file", 0, 1 },
fcdeb5d9 1624 { "-insert", "--insert", 0, 1 },
edfda783
AR
1625#ifdef HAVE_NS
1626 { "-NXOpen", 0, 0, 1 },
1627 { "-NXOpenTemp", 0, 0, 1 },
1628 { "-NSOpen", 0, 0, 1 },
1629 { "-NSOpenTemp", 0, 0, 1 },
1630 { "-GSFilePath", 0, 0, 1 },
1631#endif
f2bc3538 1632 /* This should be processed after ordinary file name args and the like. */
fcdeb5d9 1633 { "-kill", "--kill", -10, 0 },
081bef73
RS
1634};
1635
1636/* Reorder the elements of ARGV (assumed to have ARGC elements)
1637 so that the highest priority ones come first.
1638 Do not change the order of elements of equal priority.
956e3c7e
RS
1639 If an option takes an argument, keep it and its argument together.
1640
1641 If an option that takes no argument appears more
1642 than once, eliminate all but one copy of it. */
081bef73
RS
1643
1644static void
dd4c5104 1645sort_args (int argc, char **argv)
081bef73 1646{
38182d90 1647 char **new = xmalloc (argc * sizeof *new);
081bef73
RS
1648 /* For each element of argv,
1649 the corresponding element of options is:
1650 0 for an option that takes no arguments,
1651 1 for an option that takes one argument, etc.
1652 -1 for an ordinary non-option argument. */
0065d054
PE
1653 int *options = xnmalloc (argc, sizeof *options);
1654 int *priority = xnmalloc (argc, sizeof *priority);
081bef73 1655 int to = 1;
956e3c7e 1656 int incoming_used = 1;
081bef73
RS
1657 int from;
1658 int i;
1659
1660 /* Categorize all the options,
1661 and figure out which argv elts are option arguments. */
1662 for (from = 1; from < argc; from++)
1663 {
1664 options[from] = -1;
fcdeb5d9 1665 priority[from] = 0;
081bef73
RS
1666 if (argv[from][0] == '-')
1667 {
0b963a93 1668 int match;
081bef73 1669
c96f26f4
RS
1670 /* If we have found "--", don't consider
1671 any more arguments as options. */
249443b6 1672 if (argv[from][1] == '-' && argv[from][2] == 0)
c96f26f4
RS
1673 {
1674 /* Leave the "--", and everything following it, at the end. */
1675 for (; from < argc; from++)
1676 {
1677 priority[from] = -100;
1678 options[from] = -1;
1679 }
1680 break;
1681 }
1682
081bef73
RS
1683 /* Look for a match with a known old-fashioned option. */
1684 for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1685 if (!strcmp (argv[from], standard_args[i].name))
1686 {
1687 options[from] = standard_args[i].nargs;
1688 priority[from] = standard_args[i].priority;
fd76ec52
RS
1689 if (from + standard_args[i].nargs >= argc)
1690 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
1691 from += standard_args[i].nargs;
1692 goto done;
1693 }
1694
1695 /* Look for a match with a known long option.
1696 MATCH is -1 if no match so far, -2 if two or more matches so far,
1697 >= 0 (the table index of the match) if just one match so far. */
1698 if (argv[from][1] == '-')
1699 {
0b963a93
PE
1700 char const *equals = strchr (argv[from], '=');
1701 ptrdiff_t thislen =
1702 equals ? equals - argv[from] : strlen (argv[from]);
1703
081bef73 1704 match = -1;
081bef73 1705
f609ef57
KH
1706 for (i = 0;
1707 i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1708 if (standard_args[i].longname
1709 && !strncmp (argv[from], standard_args[i].longname,
1710 thislen))
081bef73
RS
1711 {
1712 if (match == -1)
1713 match = i;
1714 else
1715 match = -2;
1716 }
1717
1718 /* If we found exactly one match, use that. */
1719 if (match >= 0)
1720 {
1721 options[from] = standard_args[match].nargs;
1722 priority[from] = standard_args[match].priority;
1723 /* If --OPTION=VALUE syntax is used,
1724 this option uses just one argv element. */
1725 if (equals != 0)
1726 options[from] = 0;
fd76ec52
RS
1727 if (from + options[from] >= argc)
1728 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
1729 from += options[from];
1730 }
a09a5b5b
GM
1731 /* FIXME When match < 0, shouldn't there be some error,
1732 or at least indication to the user that there was a
1733 problem? */
081bef73
RS
1734 }
1735 done: ;
1736 }
1737 }
1738
1739 /* Copy the arguments, in order of decreasing priority, to NEW. */
1740 new[0] = argv[0];
956e3c7e 1741 while (incoming_used < argc)
081bef73
RS
1742 {
1743 int best = -1;
2c70c992 1744 int best_priority = -9999;
081bef73
RS
1745
1746 /* Find the highest priority remaining option.
1747 If several have equal priority, take the first of them. */
1748 for (from = 1; from < argc; from++)
1749 {
1750 if (argv[from] != 0 && priority[from] > best_priority)
1751 {
1752 best_priority = priority[from];
1753 best = from;
1754 }
1755 /* Skip option arguments--they are tied to the options. */
1756 if (options[from] > 0)
1757 from += options[from];
1758 }
7db35a48 1759
081bef73 1760 if (best < 0)
1088b922 1761 emacs_abort ();
081bef73 1762
956e3c7e
RS
1763 /* Copy the highest priority remaining option, with its args, to NEW.
1764 Unless it is a duplicate of the previous one. */
1765 if (! (options[best] == 0
1766 && ! strcmp (new[to - 1], argv[best])))
1767 {
1768 new[to++] = argv[best];
1769 for (i = 0; i < options[best]; i++)
1770 new[to++] = argv[best + i + 1];
1771 }
1772
1773 incoming_used += 1 + (options[best] > 0 ? options[best] : 0);
081bef73
RS
1774
1775 /* Clear out this option in ARGV. */
1776 argv[best] = 0;
1777 for (i = 0; i < options[best]; i++)
1778 argv[best + i + 1] = 0;
1779 }
1780
81b7af72
RS
1781 /* If duplicate options were deleted, fill up extra space with null ptrs. */
1782 while (to < argc)
1783 new[to++] = 0;
1784
72af86bd 1785 memcpy (argv, new, sizeof (char *) * argc);
0bf591da 1786
68db37aa
KS
1787 xfree (options);
1788 xfree (new);
1789 xfree (priority);
081bef73
RS
1790}
1791\f
a7ca3326 1792DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
7db35a48
PJ
1793 doc: /* Exit the Emacs job and kill it.
1794If ARG is an integer, return ARG as the exit program code.
b224de9b 1795If ARG is a string, stuff it as keyboard input.
7db35a48 1796
9c524fcb 1797This function is called upon receipt of the signals SIGTERM
383ebd15 1798or SIGHUP, and upon SIGINT in batch mode.
9c524fcb 1799
7db35a48
PJ
1800The value of `kill-emacs-hook', if not void,
1801is a list of functions (of no args),
1802all of which are called before Emacs is actually killed. */)
5842a27b 1803 (Lisp_Object arg)
f927c5ae 1804{
f927c5ae 1805 struct gcpro gcpro1;
dee091a3 1806 Lisp_Object hook;
8eca8a7c 1807 int exit_code;
f927c5ae
JB
1808
1809 GCPRO1 (arg);
1810
1811 if (feof (stdin))
1812 arg = Qt;
1813
dee091a3
JD
1814 hook = intern ("kill-emacs-hook");
1815 Frun_hooks (1, &hook);
f927c5ae 1816
f927c5ae
JB
1817 UNGCPRO;
1818
1dd3c2d9
CY
1819#ifdef HAVE_X_WINDOWS
1820 /* Transfer any clipboards we own to the clipboard manager. */
1821 x_clipboard_manager_save_all ();
1822#endif
1823
1882aa38 1824 shut_down_emacs (0, STRINGP (arg) ? arg : Qnil);
40be253a 1825
204ee57f
JD
1826#ifdef HAVE_NS
1827 ns_release_autorelease_pool (ns_pool);
1828#endif
1829
58545838
KH
1830 /* If we have an auto-save list file,
1831 kill it because we are exiting Emacs deliberately (not crashing).
1832 Do it after shut_down_emacs, which does an auto-save. */
1833 if (STRINGP (Vauto_save_list_file_name))
42a5b22f 1834 unlink (SSDATA (Vauto_save_list_file_name));
58545838 1835
5895d7b9
PE
1836 if (INTEGERP (arg))
1837 exit_code = (XINT (arg) < 0
1838 ? XINT (arg) | INT_MIN
1839 : XINT (arg) & INT_MAX);
1840 else if (noninteractive && (fflush (stdout) || ferror (stdout)))
8eca8a7c 1841 exit_code = EXIT_FAILURE;
d311d28c 1842 else
5895d7b9
PE
1843 exit_code = EXIT_SUCCESS;
1844 exit (exit_code);
f927c5ae 1845}
40be253a
JB
1846
1847
1848/* Perform an orderly shutdown of Emacs. Autosave any modified
1849 buffers, kill any child processes, clean up the terminal modes (if
1850 we're in the foreground), and other stuff like that. Don't perform
1851 any redisplay; this may be called when Emacs is shutting down in
1852 the background, or after its X connection has died.
1853
1854 If SIG is a signal number, print a message for it.
1855
1856 This is called by fatal signal handlers, X protocol error handlers,
1857 and Fkill_emacs. */
f7ab4e3d 1858
40be253a 1859void
1882aa38 1860shut_down_emacs (int sig, Lisp_Object stuff)
40be253a 1861{
829d872b
RS
1862 /* Prevent running of hooks from now on. */
1863 Vrun_hooks = Qnil;
1864
9db03f6c
KS
1865 /* Don't update display from now on. */
1866 Vinhibit_redisplay = Qt;
1867
7db35a48 1868 /* If we are controlling the terminal, reset terminal modes. */
a7ebc409 1869#ifndef DOS_NT
40be253a 1870 {
d04d81d2 1871 int pgrp = EMACS_GETPGRP (0);
12e610e8
DN
1872 int tpgrp = tcgetpgrp (0);
1873 if ((tpgrp != -1) && tpgrp == pgrp)
40be253a 1874 {
28d440ab 1875 reset_all_sys_modes ();
40be253a 1876 if (sig && sig != SIGTERM)
01108e3f 1877 {
703342f8
PE
1878 static char const format[] = "Fatal error %d: ";
1879 char buf[sizeof format - 2 + INT_STRLEN_BOUND (int)];
1880 int buflen = sprintf (buf, format, sig);
1881 char const *sig_desc = strsignal (sig);
01108e3f 1882 ignore_value (write (STDERR_FILENO, buf, buflen));
703342f8 1883 ignore_value (write (STDERR_FILENO, sig_desc, strlen (sig_desc)));
01108e3f 1884 }
40be253a
JB
1885 }
1886 }
1887#else
1888 fflush (stdout);
0a125897 1889 reset_all_sys_modes ();
40be253a
JB
1890#endif
1891
f7ab4e3d
RS
1892 stuff_buffered_input (stuff);
1893
92d835a4 1894 inhibit_sentinels = 1;
40be253a
JB
1895 kill_buffer_processes (Qnil);
1896 Fdo_auto_save (Qt, Qnil);
1897
1898#ifdef CLASH_DETECTION
1899 unlock_all_files ();
1900#endif
1901
40be253a
JB
1902 /* There is a tendency for a SIGIO signal to arrive within exit,
1903 and cause a SIGHUP because the input descriptor is already closed. */
1904 unrequest_sigio ();
4a4bbad2 1905 ignore_sigio ();
41f339d4
RS
1906
1907#ifdef WINDOWSNT
1908 term_ntproc ();
1909#endif
d546e578 1910
cd8d4168
GM
1911 /* Do this only if terminating normally, we want glyph matrices
1912 etc. in a core dump. */
200f868e 1913 if (sig == 0 || sig == SIGTERM)
cd8d4168
GM
1914 {
1915 check_glyph_memory ();
1916 check_message_stack ();
1917 }
90d920b6 1918
d546e578
EZ
1919#ifdef MSDOS
1920 dos_cleanup ();
1921#endif
edfda783
AR
1922
1923#ifdef HAVE_NS
1924 ns_term_shutdown (sig);
1925#endif
fcb901a7
LMI
1926
1927#ifdef HAVE_LIBXML2
9078ead6 1928 xml_cleanup_parser ();
fcb901a7 1929#endif
40be253a
JB
1930}
1931
1932
f927c5ae
JB
1933\f
1934#ifndef CANNOT_DUMP
f927c5ae 1935
ce701a33 1936#include "unexec.h"
dd5ecd6b 1937
f927c5ae 1938DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
7db35a48
PJ
1939 doc: /* Dump current state of Emacs into executable file FILENAME.
1940Take symbols from SYMFILE (presumably the file you executed to run Emacs).
1941This is used in the file `loadup.el' when building Emacs.
1942
1943You must run Emacs in batch mode in order to dump it. */)
5842a27b 1944 (Lisp_Object filename, Lisp_Object symfile)
f927c5ae 1945{
f927c5ae 1946 Lisp_Object tem;
1b7ddf4f 1947 Lisp_Object symbol;
d311d28c 1948 ptrdiff_t count = SPECPDL_INDEX ();
4fab758d
GM
1949
1950 check_pure_size ();
f927c5ae 1951
87a98b1a
RS
1952 if (! noninteractive)
1953 error ("Dumping Emacs works only in batch mode");
1954
848a925e 1955#ifdef GNU_LINUX
c339dc2e
PE
1956
1957 /* Warn if the gap between BSS end and heap start is larger than this. */
1958# define MAX_HEAP_BSS_DIFF (1024*1024)
1959
dede2792
JD
1960 if (heap_bss_diff > MAX_HEAP_BSS_DIFF)
1961 {
1962 fprintf (stderr, "**************************************************\n");
1963 fprintf (stderr, "Warning: Your system has a gap between BSS and the\n");
b312a492 1964 fprintf (stderr, "heap (%"pMu" bytes). This usually means that exec-shield\n",
c37caf9d
JD
1965 heap_bss_diff);
1966 fprintf (stderr, "or something similar is in effect. The dump may\n");
e79beb56 1967 fprintf (stderr, "fail because of this. See the section about\n");
c37caf9d 1968 fprintf (stderr, "exec-shield in etc/PROBLEMS for more information.\n");
dede2792
JD
1969 fprintf (stderr, "**************************************************\n");
1970 }
848a925e 1971#endif /* GNU_LINUX */
dede2792 1972
1b7ddf4f
RS
1973 /* Bind `command-line-processed' to nil before dumping,
1974 so that the dumped Emacs will process its command line
1975 and set up to work with X windows if appropriate. */
4aaa3607 1976 symbol = intern ("command-line-processed");
1b7ddf4f
RS
1977 specbind (symbol, Qnil);
1978
b7826503 1979 CHECK_STRING (filename);
c9aae259
EN
1980 filename = Fexpand_file_name (filename, Qnil);
1981 if (!NILP (symfile))
f927c5ae 1982 {
b7826503 1983 CHECK_STRING (symfile);
d5db4077 1984 if (SCHARS (symfile))
c9aae259 1985 symfile = Fexpand_file_name (symfile, Qnil);
f927c5ae
JB
1986 }
1987
1988 tem = Vpurify_flag;
1989 Vpurify_flag = Qnil;
1990
0269dedb
RS
1991#ifdef HAVE_TZSET
1992 set_time_zone_rule (dump_tz);
1993#ifndef LOCALTIME_CACHE
1994 /* Force a tz reload, since set_time_zone_rule doesn't. */
1995 tzset ();
1996#endif
1997#endif
1998
f927c5ae 1999 fflush (stdout);
7db35a48 2000 /* Tell malloc where start of impure now is. */
f927c5ae
JB
2001 /* Also arrange for warnings when nearly out of space. */
2002#ifndef SYSTEM_MALLOC
cc5f52cb
RS
2003#ifndef WINDOWSNT
2004 /* On Windows, this was done before dumping, and that once suffices.
2005 Meanwhile, my_edata is not valid on Windows. */
c339dc2e
PE
2006 {
2007 extern char my_edata[];
2008 memory_warnings (my_edata, malloc_warning);
2009 }
cc5f52cb 2010#endif /* not WINDOWSNT */
dd5ecd6b 2011#endif /* not SYSTEM_MALLOC */
15aaf1b5
RS
2012#ifdef DOUG_LEA_MALLOC
2013 malloc_state_ptr = malloc_get_state ();
f927c5ae 2014#endif
2b7377ca 2015
a74c5ec1 2016#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2017 mmap_set_vars (0);
2018#endif
42a5b22f 2019 unexec (SSDATA (filename), !NILP (symfile) ? SSDATA (symfile) : 0);
a74c5ec1 2020#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2021 mmap_set_vars (1);
2022#endif
15aaf1b5
RS
2023#ifdef DOUG_LEA_MALLOC
2024 free (malloc_state_ptr);
2025#endif
f927c5ae
JB
2026
2027 Vpurify_flag = tem;
2028
1b7ddf4f 2029 return unbind_to (count, Qnil);
f927c5ae
JB
2030}
2031
f927c5ae
JB
2032#endif /* not CANNOT_DUMP */
2033\f
68c45bf0
PE
2034#if HAVE_SETLOCALE
2035/* Recover from setlocale (LC_ALL, ""). */
2036void
d5a3eaaf 2037fixup_locale (void)
68c45bf0 2038{
68c45bf0
PE
2039 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
2040 so that numbers are read and printed properly for Emacs Lisp. */
2041 setlocale (LC_NUMERIC, "C");
68c45bf0
PE
2042}
2043
0c8559bb
PE
2044/* Set system locale CATEGORY, with previous locale *PLOCALE, to
2045 DESIRED_LOCALE. */
68c45bf0 2046static void
dd4c5104 2047synchronize_locale (int category, Lisp_Object *plocale, Lisp_Object desired_locale)
68c45bf0 2048{
0c8559bb
PE
2049 if (! EQ (*plocale, desired_locale))
2050 {
2051 *plocale = desired_locale;
2052 setlocale (category, (STRINGP (desired_locale)
51b59d79 2053 ? SSDATA (desired_locale)
0c8559bb
PE
2054 : ""));
2055 }
68c45bf0
PE
2056}
2057
ca9c0567 2058/* Set system time locale to match Vsystem_time_locale, if possible. */
68c45bf0 2059void
d5a3eaaf 2060synchronize_system_time_locale (void)
68c45bf0 2061{
ca9c0567
PE
2062 synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
2063 Vsystem_time_locale);
68c45bf0
PE
2064}
2065
ca9c0567
PE
2066/* Set system messages locale to match Vsystem_messages_locale, if
2067 possible. */
68c45bf0 2068void
d5a3eaaf 2069synchronize_system_messages_locale (void)
68c45bf0
PE
2070{
2071#ifdef LC_MESSAGES
ca9c0567
PE
2072 synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
2073 Vsystem_messages_locale);
68c45bf0
PE
2074#endif
2075}
2076#endif /* HAVE_SETLOCALE */
2077\f
f927c5ae
JB
2078
2079Lisp_Object
a8fe7202 2080decode_env_path (const char *evarname, const char *defalt)
f927c5ae 2081{
a8fe7202 2082 const char *path, *p;
213d0b1f 2083 Lisp_Object lpath, element, tem;
76151e2c 2084#ifdef WINDOWSNT
1882aa38 2085 bool defaulted = 0;
76151e2c
EZ
2086 const char *emacs_dir = egetenv ("emacs_dir");
2087 static const char *emacs_dir_env = "%emacs_dir%/";
2088 const size_t emacs_dir_len = strlen (emacs_dir_env);
2089#endif
f927c5ae 2090
2447c626
JB
2091 /* It's okay to use getenv here, because this function is only used
2092 to initialize variables when Emacs starts up, and isn't called
2093 after that. */
e065a56e 2094 if (evarname != 0)
a8fe7202 2095 path = getenv (evarname);
e065a56e
JB
2096 else
2097 path = 0;
f927c5ae 2098 if (!path)
76151e2c
EZ
2099 {
2100 path = defalt;
8671676c 2101#ifdef WINDOWSNT
76151e2c 2102 defaulted = 1;
8671676c 2103#endif
76151e2c 2104 }
6a30e6d6
RS
2105#ifdef DOS_NT
2106 /* Ensure values from the environment use the proper directory separator. */
2107 if (path)
2108 {
a8fe7202
AS
2109 char *path_copy = alloca (strlen (path) + 1);
2110 strcpy (path_copy, path);
2111 dostounix_filename (path_copy);
2112 path = path_copy;
6a30e6d6
RS
2113 }
2114#endif
f927c5ae
JB
2115 lpath = Qnil;
2116 while (1)
2117 {
8966b757 2118 p = strchr (path, SEPCHAR);
a8fe7202
AS
2119 if (!p)
2120 p = path + strlen (path);
213d0b1f
RS
2121 element = (p - path ? make_string (path, p - path)
2122 : build_string ("."));
76151e2c
EZ
2123#ifdef WINDOWSNT
2124 /* Relative file names in the default path are interpreted as
2125 being relative to $emacs_dir. */
2126 if (emacs_dir && defaulted
2127 && strncmp (path, emacs_dir_env, emacs_dir_len) == 0)
2128 element = Fexpand_file_name (Fsubstring (element,
2129 make_number (emacs_dir_len),
2130 Qnil),
2131 build_string (emacs_dir));
2132#endif
213d0b1f
RS
2133
2134 /* Add /: to the front of the name
2135 if it would otherwise be treated as magic. */
2136 tem = Ffind_file_name_handler (element, Qt);
ca3df2d5
RS
2137
2138 /* However, if the handler says "I'm safe",
2139 don't bother adding /:. */
2140 if (SYMBOLP (tem))
2141 {
2142 Lisp_Object prop;
2143 prop = Fget (tem, intern ("safe-magic"));
2144 if (! NILP (prop))
2145 tem = Qnil;
2146 }
2147
213d0b1f
RS
2148 if (! NILP (tem))
2149 element = concat2 (build_string ("/:"), element);
2150
2151 lpath = Fcons (element, lpath);
f927c5ae
JB
2152 if (*p)
2153 path = p + 1;
2154 else
2155 break;
2156 }
2157 return Fnreverse (lpath);
2158}
2159
eab2ee89 2160DEFUN ("daemonp", Fdaemonp, Sdaemonp, 0, 0, 0,
4ff029f6
DN
2161 doc: /* Return non-nil if the current emacs process is a daemon.
2162If the daemon was given a name argument, return that name. */)
5842a27b 2163 (void)
eab2ee89 2164{
fc012771 2165 if (IS_DAEMON)
4ff029f6
DN
2166 if (daemon_name)
2167 return build_string (daemon_name);
2168 else
2169 return Qt;
2170 else
2171 return Qnil;
eab2ee89
DN
2172}
2173
5790ef40 2174DEFUN ("daemon-initialized", Fdaemon_initialized, Sdaemon_initialized, 0, 0, 0,
fc012771
SM
2175 doc: /* Mark the Emacs daemon as being initialized.
2176This finishes the daemonization process by doing the other half of detaching
2177from the parent process and its tty file descriptors. */)
5842a27b 2178 (void)
5790ef40
DN
2179{
2180 int nfd;
1882aa38 2181 bool err = 0;
5790ef40 2182
fc012771 2183 if (!IS_DAEMON)
5790ef40
DN
2184 error ("This function can only be called if emacs is run as a daemon");
2185
2186 if (daemon_pipe[1] < 0)
2187 error ("The daemon has already been initialized");
2188
2189 if (NILP (Vafter_init_time))
2190 error ("This function can only be called after loading the init files");
2191
2192 /* Get rid of stdin, stdout and stderr. */
29dadb54 2193 nfd = open ("/dev/null", O_RDWR);
dc1ca6a8
PE
2194 err |= nfd < 0;
2195 err |= dup2 (nfd, 0) < 0;
2196 err |= dup2 (nfd, 1) < 0;
2197 err |= dup2 (nfd, 2) < 0;
2198 err |= close (nfd) != 0;
5790ef40 2199
fc012771
SM
2200 /* Closing the pipe will notify the parent that it can exit.
2201 FIXME: In case some other process inherited the pipe, closing it here
2202 won't notify the parent because it's still open elsewhere, so we
2203 additionally send a byte, just to make sure the parent really exits.
2204 Instead, we should probably close the pipe in start-process and
2205 call-process to make sure the pipe is never inherited by
2206 subprocesses. */
dc1ca6a8
PE
2207 err |= write (daemon_pipe[1], "\n", 1) < 0;
2208 err |= close (daemon_pipe[1]) != 0;
5790ef40
DN
2209 /* Set it to an invalid value so we know we've already run this function. */
2210 daemon_pipe[1] = -1;
dc1ca6a8
PE
2211
2212 if (err)
2213 error ("I/O error during daemon initialization");
5790ef40
DN
2214 return Qt;
2215}
2216
dfcf069d 2217void
d5a3eaaf 2218syms_of_emacs (void)
f927c5ae 2219{
cd3520a4
JB
2220 DEFSYM (Qfile_name_handler_alist, "file-name-handler-alist");
2221 DEFSYM (Qrisky_local_variable, "risky-local-variable");
6c07aac2 2222 DEFSYM (Qkill_emacs, "kill-emacs");
213d0b1f 2223
83591e66 2224#ifndef CANNOT_DUMP
f927c5ae
JB
2225 defsubr (&Sdump_emacs);
2226#endif
2227
2228 defsubr (&Skill_emacs);
2229
59653951 2230 defsubr (&Sinvocation_name);
ace40a69 2231 defsubr (&Sinvocation_directory);
eab2ee89 2232 defsubr (&Sdaemonp);
5790ef40 2233 defsubr (&Sdaemon_initialized);
59653951 2234
29208e82 2235 DEFVAR_LISP ("command-line-args", Vcommand_line_args,
2a9d2ed6
RS
2236 doc: /* Args passed by shell to Emacs, as a list of strings.
2237Many arguments are deleted from the list as they are processed. */);
f927c5ae 2238
29208e82 2239 DEFVAR_LISP ("system-type", Vsystem_type,
cf59a374 2240 doc: /* The value is a symbol indicating the type of operating system you are using.
40a8993a 2241Special values:
cf59a374
GM
2242 `gnu' compiled for a GNU Hurd system.
2243 `gnu/linux' compiled for a GNU/Linux system.
2244 `gnu/kfreebsd' compiled for a GNU system with a FreeBSD kernel.
2245 `darwin' compiled for Darwin (GNU-Darwin, Mac OS X, ...).
2246 `ms-dos' compiled as an MS-DOS application.
2247 `windows-nt' compiled as a native W32 application.
2248 `cygwin' compiled using the Cygwin library.
bd6bc222
GM
2249Anything else (in Emacs 24.1, the possibilities are: aix, berkeley-unix,
2250hpux, irix, usg-unix-v) indicates some sort of Unix system. */);
d67b4f80 2251 Vsystem_type = intern_c_string (SYSTEM_TYPE);
6edd2f3d 2252 /* See configure.ac (and config.nt) for the possible SYSTEM_TYPEs. */
f927c5ae 2253
29208e82 2254 DEFVAR_LISP ("system-configuration", Vsystem_configuration,
7db35a48
PJ
2255 doc: /* Value is string indicating configuration Emacs was built for.
2256On MS-Windows, the value reflects the OS flavor and version on which
2257Emacs is running. */);
f7511647 2258 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
271c7b7c 2259
29208e82 2260 DEFVAR_LISP ("system-configuration-options", Vsystem_configuration_options,
7db35a48 2261 doc: /* String containing the configuration options Emacs was built with. */);
f0fc0b1a
KH
2262 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2263
29208e82 2264 DEFVAR_BOOL ("noninteractive", noninteractive1,
7db35a48 2265 doc: /* Non-nil means Emacs is running without interactive terminal. */);
e5d77022 2266
29208e82 2267 DEFVAR_LISP ("kill-emacs-hook", Vkill_emacs_hook,
e5d9c0d1 2268 doc: /* Hook run when `kill-emacs' is called.
d77b70e5 2269Since `kill-emacs' may be invoked when the terminal is disconnected (or
7db35a48
PJ
2270in other similar situations), functions placed on this hook should not
2271expect to be able to interact with the user. To ask for confirmation,
d77b70e5
MR
2272see `kill-emacs-query-functions' instead.
2273
9c524fcb
GM
2274Before Emacs 24.1, the hook was not run in batch mode, i.e., if
2275`noninteractive' was non-nil. */);
edc8ae07 2276 Vkill_emacs_hook = Qnil;
3005da00 2277
29208e82 2278 DEFVAR_LISP ("path-separator", Vpath_separator,
c7ed3276
EZ
2279 doc: /* String containing the character that separates directories in
2280search paths, such as PATH and other similar environment variables. */);
074a066b
GV
2281 {
2282 char c = SEPCHAR;
2283 Vpath_separator = make_string (&c, 1);
2284 }
59653951 2285
29208e82 2286 DEFVAR_LISP ("invocation-name", Vinvocation_name,
7db35a48
PJ
2287 doc: /* The program name that was used to run Emacs.
2288Any directory names are omitted. */);
f67de86f 2289
29208e82 2290 DEFVAR_LISP ("invocation-directory", Vinvocation_directory,
7db35a48
PJ
2291 doc: /* The directory in which the Emacs executable was found, to run it.
2292The value is nil if that directory's name is not known. */);
f67de86f 2293
29208e82 2294 DEFVAR_LISP ("installation-directory", Vinstallation_directory,
7db35a48 2295 doc: /* A directory within which to look for the `lib-src' and `etc' directories.
74cc8ff9
GM
2296In an installed Emacs, this is normally nil. It is non-nil if
2297both `lib-src' (on MS-DOS, `info') and `etc' directories are found
1e2c5d95
GM
2298within the variable `invocation-directory' or its parent. For example,
2299this is the case when running an uninstalled Emacs executable from its
74cc8ff9 2300build directory. */);
07f4d123 2301 Vinstallation_directory = Qnil;
68c45bf0 2302
29208e82 2303 DEFVAR_LISP ("system-messages-locale", Vsystem_messages_locale,
7db35a48 2304 doc: /* System locale for messages. */);
ca9c0567 2305 Vsystem_messages_locale = Qnil;
68c45bf0 2306
ca9c0567 2307 DEFVAR_LISP ("previous-system-messages-locale",
29208e82 2308 Vprevious_system_messages_locale,
7db35a48 2309 doc: /* Most recently used system locale for messages. */);
ca9c0567 2310 Vprevious_system_messages_locale = Qnil;
68c45bf0 2311
29208e82 2312 DEFVAR_LISP ("system-time-locale", Vsystem_time_locale,
7db35a48 2313 doc: /* System locale for time. */);
ca9c0567 2314 Vsystem_time_locale = Qnil;
68c45bf0 2315
29208e82 2316 DEFVAR_LISP ("previous-system-time-locale", Vprevious_system_time_locale,
7db35a48 2317 doc: /* Most recently used system locale for time. */);
ca9c0567 2318 Vprevious_system_time_locale = Qnil;
90503d96 2319
29208e82 2320 DEFVAR_LISP ("before-init-time", Vbefore_init_time,
90503d96
CY
2321 doc: /* Value of `current-time' before Emacs begins initialization. */);
2322 Vbefore_init_time = Qnil;
2323
29208e82 2324 DEFVAR_LISP ("after-init-time", Vafter_init_time,
90503d96
CY
2325 doc: /* Value of `current-time' after loading the init files.
2326This is nil during initialization. */);
2327 Vafter_init_time = Qnil;
fc012771 2328
29208e82 2329 DEFVAR_BOOL ("inhibit-x-resources", inhibit_x_resources,
9b68317c 2330 doc: /* If non-nil, X resources, Windows Registry settings, and NS defaults are not used. */);
8686ac71
JB
2331 inhibit_x_resources = 0;
2332
29208e82 2333 DEFVAR_LISP ("emacs-copyright", Vemacs_copyright,
8c5ff6dd
KR
2334 doc: /* Short copyright string for this version of Emacs. */);
2335 Vemacs_copyright = build_string (emacs_copyright);
2336
29208e82 2337 DEFVAR_LISP ("emacs-version", Vemacs_version,
8c5ff6dd
KR
2338 doc: /* Version numbers of this version of Emacs. */);
2339 Vemacs_version = build_string (emacs_version);
2340
29208e82 2341 DEFVAR_LISP ("dynamic-library-alist", Vdynamic_library_alist,
2e288d54
JB
2342 doc: /* Alist of dynamic libraries vs external files implementing them.
2343Each element is a list (LIBRARY FILE...), where the car is a symbol
2344representing a supported external library, and the rest are strings giving
2345alternate filenames for that library.
2346
2347Emacs tries to load the library from the files in the order they appear on
2348the list; if none is loaded, the running session of Emacs won't have access
2349to that library.
2350
2351Note that image types `pbm' and `xbm' do not need entries in this variable
2352because they do not depend on external libraries and are always available.
2353
2354Also note that this is not a generic facility for accessing external
2355libraries; only those already known by Emacs will be loaded. */);
2356 Vdynamic_library_alist = Qnil;
2357 Fput (intern_c_string ("dynamic-library-alist"), Qrisky_local_variable, Qt);
2358
fc012771
SM
2359 /* Make sure IS_DAEMON starts up as false. */
2360 daemon_pipe[1] = 0;
f927c5ae 2361}