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