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