(redisplay): Limit prev change to pause != 0.
[bpt/emacs.git] / src / emacs.c
CommitLineData
f927c5ae 1/* Fully extensible Emacs, running on Unix, intended for GNU.
be06db9a 2 Copyright (C) 1985, 1986, 1987, 1993, 1994 Free Software Foundation, Inc.
f927c5ae
JB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
40be253a 8the Free Software Foundation; either version 2, or (at your option)
f927c5ae
JB
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21#include <signal.h>
22#include <errno.h>
23
18160b98 24#include <config.h>
f927c5ae
JB
25#include <stdio.h>
26
27#include <sys/types.h>
28#include <sys/file.h>
29
30#ifdef VMS
31#include <ssdef.h>
32#endif
33
f927c5ae
JB
34#ifdef BSD
35#include <sys/ioctl.h>
36#endif
37
38#ifdef APOLLO
39#ifndef APOLLO_SR10
40#include <default_acl.h>
41#endif
42#endif
43
f927c5ae
JB
44#include "lisp.h"
45#include "commands.h"
bef79ee4 46#include "intervals.h"
f927c5ae 47
edc8ae07 48#include "systty.h"
8090eb09 49#include "syssignal.h"
6c362a8b 50#include "process.h"
a41f8bed 51
f927c5ae
JB
52#ifndef O_RDWR
53#define O_RDWR 2
54#endif
55
43165242
KH
56extern void malloc_warning ();
57extern char *index ();
58extern char *strerror ();
59
f927c5ae
JB
60/* Command line args from shell, as list of strings */
61Lisp_Object Vcommand_line_args;
62
59653951
JB
63/* The name under which Emacs was invoked, with any leading directory
64 names discarded. */
65Lisp_Object Vinvocation_name;
66
ace40a69
RS
67/* The directory name from which Emacs was invoked. */
68Lisp_Object Vinvocation_directory;
69
07f4d123
RS
70/* The directory name in which to find subdirs such as lisp and etc.
71 nil means get them only from PATH_LOADSEARCH. */
72Lisp_Object Vinstallation_directory;
73
e5d77022
JB
74/* Hook run by `kill-emacs' before it does really anything. */
75Lisp_Object Vkill_emacs_hook;
76
f927c5ae
JB
77/* Set nonzero after Emacs has started up the first time.
78 Prevents reinitialization of the Lisp world and keymaps
79 on subsequent starts. */
80int initialized;
81
271c7b7c 82/* Variable whose value is symbol giving operating system type. */
f927c5ae 83Lisp_Object Vsystem_type;
271c7b7c
RS
84
85/* Variable whose value is string giving configuration built for. */
86Lisp_Object Vsystem_configuration;
f927c5ae
JB
87
88/* If non-zero, emacs should not attempt to use an window-specific code,
89 but instead should use the virtual terminal under which it was started */
90int inhibit_window_system;
91
5aa7f46a
JB
92/* If nonzero, set Emacs to run at this priority. This is also used
93 in child_setup and sys_suspend to make sure subshells run at normal
94 priority; Those functions have their own extern declaration. */
3005da00
RS
95int emacs_priority;
96
647cec74 97#ifdef BSD_PGRPS
9ae8f997
JB
98/* See sysdep.c. */
99extern int inherited_pgroup;
100#endif
101
f927c5ae
JB
102#ifdef HAVE_X_WINDOWS
103/* If non-zero, -d was specified, meaning we're using some window system. */
104int display_arg;
105#endif
106
107/* An address near the bottom of the stack.
108 Tells GC how to save a copy of the stack. */
109char *stack_bottom;
110
111#ifdef HAVE_X_WINDOWS
112extern Lisp_Object Vwindow_system;
113#endif /* HAVE_X_WINDOWS */
114
115#ifdef USG_SHARED_LIBRARIES
116/* If nonzero, this is the place to put the end of the writable segment
117 at startup. */
118
119unsigned int bss_end = 0;
120#endif
121
122/* Nonzero means running Emacs without interactive terminal. */
123
124int noninteractive;
125
126/* Value of Lisp variable `noninteractive'.
127 Normally same as C variable `noninteractive'
128 but nothing terrible happens if user sets this one. */
129
130int noninteractive1;
131\f
132/* Signal code for the fatal signal that was received */
133int fatal_error_code;
134
135/* Nonzero if handling a fatal error already */
136int fatal_error_in_progress;
137
138/* Handle bus errors, illegal instruction, etc. */
2447c626 139SIGTYPE
f927c5ae
JB
140fatal_error_signal (sig)
141 int sig;
142{
f927c5ae
JB
143 fatal_error_code = sig;
144 signal (sig, SIG_DFL);
145
146 /* If fatal error occurs in code below, avoid infinite recursion. */
8090eb09
JB
147 if (! fatal_error_in_progress)
148 {
149 fatal_error_in_progress = 1;
f927c5ae 150
f7ab4e3d 151 shut_down_emacs (sig, 0, Qnil);
8090eb09 152 }
f927c5ae
JB
153
154#ifdef VMS
f927c5ae
JB
155 LIB$STOP (SS$_ABORT);
156#else
8090eb09
JB
157 /* Signal the same code; this time it will really be fatal.
158 Remember that since we're in a signal handler, the signal we're
159 going to send is probably blocked, so we have to unblock it if we
160 want to really receive it. */
29b89fe0 161#ifndef MSDOS
a90538cb 162 sigunblock (sigmask (fatal_error_code));
29b89fe0 163#endif
f927c5ae
JB
164 kill (getpid (), fatal_error_code);
165#endif /* not VMS */
166}
271c7b7c
RS
167
168#ifdef SIGDANGER
169
16c323ee 170/* Handler for SIGDANGER. */
271c7b7c
RS
171SIGTYPE
172memory_warning_signal (sig)
173 int sig;
174{
175 signal (sig, memory_warning_signal);
176
177 malloc_warning ("Operating system warns that virtual memory is running low.\n");
55796183
RS
178
179 /* It might be unsafe to call do_auto_save now. */
180 force_auto_save_soon ();
271c7b7c
RS
181}
182#endif
f927c5ae
JB
183\f
184/* Code for dealing with Lisp access to the Unix command line */
185
186static
187init_cmdargs (argc, argv, skip_args)
188 int argc;
189 char **argv;
190 int skip_args;
191{
192 register int i;
07f4d123 193 Lisp_Object name, dir;
f927c5ae 194
cb421be8 195 Vinvocation_name = Ffile_name_nondirectory (build_string (argv[0]));
ace40a69
RS
196 Vinvocation_directory = Ffile_name_directory (build_string (argv[0]));
197 /* If we got no directory in argv[0], search PATH to find where
198 Emacs actually came from. */
199 if (NILP (Vinvocation_directory))
200 {
201 Lisp_Object found;
202 int yes = openp (Vexec_path, Vinvocation_name,
6c362a8b 203 EXEC_SUFFIXES, &found, 1);
e443f843 204 if (yes == 1)
ace40a69
RS
205 Vinvocation_directory = Ffile_name_directory (found);
206 }
59653951 207
07f4d123
RS
208 Vinstallation_directory = Qnil;
209
210 if (!NILP (Vinvocation_directory))
211 {
212 dir = Vinvocation_directory;
213 name = Fexpand_file_name (Vinvocation_name, dir);
214 while (1)
215 {
f5ab9736 216 Lisp_Object tem, lib_src_exists;
07f4d123
RS
217 Lisp_Object etc_exists, info_exists;
218
f5ab9736
RS
219 /* See if dir contains subdirs for use by Emacs.
220 Check for the ones that would exist in a build directory,
221 not including lisp and info. */
222 tem = Fexpand_file_name (build_string ("lib-src"), dir);
223 lib_src_exists = Ffile_exists_p (tem);
224 if (!NILP (lib_src_exists))
07f4d123 225 {
f5ab9736
RS
226 tem = Fexpand_file_name (build_string ("etc"), dir);
227 etc_exists = Ffile_exists_p (tem);
228 if (!NILP (etc_exists))
07f4d123 229 {
f5ab9736
RS
230 Vinstallation_directory
231 = Ffile_name_as_directory (dir);
232 break;
07f4d123
RS
233 }
234 }
235
236 /* See if dir's parent contains those subdirs. */
f5ab9736
RS
237 tem = Fexpand_file_name (build_string ("../lib-src"), dir);
238 lib_src_exists = Ffile_exists_p (tem);
239 if (!NILP (lib_src_exists))
07f4d123 240 {
f5ab9736
RS
241 tem = Fexpand_file_name (build_string ("../etc"), dir);
242 etc_exists = Ffile_exists_p (tem);
243 if (!NILP (etc_exists))
07f4d123 244 {
f5ab9736
RS
245 tem = Fexpand_file_name (build_string (".."), dir);
246 Vinstallation_directory
247 = Ffile_name_as_directory (tem);
248 break;
07f4d123
RS
249 }
250 }
251
252 /* If the Emacs executable is actually a link,
253 next try the dir that the link points into. */
254 tem = Ffile_symlink_p (name);
255 if (!NILP (tem))
256 {
257 name = tem;
258 dir = Ffile_name_directory (name);
259 }
260 else
261 break;
262 }
263 }
264
f927c5ae
JB
265 Vcommand_line_args = Qnil;
266
267 for (i = argc - 1; i >= 0; i--)
268 {
269 if (i == 0 || i > skip_args)
270 Vcommand_line_args
271 = Fcons (build_string (argv[i]), Vcommand_line_args);
272 }
273}
59653951
JB
274
275DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
276 "Return the program name that was used to run Emacs.\n\
277Any directory names are omitted.")
278 ()
279{
280 return Fcopy_sequence (Vinvocation_name);
281}
282
ace40a69
RS
283DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
284 0, 0, 0,
285 "Return the directory name in which the Emacs executable was located")
286 ()
287{
288 return Fcopy_sequence (Vinvocation_directory);
289}
290
f927c5ae
JB
291\f
292#ifdef VMS
293#ifdef LINK_CRTL_SHARE
294#ifdef SHAREABLE_LIB_BUG
295extern noshare char **environ;
296#endif /* SHAREABLE_LIB_BUG */
297#endif /* LINK_CRTL_SHARE */
298#endif /* VMS */
299
a90538cb 300#ifndef ORDINARY_LINK
efd241cc
RS
301/* We don't include crtbegin.o and crtend.o in the link,
302 so these functions and variables might be missed.
303 Provide dummy definitions to avoid error.
304 (We don't have any real constructors or destructors.) */
305#ifdef __GNUC__
46e65b73 306#ifndef GCC_CTORS_IN_LIBC
c83a7064 307__do_global_ctors ()
efd241cc 308{}
c83a7064
RS
309__do_global_ctors_aux ()
310{}
33143604
RS
311__do_global_dtors ()
312{}
64c1864a
RS
313/* Linux has a bug in its library; avoid an error. */
314#ifndef LINUX
c83a7064 315char * __CTOR_LIST__[2] = { (char *) (-1), 0 };
64c1864a 316#endif
c83a7064 317char * __DTOR_LIST__[2] = { (char *) (-1), 0 };
46e65b73 318#endif /* GCC_CTORS_IN_LIBC */
c83a7064 319__main ()
efd241cc 320{}
efd241cc 321#endif /* __GNUC__ */
a90538cb 322#endif /* ORDINARY_LINK */
efd241cc 323
f927c5ae
JB
324/* ARGSUSED */
325main (argc, argv, envp)
326 int argc;
327 char **argv;
328 char **envp;
329{
330 char stack_bottom_variable;
331 int skip_args = 0;
332 extern int errno;
333 extern sys_nerr;
f927c5ae
JB
334
335/* Map in shared memory, if we are using that. */
336#ifdef HAVE_SHM
337 if (argc > 1 && !strcmp (argv[1], "-nl"))
338 {
339 map_in_data (0);
340 /* The shared memory was just restored, which clobbered this. */
341 skip_args = 1;
342 }
343 else
344 {
345 map_in_data (1);
346 /* The shared memory was just restored, which clobbered this. */
347 skip_args = 0;
348 }
349#endif
350
19a36ec6 351#ifdef NeXT
4b163808 352 extern int malloc_cookie;
19a36ec6
RS
353
354 /* This helps out unexnext.c. */
355 if (initialized)
356 if (malloc_jumpstart (malloc_cookie) != 0)
357 printf ("malloc jumpstart failed!\n");
358#endif /* NeXT */
359
f927c5ae 360#ifdef HAVE_X_WINDOWS
fb8e9847
JB
361 /* Stupid kludge to catch command-line display spec. We can't
362 handle this argument entirely in window system dependent code
363 because we don't even know which window system dependent code
364 to run until we've recognized this argument. */
f927c5ae
JB
365 {
366 int i;
367
368 for (i = 1; (i < argc && ! display_arg); i++)
92381c7c 369 if (!strcmp (argv[i], "-d") || !strcmp (argv[i], "-display"))
f927c5ae
JB
370 display_arg = 1;
371 }
372#endif
373
374#ifdef VMS
375 /* If -map specified, map the data file in */
376 if (argc > 2 && ! strcmp (argv[1], "-map"))
377 {
378 skip_args = 2;
379 mapin_data (argv[2]);
380 }
381
382#ifdef LINK_CRTL_SHARE
383#ifdef SHAREABLE_LIB_BUG
384 /* Bletcherous shared libraries! */
385 if (!stdin)
386 stdin = fdopen (0, "r");
387 if (!stdout)
388 stdout = fdopen (1, "w");
389 if (!stderr)
390 stderr = fdopen (2, "w");
391 if (!environ)
392 environ = envp;
393#endif /* SHAREABLE_LIB_BUG */
394#endif /* LINK_CRTL_SHARE */
395#endif /* VMS */
396
397 /* Record (approximately) where the stack begins. */
398 stack_bottom = &stack_bottom_variable;
399
400#ifdef RUN_TIME_REMAP
401 if (initialized)
402 run_time_remap (argv[0]);
403#endif
404
405#ifdef USG_SHARED_LIBRARIES
406 if (bss_end)
407 brk (bss_end);
408#endif
409
410 clearerr (stdin);
9ae8f997 411
391fb073 412 if (! noninteractive1)
e8589b11 413 {
391fb073
RS
414#ifdef BSD_PGRPS
415 if (initialized)
416 {
417 inherited_pgroup = EMACS_GETPGRP (0);
418 setpgrp (0, getpid ());
419 }
b026af49
RS
420#else
421#if defined (USG5) && defined (INTERRUPT_INPUT)
391fb073 422 setpgrp ();
b026af49 423#endif
f927c5ae 424#endif
391fb073 425 }
9ae8f997 426
f927c5ae
JB
427#ifdef APOLLO
428#ifndef APOLLO_SR10
429 /* If USE_DOMAIN_ACLS environment variable exists,
430 use ACLs rather than UNIX modes. */
431 if (egetenv ("USE_DOMAIN_ACLS"))
432 default_acl (USE_DEFACL);
433#endif
434#endif /* APOLLO */
435
436#ifndef SYSTEM_MALLOC
437 if (! initialized)
9ac0d9e0
JB
438 {
439 /* Arrange to get warning messages as memory fills up. */
440 memory_warnings (0, malloc_warning);
441
442 /* Arrange to disable interrupt input while malloc and friends are
443 running. */
444 uninterrupt_malloc ();
445 }
f927c5ae
JB
446#endif /* not SYSTEM_MALLOC */
447
29b89fe0
RS
448#ifdef MSDOS
449 /* We do all file input/output as binary files. When we need to translate
450 newlines, we do that manually. */
451 _fmode = O_BINARY;
452 (stdin)->_flag &= ~_IOTEXT;
453 (stdout)->_flag &= ~_IOTEXT;
454 (stderr)->_flag &= ~_IOTEXT;
455#endif /* MSDOS */
456
a422068f 457#ifdef SET_EMACS_PRIORITY
3005da00 458 if (emacs_priority)
5aa7f46a 459 nice (emacs_priority);
f927c5ae 460 setuid (getuid ());
a422068f 461#endif /* SET_EMACS_PRIORITY */
f927c5ae 462
d8b3a65d 463#ifdef EXTRA_INITIALIZE
a9260219 464 EXTRA_INITIALIZE;
d8b3a65d
RS
465#endif
466
f927c5ae
JB
467 inhibit_window_system = 0;
468
4fc0b45b 469 /* Handle the -t switch, which specifies filename to use as terminal */
f927c5ae
JB
470 if (skip_args + 2 < argc && !strcmp (argv[skip_args + 1], "-t"))
471 {
472 int result;
473 skip_args += 2;
474 close (0);
475 close (1);
476 result = open (argv[skip_args], O_RDWR, 2 );
477 if (result < 0)
478 {
be06db9a 479 char *errstring = strerror (errno);
f927c5ae
JB
480 fprintf (stderr, "emacs: %s: %s\n", argv[skip_args], errstring);
481 exit (1);
482 }
483 dup (0);
484 if (! isatty (0))
485 {
486 fprintf (stderr, "emacs: %s: not a tty\n", argv[skip_args]);
487 exit (1);
488 }
489 fprintf (stderr, "Using %s\n", argv[skip_args]);
490#ifdef HAVE_X_WINDOWS
491 inhibit_window_system = 1; /* -t => -nw */
492#endif
493 }
494
495 if (skip_args + 1 < argc
496 && (!strcmp (argv[skip_args + 1], "-nw")))
497 {
498 skip_args += 1;
499 inhibit_window_system = 1;
500 }
501
502/* Handle the -batch switch, which means don't do interactive display. */
503 noninteractive = 0;
504 if (skip_args + 1 < argc && !strcmp (argv[skip_args + 1], "-batch"))
505 {
506 skip_args += 1;
507 noninteractive = 1;
508 }
509
fb8e9847
JB
510#ifdef POSIX_SIGNALS
511 init_signals ();
512#endif
513
f927c5ae
JB
514 if (
515#ifndef CANNOT_DUMP
516 ! noninteractive || initialized
517#else
518 1
519#endif
520 )
521 {
522 /* Don't catch these signals in batch mode if not initialized.
523 On some machines, this sets static data that would make
524 signal fail to work right when the dumped Emacs is run. */
525 signal (SIGHUP, fatal_error_signal);
526 signal (SIGQUIT, fatal_error_signal);
527 signal (SIGILL, fatal_error_signal);
528 signal (SIGTRAP, fatal_error_signal);
a90538cb
JB
529#ifdef SIGIOT
530 /* This is missing on some systems - OS/2, for example. */
f927c5ae 531 signal (SIGIOT, fatal_error_signal);
a90538cb 532#endif
f927c5ae
JB
533#ifdef SIGEMT
534 signal (SIGEMT, fatal_error_signal);
535#endif
536 signal (SIGFPE, fatal_error_signal);
00eaaa32 537#ifdef SIGBUS
f927c5ae 538 signal (SIGBUS, fatal_error_signal);
00eaaa32 539#endif
f927c5ae 540 signal (SIGSEGV, fatal_error_signal);
00eaaa32 541#ifdef SIGSYS
f927c5ae 542 signal (SIGSYS, fatal_error_signal);
00eaaa32 543#endif
f927c5ae
JB
544 signal (SIGTERM, fatal_error_signal);
545#ifdef SIGXCPU
546 signal (SIGXCPU, fatal_error_signal);
547#endif
548#ifdef SIGXFSZ
549 signal (SIGXFSZ, fatal_error_signal);
550#endif /* SIGXFSZ */
551
271c7b7c
RS
552#ifdef SIGDANGER
553 /* This just means available memory is getting low. */
554 signal (SIGDANGER, memory_warning_signal);
555#endif
556
f927c5ae 557#ifdef AIX
56e034fa
RS
558/* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
559 signal (SIGXCPU, fatal_error_signal);
0aef8561 560#ifndef _I386
f927c5ae 561 signal (SIGIOINT, fatal_error_signal);
0aef8561 562#endif
f927c5ae
JB
563 signal (SIGGRANT, fatal_error_signal);
564 signal (SIGRETRACT, fatal_error_signal);
565 signal (SIGSOUND, fatal_error_signal);
566 signal (SIGMSG, fatal_error_signal);
567#endif /* AIX */
568 }
569
570 noninteractive1 = noninteractive;
571
572/* Perform basic initializations (not merely interning symbols) */
573
574 if (!initialized)
575 {
576 init_alloc_once ();
577 init_obarray ();
578 init_eval_once ();
579 init_syntax_once (); /* Create standard syntax table. */
580 /* Must be done before init_buffer */
581 init_casetab_once ();
582 init_buffer_once (); /* Create buffer table and some buffers */
583 init_minibuf_once (); /* Create list of minibuffers */
584 /* Must precede init_window_once */
585 init_window_once (); /* Init the window system */
586 }
587
588 init_alloc ();
f927c5ae
JB
589 init_eval ();
590 init_data ();
0e956009 591
29b89fe0
RS
592#ifdef MSDOS
593 /* Call early 'cause init_environment needs it. */
594 init_dosfns ();
595 /* Set defaults for several environment variables. */
596 if (initialized) init_environment (argc, argv, skip_args);
597#endif
598
0e956009
JB
599 /* egetenv is a pretty low-level facility, which may get called in
600 many circumstances; it seems flimsy to put off initializing it
601 until calling init_callproc. */
602 set_process_environment ();
93aed04d
RS
603 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
604 if this is not done. Do it after set_process_environment so that we
605 don't pollute Vprocess_environment. */
606#ifdef AIX
607 putenv ("LANG=C");
608#endif
0e956009 609
ace40a69
RS
610 init_buffer (); /* Init default directory of main buffer */
611
7928f0b5 612 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
ace40a69 613 init_cmdargs (argc, argv, skip_args); /* Must precede init_lread. */
7928f0b5 614 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
fb8e9847 615 init_lread ();
f927c5ae 616
f927c5ae
JB
617 if (!noninteractive)
618 {
619#ifdef VMS
1cbd5d9d 620 init_vms_input ();/* init_display calls get_frame_size, that needs this */
f927c5ae
JB
621#endif /* VMS */
622 init_display (); /* Determine terminal type. init_sys_modes uses results */
623 }
624 init_keyboard (); /* This too must precede init_sys_modes */
f927c5ae
JB
625#ifdef VMS
626 init_vmsproc (); /* And this too. */
627#endif /* VMS */
628 init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.) */
629 init_xdisp ();
630 init_macros ();
631 init_editfns ();
632#ifdef LISP_FLOAT_TYPE
633 init_floatfns ();
634#endif
635#ifdef VMS
636 init_vmsfns ();
637#endif /* VMS */
f927c5ae 638 init_process ();
32676c08
JB
639#ifdef CLASH_DETECTION
640 init_filelock ();
641#endif /* CLASH_DETECTION */
f927c5ae
JB
642
643/* Intern the names of all standard functions and variables; define standard keys */
644
645 if (!initialized)
646 {
647 /* The basic levels of Lisp must come first */
648 /* And data must come first of all
649 for the sake of symbols like error-message */
650 syms_of_data ();
651 syms_of_alloc ();
fb8e9847 652 syms_of_lread ();
f927c5ae
JB
653 syms_of_print ();
654 syms_of_eval ();
655 syms_of_fns ();
f927c5ae 656 syms_of_floatfns ();
f927c5ae
JB
657
658 syms_of_abbrev ();
659 syms_of_buffer ();
660 syms_of_bytecode ();
661 syms_of_callint ();
662 syms_of_casefiddle ();
663 syms_of_casetab ();
664 syms_of_callproc ();
665 syms_of_cmds ();
666#ifndef NO_DIR_LIBRARY
667 syms_of_dired ();
668#endif /* not NO_DIR_LIBRARY */
669 syms_of_display ();
670 syms_of_doc ();
671 syms_of_editfns ();
672 syms_of_emacs ();
673 syms_of_fileio ();
674#ifdef CLASH_DETECTION
675 syms_of_filelock ();
676#endif /* CLASH_DETECTION */
677 syms_of_indent ();
678 syms_of_keyboard ();
679 syms_of_keymap ();
680 syms_of_macros ();
681 syms_of_marker ();
682 syms_of_minibuf ();
683 syms_of_mocklisp ();
f927c5ae 684 syms_of_process ();
f927c5ae 685 syms_of_search ();
1cbd5d9d 686 syms_of_frame ();
f927c5ae 687 syms_of_syntax ();
0d934e7b 688 syms_of_term ();
f927c5ae 689 syms_of_undo ();
bef79ee4
JA
690
691 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
692 syms_of_textprop ();
f927c5ae
JB
693#ifdef VMS
694 syms_of_vmsproc ();
695#endif /* VMS */
696 syms_of_window ();
697 syms_of_xdisp ();
698#ifdef HAVE_X_WINDOWS
72412588 699 syms_of_xterm ();
f927c5ae 700 syms_of_xfns ();
9c3f23b7 701 syms_of_xfaces ();
72412588
JB
702#ifdef HAVE_X11
703 syms_of_xselect ();
704#endif
dbc4e1c1 705#ifdef HAVE_X_MENU
f927c5ae
JB
706 syms_of_xmenu ();
707#endif /* HAVE_X_MENU */
708#endif /* HAVE_X_WINDOWS */
709
710#ifdef SYMS_SYSTEM
711 SYMS_SYSTEM;
712#endif
713
714#ifdef SYMS_MACHINE
715 SYMS_MACHINE;
716#endif
717
718 keys_of_casefiddle ();
719 keys_of_cmds ();
720 keys_of_buffer ();
721 keys_of_keyboard ();
722 keys_of_keymap ();
723 keys_of_macros ();
724 keys_of_minibuf ();
725 keys_of_window ();
5e67fbc2 726 keys_of_frame ();
f927c5ae
JB
727 }
728
729 if (!initialized)
730 {
731 /* Handle -l loadup-and-dump, args passed by Makefile. */
732 if (argc > 2 + skip_args && !strcmp (argv[1 + skip_args], "-l"))
733 Vtop_level = Fcons (intern ("load"),
734 Fcons (build_string (argv[2 + skip_args]), Qnil));
735#ifdef CANNOT_DUMP
736 /* Unless next switch is -nl, load "loadup.el" first thing. */
737 if (!(argc > 1 + skip_args && !strcmp (argv[1 + skip_args], "-nl")))
738 Vtop_level = Fcons (intern ("load"),
739 Fcons (build_string ("loadup.el"), Qnil));
740#endif /* CANNOT_DUMP */
741 }
742
743 initialized = 1;
744
afe9fae9
RS
745#if defined (sun) || defined (LOCALTIME_CACHE)
746 /* sun's localtime has a bug. it caches the value of the time
279cc2b8
JB
747 zone rather than looking it up every time. Since localtime() is
748 called to bolt the undumping time into the undumped emacs, this
afe9fae9
RS
749 results in localtime ignoring the TZ environment variable.
750 This flushes the new TZ value into localtime. */
751 tzset ();
752#endif /* defined (sun) || defined (LOCALTIME_CACHE) */
279cc2b8 753
f927c5ae
JB
754 /* Enter editor command loop. This never returns. */
755 Frecursive_edit ();
756 /* NOTREACHED */
757}
758\f
759DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
edc8ae07 760 "Exit the Emacs job and kill it.\n\
f927c5ae
JB
761If ARG is an integer, return ARG as the exit program code.\n\
762If ARG is a string, stuff it as keyboard input.\n\n\
763The value of `kill-emacs-hook', if not void,\n\
764is a list of functions (of no args),\n\
765all of which are called before Emacs is actually killed.")
766 (arg)
767 Lisp_Object arg;
768{
769 Lisp_Object hook, hook1;
770 int i;
771 struct gcpro gcpro1;
772
773 GCPRO1 (arg);
774
775 if (feof (stdin))
776 arg = Qt;
777
2447c626 778 if (!NILP (Vrun_hooks) && !noninteractive)
f927c5ae
JB
779 call1 (Vrun_hooks, intern ("kill-emacs-hook"));
780
f927c5ae
JB
781 UNGCPRO;
782
783/* Is it really necessary to do this deassign
784 when we are going to exit anyway? */
785/* #ifdef VMS
786 stop_vms_input ();
787 #endif */
40be253a 788
d0068e25 789 shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil);
40be253a 790
f927c5ae
JB
791 exit ((XTYPE (arg) == Lisp_Int) ? XINT (arg)
792#ifdef VMS
793 : 1
794#else
795 : 0
796#endif
797 );
798 /* NOTREACHED */
799}
40be253a
JB
800
801
802/* Perform an orderly shutdown of Emacs. Autosave any modified
803 buffers, kill any child processes, clean up the terminal modes (if
804 we're in the foreground), and other stuff like that. Don't perform
805 any redisplay; this may be called when Emacs is shutting down in
806 the background, or after its X connection has died.
807
808 If SIG is a signal number, print a message for it.
809
810 This is called by fatal signal handlers, X protocol error handlers,
811 and Fkill_emacs. */
f7ab4e3d 812
40be253a 813void
f7ab4e3d 814shut_down_emacs (sig, no_x, stuff)
41423a80 815 int sig, no_x;
f7ab4e3d 816 Lisp_Object stuff;
40be253a 817{
829d872b
RS
818 /* Prevent running of hooks from now on. */
819 Vrun_hooks = Qnil;
820
40be253a
JB
821 /* If we are controlling the terminal, reset terminal modes */
822#ifdef EMACS_HAVE_TTY_PGRP
823 {
d04d81d2
RS
824 int pgrp = EMACS_GETPGRP (0);
825
40be253a
JB
826 int tpgrp;
827 if (EMACS_GET_TTY_PGRP (0, &tpgrp) != -1
5a570e37 828 && tpgrp == pgrp)
40be253a
JB
829 {
830 fflush (stdout);
831 reset_sys_modes ();
832 if (sig && sig != SIGTERM)
833 fprintf (stderr, "Fatal error (%d).", sig);
834 }
835 }
836#else
837 fflush (stdout);
838 reset_sys_modes ();
839#endif
840
f7ab4e3d
RS
841 stuff_buffered_input (stuff);
842
40be253a
JB
843 kill_buffer_processes (Qnil);
844 Fdo_auto_save (Qt, Qnil);
845
846#ifdef CLASH_DETECTION
847 unlock_all_files ();
848#endif
849
850#ifdef VMS
851 kill_vms_processes ();
852#endif
853
41423a80 854#ifdef HAVE_X_WINDOWS
f7511647
RS
855 /* It's not safe to call intern here. Maybe we are crashing. */
856 if (!noninteractive && SYMBOLP (Vwindow_system)
857 && XSYMBOL (Vwindow_system)->name->size == 1
858 && XSYMBOL (Vwindow_system)->name->data[0] == 'x'
859 && ! no_x)
41423a80
RS
860 Fx_close_current_connection ();
861#endif /* HAVE_X_WINDOWS */
862
40be253a
JB
863#ifdef SIGIO
864 /* There is a tendency for a SIGIO signal to arrive within exit,
865 and cause a SIGHUP because the input descriptor is already closed. */
866 unrequest_sigio ();
867 signal (SIGIO, SIG_IGN);
868#endif
869}
870
871
f927c5ae
JB
872\f
873#ifndef CANNOT_DUMP
874/* Nothing like this can be implemented on an Apollo.
875 What a loss! */
876
877#ifdef HAVE_SHM
878
879DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0,
880 "Dump current state of Emacs into data file FILENAME.\n\
881This function exists on systems that use HAVE_SHM.")
882 (intoname)
883 Lisp_Object intoname;
884{
885 extern int my_edata;
886 Lisp_Object tem;
f927c5ae
JB
887
888 CHECK_STRING (intoname, 0);
889 intoname = Fexpand_file_name (intoname, Qnil);
890
891 tem = Vpurify_flag;
892 Vpurify_flag = Qnil;
893
894 fflush (stdout);
895 /* Tell malloc where start of impure now is */
896 /* Also arrange for warnings when nearly out of space. */
897#ifndef SYSTEM_MALLOC
70eb2c3e 898 memory_warnings (&my_edata, malloc_warning);
f927c5ae
JB
899#endif
900 map_out_data (XSTRING (intoname)->data);
901
902 Vpurify_flag = tem;
903
904 return Qnil;
905}
906
907#else /* not HAVE_SHM */
908
909DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
910 "Dump current state of Emacs into executable file FILENAME.\n\
911Take symbols from SYMFILE (presumably the file you executed to run Emacs).\n\
912This is used in the file `loadup.el' when building Emacs.\n\
913\n\
914Bind `command-line-processed' to nil before dumping,\n\
915if you want the dumped Emacs to process its command line\n\
916and announce itself normally when it is run.")
917 (intoname, symname)
918 Lisp_Object intoname, symname;
919{
920 extern int my_edata;
921 Lisp_Object tem;
f927c5ae
JB
922
923 CHECK_STRING (intoname, 0);
924 intoname = Fexpand_file_name (intoname, Qnil);
2447c626 925 if (!NILP (symname))
f927c5ae
JB
926 {
927 CHECK_STRING (symname, 0);
928 if (XSTRING (symname)->size)
929 symname = Fexpand_file_name (symname, Qnil);
930 }
931
932 tem = Vpurify_flag;
933 Vpurify_flag = Qnil;
934
935 fflush (stdout);
936#ifdef VMS
937 mapout_data (XSTRING (intoname)->data);
938#else
939 /* Tell malloc where start of impure now is */
940 /* Also arrange for warnings when nearly out of space. */
941#ifndef SYSTEM_MALLOC
70eb2c3e 942 memory_warnings (&my_edata, malloc_warning);
f927c5ae
JB
943#endif
944 unexec (XSTRING (intoname)->data,
2447c626 945 !NILP (symname) ? XSTRING (symname)->data : 0, &my_edata, 0, 0);
f927c5ae
JB
946#endif /* not VMS */
947
948 Vpurify_flag = tem;
949
950 return Qnil;
951}
952
953#endif /* not HAVE_SHM */
954
955#endif /* not CANNOT_DUMP */
956\f
4b163808 957#ifndef SEPCHAR
f927c5ae
JB
958#define SEPCHAR ':'
959#endif
960
961Lisp_Object
962decode_env_path (evarname, defalt)
963 char *evarname, *defalt;
964{
965 register char *path, *p;
f927c5ae
JB
966
967 Lisp_Object lpath;
968
2447c626
JB
969 /* It's okay to use getenv here, because this function is only used
970 to initialize variables when Emacs starts up, and isn't called
971 after that. */
e065a56e
JB
972 if (evarname != 0)
973 path = (char *) getenv (evarname);
974 else
975 path = 0;
f927c5ae
JB
976 if (!path)
977 path = defalt;
978 lpath = Qnil;
979 while (1)
980 {
981 p = index (path, SEPCHAR);
982 if (!p) p = path + strlen (path);
983 lpath = Fcons (p - path ? make_string (path, p - path) : Qnil,
984 lpath);
985 if (*p)
986 path = p + 1;
987 else
988 break;
989 }
990 return Fnreverse (lpath);
991}
992
993syms_of_emacs ()
994{
83591e66 995#ifndef CANNOT_DUMP
f927c5ae
JB
996#ifdef HAVE_SHM
997 defsubr (&Sdump_emacs_data);
998#else
999 defsubr (&Sdump_emacs);
83591e66 1000#endif
f927c5ae
JB
1001#endif
1002
1003 defsubr (&Skill_emacs);
1004
59653951 1005 defsubr (&Sinvocation_name);
ace40a69 1006 defsubr (&Sinvocation_directory);
59653951 1007
f927c5ae
JB
1008 DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
1009 "Args passed by shell to Emacs, as a list of strings.");
1010
1011 DEFVAR_LISP ("system-type", &Vsystem_type,
1012 "Value is symbol indicating type of operating system you are using.");
1013 Vsystem_type = intern (SYSTEM_TYPE);
1014
271c7b7c
RS
1015 DEFVAR_LISP ("system-configuration", &Vsystem_configuration,
1016 "Value is string indicating configuration Emacs was built for.");
f7511647 1017 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
271c7b7c 1018
f927c5ae
JB
1019 DEFVAR_BOOL ("noninteractive", &noninteractive1,
1020 "Non-nil means Emacs is running without interactive terminal.");
e5d77022 1021
e5d77022 1022 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
edc8ae07
JB
1023 "Hook to be run whenever kill-emacs is called.\n\
1024Since kill-emacs may be invoked when the terminal is disconnected (or\n\
1025in other similar situations), functions placed on this hook should not\n\
679aee02 1026expect to be able to interact with the user.");
edc8ae07 1027 Vkill_emacs_hook = Qnil;
3005da00
RS
1028
1029 DEFVAR_INT ("emacs-priority", &emacs_priority,
1030 "Priority for Emacs to run at.\n\
1031This value is effective only if set before Emacs is dumped,\n\
1032and only if the Emacs executable is installed with setuid to permit\n\
621ecf99 1033it to change priority. (Emacs sets its uid back to the real uid.)\n\
a422068f 1034Currently, you need to define SET_EMACS_PRIORITY in `config.h'\n\
ce305b11 1035before you compile Emacs, to enable the code for this feature.");
3005da00 1036 emacs_priority = 0;
59653951 1037
f67de86f
RS
1038 DEFVAR_LISP ("invocation-name", &Vinvocation_name,
1039 "The program name that was used to run Emacs.\n\
1040Any directory names are omitted.");
1041
1042 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory,
1043 "The directory in which the Emacs executable was found, to run it.\n\
1044The value is nil if that directory's name is not known.");
1045
1046 DEFVAR_LISP ("installation-directory", &Vinstallation_directory,
1047 "A directory within which to look for the `lib-src' and `etc' directories.\n\
1048This is non-nil when we can't find those directories in their standard\n\
1049installed locations, but we can find them\n\
1050near where the Emacs executable was found.");
07f4d123 1051 Vinstallation_directory = Qnil;
f927c5ae 1052}