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