* callint.c (Fcall_interactively): Allow multiple 'e' specs.
[bpt/emacs.git] / src / emacs.c
CommitLineData
f927c5ae 1/* Fully extensible Emacs, running on Unix, intended for GNU.
d1af74e9 2 Copyright (C) 1985, 1986, 1987, 1992 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
8the Free Software Foundation; either version 1, or (at your option)
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
24#include "config.h"
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
2447c626
JB
38#ifdef HAVE_TERMIOS
39#include <termios.h>
40#endif
41
f927c5ae
JB
42#ifdef APOLLO
43#ifndef APOLLO_SR10
44#include <default_acl.h>
45#endif
46#endif
47
f927c5ae
JB
48#include "lisp.h"
49#include "commands.h"
bef79ee4 50#include "intervals.h"
f927c5ae 51
edc8ae07 52#include "systty.h"
a41f8bed 53
f927c5ae
JB
54#ifndef O_RDWR
55#define O_RDWR 2
56#endif
57
58#define PRIO_PROCESS 0
59
60/* Command line args from shell, as list of strings */
61Lisp_Object Vcommand_line_args;
62
e5d77022
JB
63/* Hook run by `kill-emacs' before it does really anything. */
64Lisp_Object Vkill_emacs_hook;
65
f927c5ae
JB
66/* Set nonzero after Emacs has started up the first time.
67 Prevents reinitialization of the Lisp world and keymaps
68 on subsequent starts. */
69int initialized;
70
71/* Variable whose value is symbol giving operating system type */
72Lisp_Object Vsystem_type;
73
74/* If non-zero, emacs should not attempt to use an window-specific code,
75 but instead should use the virtual terminal under which it was started */
76int inhibit_window_system;
77
5aa7f46a
JB
78/* If nonzero, set Emacs to run at this priority. This is also used
79 in child_setup and sys_suspend to make sure subshells run at normal
80 priority; Those functions have their own extern declaration. */
3005da00
RS
81int emacs_priority;
82
f927c5ae
JB
83#ifdef HAVE_X_WINDOWS
84/* If non-zero, -d was specified, meaning we're using some window system. */
85int display_arg;
86#endif
87
88/* An address near the bottom of the stack.
89 Tells GC how to save a copy of the stack. */
90char *stack_bottom;
91
92#ifdef HAVE_X_WINDOWS
93extern Lisp_Object Vwindow_system;
94#endif /* HAVE_X_WINDOWS */
95
96#ifdef USG_SHARED_LIBRARIES
97/* If nonzero, this is the place to put the end of the writable segment
98 at startup. */
99
100unsigned int bss_end = 0;
101#endif
102
103/* Nonzero means running Emacs without interactive terminal. */
104
105int noninteractive;
106
107/* Value of Lisp variable `noninteractive'.
108 Normally same as C variable `noninteractive'
109 but nothing terrible happens if user sets this one. */
110
111int noninteractive1;
112\f
113/* Signal code for the fatal signal that was received */
114int fatal_error_code;
115
116/* Nonzero if handling a fatal error already */
117int fatal_error_in_progress;
118
119/* Handle bus errors, illegal instruction, etc. */
2447c626 120SIGTYPE
f927c5ae
JB
121fatal_error_signal (sig)
122 int sig;
123{
f927c5ae
JB
124 fatal_error_code = sig;
125 signal (sig, SIG_DFL);
126
127 /* If fatal error occurs in code below, avoid infinite recursion. */
128 if (fatal_error_in_progress)
129 kill (getpid (), fatal_error_code);
130
131 fatal_error_in_progress = 1;
132
133 /* If we are controlling the terminal, reset terminal modes */
a41f8bed 134#ifdef EMACS_HAVE_TTY_PGRP
2447c626
JB
135 {
136 int tpgrp;
a41f8bed 137 if (EMACS_GET_TTY_PGRP (0, &tpgrp) != -1
2447c626
JB
138 && tpgrp == getpgrp (0))
139 {
140 reset_sys_modes ();
141 if (sig != SIGTERM)
142 fprintf (stderr, "Fatal error (%d).", sig);
143 }
144 }
145#endif /* uses pgrp */
f927c5ae
JB
146
147 /* Clean up */
f927c5ae 148 kill_buffer_processes (Qnil);
f927c5ae
JB
149 Fdo_auto_save (Qt, Qnil);
150
151#ifdef CLASH_DETECTION
152 unlock_all_files ();
153#endif /* CLASH_DETECTION */
154
155#ifdef VMS
156 kill_vms_processes ();
157 LIB$STOP (SS$_ABORT);
158#else
159 /* Signal the same code; this time it will really be fatal. */
160 kill (getpid (), fatal_error_code);
161#endif /* not VMS */
162}
163\f
164/* Code for dealing with Lisp access to the Unix command line */
165
166static
167init_cmdargs (argc, argv, skip_args)
168 int argc;
169 char **argv;
170 int skip_args;
171{
172 register int i;
173
174 Vcommand_line_args = Qnil;
175
176 for (i = argc - 1; i >= 0; i--)
177 {
178 if (i == 0 || i > skip_args)
179 Vcommand_line_args
180 = Fcons (build_string (argv[i]), Vcommand_line_args);
181 }
182}
183\f
184#ifdef VMS
185#ifdef LINK_CRTL_SHARE
186#ifdef SHAREABLE_LIB_BUG
187extern noshare char **environ;
188#endif /* SHAREABLE_LIB_BUG */
189#endif /* LINK_CRTL_SHARE */
190#endif /* VMS */
191
efd241cc
RS
192/* We don't include crtbegin.o and crtend.o in the link,
193 so these functions and variables might be missed.
194 Provide dummy definitions to avoid error.
195 (We don't have any real constructors or destructors.) */
196#ifdef __GNUC__
c83a7064 197__do_global_ctors ()
efd241cc 198{}
c83a7064
RS
199__do_global_ctors_aux ()
200{}
33143604
RS
201__do_global_dtors ()
202{}
c83a7064
RS
203char * __CTOR_LIST__[2] = { (char *) (-1), 0 };
204char * __DTOR_LIST__[2] = { (char *) (-1), 0 };
205__main ()
efd241cc 206{}
efd241cc
RS
207#endif /* __GNUC__ */
208
f927c5ae
JB
209/* ARGSUSED */
210main (argc, argv, envp)
211 int argc;
212 char **argv;
213 char **envp;
214{
215 char stack_bottom_variable;
216 int skip_args = 0;
217 extern int errno;
218 extern sys_nerr;
219 extern char *sys_errlist[];
220 extern void malloc_warning ();
221
222/* Map in shared memory, if we are using that. */
223#ifdef HAVE_SHM
224 if (argc > 1 && !strcmp (argv[1], "-nl"))
225 {
226 map_in_data (0);
227 /* The shared memory was just restored, which clobbered this. */
228 skip_args = 1;
229 }
230 else
231 {
232 map_in_data (1);
233 /* The shared memory was just restored, which clobbered this. */
234 skip_args = 0;
235 }
236#endif
237
19a36ec6
RS
238#ifdef NeXT
239 static int malloc_cookie;
240
241 /* This helps out unexnext.c. */
242 if (initialized)
243 if (malloc_jumpstart (malloc_cookie) != 0)
244 printf ("malloc jumpstart failed!\n");
245#endif /* NeXT */
246
f927c5ae 247#ifdef HAVE_X_WINDOWS
fb8e9847
JB
248 /* Stupid kludge to catch command-line display spec. We can't
249 handle this argument entirely in window system dependent code
250 because we don't even know which window system dependent code
251 to run until we've recognized this argument. */
f927c5ae
JB
252 {
253 int i;
254
255 for (i = 1; (i < argc && ! display_arg); i++)
256 if (!strcmp (argv[i], "-d"))
257 display_arg = 1;
258 }
259#endif
260
261#ifdef VMS
262 /* If -map specified, map the data file in */
263 if (argc > 2 && ! strcmp (argv[1], "-map"))
264 {
265 skip_args = 2;
266 mapin_data (argv[2]);
267 }
268
269#ifdef LINK_CRTL_SHARE
270#ifdef SHAREABLE_LIB_BUG
271 /* Bletcherous shared libraries! */
272 if (!stdin)
273 stdin = fdopen (0, "r");
274 if (!stdout)
275 stdout = fdopen (1, "w");
276 if (!stderr)
277 stderr = fdopen (2, "w");
278 if (!environ)
279 environ = envp;
280#endif /* SHAREABLE_LIB_BUG */
281#endif /* LINK_CRTL_SHARE */
282#endif /* VMS */
283
284 /* Record (approximately) where the stack begins. */
285 stack_bottom = &stack_bottom_variable;
286
287#ifdef RUN_TIME_REMAP
288 if (initialized)
289 run_time_remap (argv[0]);
290#endif
291
292#ifdef USG_SHARED_LIBRARIES
293 if (bss_end)
294 brk (bss_end);
295#endif
296
297 clearerr (stdin);
298#ifdef BSD
299 setpgrp (0, getpid ());
300#endif
301
302#ifdef APOLLO
303#ifndef APOLLO_SR10
304 /* If USE_DOMAIN_ACLS environment variable exists,
305 use ACLs rather than UNIX modes. */
306 if (egetenv ("USE_DOMAIN_ACLS"))
307 default_acl (USE_DEFACL);
308#endif
309#endif /* APOLLO */
310
311#ifndef SYSTEM_MALLOC
312 if (! initialized)
313 malloc_init (0, malloc_warning);
314#endif /* not SYSTEM_MALLOC */
315
3005da00
RS
316#ifdef PRIO_PROCESS
317 if (emacs_priority)
5aa7f46a 318 nice (emacs_priority);
f927c5ae 319 setuid (getuid ());
3005da00 320#endif /* PRIO_PROCESS */
f927c5ae
JB
321
322#ifdef BSD
323 /* interrupt_input has trouble if we aren't in a separate process group. */
324 setpgrp (getpid (), getpid ());
325#endif
326
327 inhibit_window_system = 0;
328
4fc0b45b 329 /* Handle the -t switch, which specifies filename to use as terminal */
f927c5ae
JB
330 if (skip_args + 2 < argc && !strcmp (argv[skip_args + 1], "-t"))
331 {
332 int result;
333 skip_args += 2;
334 close (0);
335 close (1);
336 result = open (argv[skip_args], O_RDWR, 2 );
337 if (result < 0)
338 {
339 char *errstring;
340
341 if (errno >= 0 && errno < sys_nerr)
342 errstring = sys_errlist[errno];
343 else
344 errstring = "undocumented error code";
345 fprintf (stderr, "emacs: %s: %s\n", argv[skip_args], errstring);
346 exit (1);
347 }
348 dup (0);
349 if (! isatty (0))
350 {
351 fprintf (stderr, "emacs: %s: not a tty\n", argv[skip_args]);
352 exit (1);
353 }
354 fprintf (stderr, "Using %s\n", argv[skip_args]);
355#ifdef HAVE_X_WINDOWS
356 inhibit_window_system = 1; /* -t => -nw */
357#endif
358 }
359
360 if (skip_args + 1 < argc
361 && (!strcmp (argv[skip_args + 1], "-nw")))
362 {
363 skip_args += 1;
364 inhibit_window_system = 1;
365 }
366
367/* Handle the -batch switch, which means don't do interactive display. */
368 noninteractive = 0;
369 if (skip_args + 1 < argc && !strcmp (argv[skip_args + 1], "-batch"))
370 {
371 skip_args += 1;
372 noninteractive = 1;
373 }
374
fb8e9847
JB
375#ifdef POSIX_SIGNALS
376 init_signals ();
377#endif
378
f927c5ae
JB
379 if (
380#ifndef CANNOT_DUMP
381 ! noninteractive || initialized
382#else
383 1
384#endif
385 )
386 {
387 /* Don't catch these signals in batch mode if not initialized.
388 On some machines, this sets static data that would make
389 signal fail to work right when the dumped Emacs is run. */
390 signal (SIGHUP, fatal_error_signal);
391 signal (SIGQUIT, fatal_error_signal);
392 signal (SIGILL, fatal_error_signal);
393 signal (SIGTRAP, fatal_error_signal);
394 signal (SIGIOT, fatal_error_signal);
395#ifdef SIGEMT
396 signal (SIGEMT, fatal_error_signal);
397#endif
398 signal (SIGFPE, fatal_error_signal);
399 signal (SIGBUS, fatal_error_signal);
400 signal (SIGSEGV, fatal_error_signal);
401 signal (SIGSYS, fatal_error_signal);
402 signal (SIGTERM, fatal_error_signal);
403#ifdef SIGXCPU
404 signal (SIGXCPU, fatal_error_signal);
405#endif
406#ifdef SIGXFSZ
407 signal (SIGXFSZ, fatal_error_signal);
408#endif /* SIGXFSZ */
409
410#ifdef AIX
411 signal (SIGDANGER, fatal_error_signal);
412 signal (20, fatal_error_signal);
413 signal (21, fatal_error_signal);
414 signal (22, fatal_error_signal);
415 signal (23, fatal_error_signal);
416 signal (24, fatal_error_signal);
bfb61299 417#ifdef SIGIO
f927c5ae
JB
418 signal (SIGAIO, fatal_error_signal);
419 signal (SIGPTY, fatal_error_signal);
bfb61299 420#endif
f927c5ae
JB
421 signal (SIGIOINT, fatal_error_signal);
422 signal (SIGGRANT, fatal_error_signal);
423 signal (SIGRETRACT, fatal_error_signal);
424 signal (SIGSOUND, fatal_error_signal);
425 signal (SIGMSG, fatal_error_signal);
426#endif /* AIX */
427 }
428
429 noninteractive1 = noninteractive;
430
431/* Perform basic initializations (not merely interning symbols) */
432
433 if (!initialized)
434 {
435 init_alloc_once ();
436 init_obarray ();
437 init_eval_once ();
438 init_syntax_once (); /* Create standard syntax table. */
439 /* Must be done before init_buffer */
440 init_casetab_once ();
441 init_buffer_once (); /* Create buffer table and some buffers */
442 init_minibuf_once (); /* Create list of minibuffers */
443 /* Must precede init_window_once */
444 init_window_once (); /* Init the window system */
445 }
446
447 init_alloc ();
f927c5ae
JB
448 init_eval ();
449 init_data ();
fb8e9847 450 init_lread ();
f927c5ae
JB
451
452 init_cmdargs (argc, argv, skip_args); /* Create list Vcommand_line_args */
453 init_buffer (); /* Init default directory of main buffer */
454 if (!noninteractive)
455 {
456#ifdef VMS
1cbd5d9d 457 init_vms_input ();/* init_display calls get_frame_size, that needs this */
f927c5ae
JB
458#endif /* VMS */
459 init_display (); /* Determine terminal type. init_sys_modes uses results */
460 }
461 init_keyboard (); /* This too must precede init_sys_modes */
462 init_callproc (); /* And this too. */
463#ifdef VMS
464 init_vmsproc (); /* And this too. */
465#endif /* VMS */
466 init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.) */
467 init_xdisp ();
468 init_macros ();
469 init_editfns ();
470#ifdef LISP_FLOAT_TYPE
471 init_floatfns ();
472#endif
473#ifdef VMS
474 init_vmsfns ();
475#endif /* VMS */
f927c5ae 476 init_process ();
32676c08
JB
477#ifdef CLASH_DETECTION
478 init_filelock ();
479#endif /* CLASH_DETECTION */
f927c5ae
JB
480
481/* Intern the names of all standard functions and variables; define standard keys */
482
483 if (!initialized)
484 {
485 /* The basic levels of Lisp must come first */
486 /* And data must come first of all
487 for the sake of symbols like error-message */
488 syms_of_data ();
489 syms_of_alloc ();
fb8e9847 490 syms_of_lread ();
f927c5ae
JB
491 syms_of_print ();
492 syms_of_eval ();
493 syms_of_fns ();
494#ifdef LISP_FLOAT_TYPE
495 syms_of_floatfns ();
496#endif
497
498 syms_of_abbrev ();
499 syms_of_buffer ();
500 syms_of_bytecode ();
501 syms_of_callint ();
502 syms_of_casefiddle ();
503 syms_of_casetab ();
504 syms_of_callproc ();
505 syms_of_cmds ();
506#ifndef NO_DIR_LIBRARY
507 syms_of_dired ();
508#endif /* not NO_DIR_LIBRARY */
509 syms_of_display ();
510 syms_of_doc ();
511 syms_of_editfns ();
512 syms_of_emacs ();
513 syms_of_fileio ();
514#ifdef CLASH_DETECTION
515 syms_of_filelock ();
516#endif /* CLASH_DETECTION */
517 syms_of_indent ();
518 syms_of_keyboard ();
519 syms_of_keymap ();
520 syms_of_macros ();
521 syms_of_marker ();
522 syms_of_minibuf ();
523 syms_of_mocklisp ();
f927c5ae 524 syms_of_process ();
f927c5ae 525 syms_of_search ();
1cbd5d9d 526 syms_of_frame ();
f927c5ae
JB
527 syms_of_syntax ();
528 syms_of_undo ();
bef79ee4
JA
529
530 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
531 syms_of_textprop ();
f927c5ae
JB
532#ifdef VMS
533 syms_of_vmsproc ();
534#endif /* VMS */
535 syms_of_window ();
536 syms_of_xdisp ();
537#ifdef HAVE_X_WINDOWS
72412588 538 syms_of_xterm ();
f927c5ae 539 syms_of_xfns ();
72412588
JB
540#ifdef HAVE_X11
541 syms_of_xselect ();
542#endif
3005da00
RS
543#ifdef HAVE_X_WINDOW
544#ifndef NO_X_MENU
f927c5ae 545 syms_of_xmenu ();
3005da00 546#endif /* not NO_X_MENU */
f927c5ae
JB
547#endif /* HAVE_X_MENU */
548#endif /* HAVE_X_WINDOWS */
549
550#ifdef SYMS_SYSTEM
551 SYMS_SYSTEM;
552#endif
553
554#ifdef SYMS_MACHINE
555 SYMS_MACHINE;
556#endif
557
558 keys_of_casefiddle ();
559 keys_of_cmds ();
560 keys_of_buffer ();
561 keys_of_keyboard ();
562 keys_of_keymap ();
563 keys_of_macros ();
564 keys_of_minibuf ();
565 keys_of_window ();
566 }
567
568 if (!initialized)
569 {
570 /* Handle -l loadup-and-dump, args passed by Makefile. */
571 if (argc > 2 + skip_args && !strcmp (argv[1 + skip_args], "-l"))
572 Vtop_level = Fcons (intern ("load"),
573 Fcons (build_string (argv[2 + skip_args]), Qnil));
574#ifdef CANNOT_DUMP
575 /* Unless next switch is -nl, load "loadup.el" first thing. */
576 if (!(argc > 1 + skip_args && !strcmp (argv[1 + skip_args], "-nl")))
577 Vtop_level = Fcons (intern ("load"),
578 Fcons (build_string ("loadup.el"), Qnil));
579#endif /* CANNOT_DUMP */
580 }
581
582 initialized = 1;
583
279cc2b8
JB
584#ifdef sun
585 /* sun's localtime() has a bug. it caches the value of the time
586 zone rather than looking it up every time. Since localtime() is
587 called to bolt the undumping time into the undumped emacs, this
588 results in localtime() ignoring the TZ environment variable.
589 This flushes the new TZ value into localtime(). */
590 tzset();
591#endif /* sun */
592
f927c5ae
JB
593 /* Enter editor command loop. This never returns. */
594 Frecursive_edit ();
595 /* NOTREACHED */
596}
597\f
598DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
edc8ae07 599 "Exit the Emacs job and kill it.\n\
f927c5ae
JB
600If ARG is an integer, return ARG as the exit program code.\n\
601If ARG is a string, stuff it as keyboard input.\n\n\
602The value of `kill-emacs-hook', if not void,\n\
603is a list of functions (of no args),\n\
604all of which are called before Emacs is actually killed.")
605 (arg)
606 Lisp_Object arg;
607{
608 Lisp_Object hook, hook1;
609 int i;
610 struct gcpro gcpro1;
611
612 GCPRO1 (arg);
613
614 if (feof (stdin))
615 arg = Qt;
616
2447c626 617 if (!NILP (Vrun_hooks) && !noninteractive)
f927c5ae
JB
618 call1 (Vrun_hooks, intern ("kill-emacs-hook"));
619
f927c5ae 620 kill_buffer_processes (Qnil);
f927c5ae
JB
621
622#ifdef VMS
623 kill_vms_processes ();
624#endif /* VMS */
625
626 Fdo_auto_save (Qt, Qnil);
627
628#ifdef CLASH_DETECTION
629 unlock_all_files ();
630#endif /* CLASH_DETECTION */
631
632 fflush (stdout);
633 reset_sys_modes ();
634
635#ifdef HAVE_X_WINDOWS
636 if (!noninteractive && EQ (Vwindow_system, intern ("x")))
637 Fx_close_current_connection ();
638#endif /* HAVE_X_WINDOWS */
639
640 UNGCPRO;
641
642/* Is it really necessary to do this deassign
643 when we are going to exit anyway? */
644/* #ifdef VMS
645 stop_vms_input ();
646 #endif */
647 stuff_buffered_input (arg);
648#ifdef SIGIO
649 /* There is a tendency for a SIGIO signal to arrive within exit,
650 and cause a SIGHUP because the input descriptor is already closed. */
651 unrequest_sigio ();
652 signal (SIGIO, SIG_IGN);
653#endif
654 exit ((XTYPE (arg) == Lisp_Int) ? XINT (arg)
655#ifdef VMS
656 : 1
657#else
658 : 0
659#endif
660 );
661 /* NOTREACHED */
662}
663\f
664#ifndef CANNOT_DUMP
665/* Nothing like this can be implemented on an Apollo.
666 What a loss! */
667
668#ifdef HAVE_SHM
669
670DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0,
671 "Dump current state of Emacs into data file FILENAME.\n\
672This function exists on systems that use HAVE_SHM.")
673 (intoname)
674 Lisp_Object intoname;
675{
676 extern int my_edata;
677 Lisp_Object tem;
678 extern void malloc_warning ();
679
680 CHECK_STRING (intoname, 0);
681 intoname = Fexpand_file_name (intoname, Qnil);
682
683 tem = Vpurify_flag;
684 Vpurify_flag = Qnil;
685
686 fflush (stdout);
687 /* Tell malloc where start of impure now is */
688 /* Also arrange for warnings when nearly out of space. */
689#ifndef SYSTEM_MALLOC
690 malloc_init (&my_edata, malloc_warning);
691#endif
692 map_out_data (XSTRING (intoname)->data);
693
694 Vpurify_flag = tem;
695
696 return Qnil;
697}
698
699#else /* not HAVE_SHM */
700
701DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
702 "Dump current state of Emacs into executable file FILENAME.\n\
703Take symbols from SYMFILE (presumably the file you executed to run Emacs).\n\
704This is used in the file `loadup.el' when building Emacs.\n\
705\n\
706Bind `command-line-processed' to nil before dumping,\n\
707if you want the dumped Emacs to process its command line\n\
708and announce itself normally when it is run.")
709 (intoname, symname)
710 Lisp_Object intoname, symname;
711{
712 extern int my_edata;
713 Lisp_Object tem;
714 extern void malloc_warning ();
715
716 CHECK_STRING (intoname, 0);
717 intoname = Fexpand_file_name (intoname, Qnil);
2447c626 718 if (!NILP (symname))
f927c5ae
JB
719 {
720 CHECK_STRING (symname, 0);
721 if (XSTRING (symname)->size)
722 symname = Fexpand_file_name (symname, Qnil);
723 }
724
725 tem = Vpurify_flag;
726 Vpurify_flag = Qnil;
727
728 fflush (stdout);
729#ifdef VMS
730 mapout_data (XSTRING (intoname)->data);
731#else
732 /* Tell malloc where start of impure now is */
733 /* Also arrange for warnings when nearly out of space. */
734#ifndef SYSTEM_MALLOC
735 malloc_init (&my_edata, malloc_warning);
736#endif
737 unexec (XSTRING (intoname)->data,
2447c626 738 !NILP (symname) ? XSTRING (symname)->data : 0, &my_edata, 0, 0);
f927c5ae
JB
739#endif /* not VMS */
740
741 Vpurify_flag = tem;
742
743 return Qnil;
744}
745
746#endif /* not HAVE_SHM */
747
748#endif /* not CANNOT_DUMP */
749\f
750#ifdef VMS
751#define SEPCHAR ','
752#else
753#define SEPCHAR ':'
754#endif
755
756Lisp_Object
757decode_env_path (evarname, defalt)
758 char *evarname, *defalt;
759{
760 register char *path, *p;
761 extern char *index ();
762
763 Lisp_Object lpath;
764
2447c626
JB
765 /* It's okay to use getenv here, because this function is only used
766 to initialize variables when Emacs starts up, and isn't called
767 after that. */
e065a56e
JB
768 if (evarname != 0)
769 path = (char *) getenv (evarname);
770 else
771 path = 0;
f927c5ae
JB
772 if (!path)
773 path = defalt;
774 lpath = Qnil;
775 while (1)
776 {
777 p = index (path, SEPCHAR);
778 if (!p) p = path + strlen (path);
779 lpath = Fcons (p - path ? make_string (path, p - path) : Qnil,
780 lpath);
781 if (*p)
782 path = p + 1;
783 else
784 break;
785 }
786 return Fnreverse (lpath);
787}
788
789syms_of_emacs ()
790{
791#ifdef HAVE_SHM
792 defsubr (&Sdump_emacs_data);
793#else
794 defsubr (&Sdump_emacs);
795#endif
796
797 defsubr (&Skill_emacs);
798
799 DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
800 "Args passed by shell to Emacs, as a list of strings.");
801
802 DEFVAR_LISP ("system-type", &Vsystem_type,
803 "Value is symbol indicating type of operating system you are using.");
804 Vsystem_type = intern (SYSTEM_TYPE);
805
806 DEFVAR_BOOL ("noninteractive", &noninteractive1,
807 "Non-nil means Emacs is running without interactive terminal.");
e5d77022 808
e5d77022 809 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
edc8ae07
JB
810 "Hook to be run whenever kill-emacs is called.\n\
811Since kill-emacs may be invoked when the terminal is disconnected (or\n\
812in other similar situations), functions placed on this hook should not\n\
813not expect to be able to interact with the user.");
814 Vkill_emacs_hook = Qnil;
3005da00
RS
815
816 DEFVAR_INT ("emacs-priority", &emacs_priority,
817 "Priority for Emacs to run at.\n\
818This value is effective only if set before Emacs is dumped,\n\
819and only if the Emacs executable is installed with setuid to permit\n\
820it to change priority. (Emacs sets its uid back to the real uid.)");
821 emacs_priority = 0;
f927c5ae 822}