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