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