1 /* Fully extensible Emacs, running on Unix, intended for GNU.
2 Copyright (C) 1985, 86, 87, 93, 94, 95 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
27 #include <sys/types.h>
35 #include <sys/ioctl.h>
40 #include "intervals.h"
43 #include "syssignal.h"
50 extern void malloc_warning ();
51 extern char *index ();
52 extern char *strerror ();
54 /* Command line args from shell, as list of strings */
55 Lisp_Object Vcommand_line_args
;
57 /* The name under which Emacs was invoked, with any leading directory
59 Lisp_Object Vinvocation_name
;
61 /* The directory name from which Emacs was invoked. */
62 Lisp_Object Vinvocation_directory
;
64 /* The directory name in which to find subdirs such as lisp and etc.
65 nil means get them only from PATH_LOADSEARCH. */
66 Lisp_Object Vinstallation_directory
;
68 /* Hook run by `kill-emacs' before it does really anything. */
69 Lisp_Object Vkill_emacs_hook
;
71 /* Set nonzero after Emacs has started up the first time.
72 Prevents reinitialization of the Lisp world and keymaps
73 on subsequent starts. */
76 /* Variable whose value is symbol giving operating system type. */
77 Lisp_Object Vsystem_type
;
79 /* Variable whose value is string giving configuration built for. */
80 Lisp_Object Vsystem_configuration
;
82 /* Variable whose value is string giving configuration options,
83 for use when reporting bugs. */
84 Lisp_Object Vsystem_configuration_options
;
86 /* If non-zero, emacs should not attempt to use an window-specific code,
87 but instead should use the virtual terminal under which it was started */
88 int inhibit_window_system
;
90 /* If nonzero, set Emacs to run at this priority. This is also used
91 in child_setup and sys_suspend to make sure subshells run at normal
92 priority; Those functions have their own extern declaration. */
95 /* If non-zero a filter or a sentinel is running. Tested to save the match
96 data on the first attempt to change it inside asynchronous code. */
97 int running_asynch_code
;
101 extern int inherited_pgroup
;
104 #ifdef HAVE_X_WINDOWS
105 /* If non-zero, -d was specified, meaning we're using some window system. */
109 /* An address near the bottom of the stack.
110 Tells GC how to save a copy of the stack. */
113 #ifdef HAVE_WINDOW_SYSTEM
114 extern Lisp_Object Vwindow_system
;
115 #endif /* HAVE_WINDOW_SYSTEM */
117 extern Lisp_Object Vauto_save_list_file_name
;
119 #ifdef USG_SHARED_LIBRARIES
120 /* If nonzero, this is the place to put the end of the writable segment
123 unsigned int bss_end
= 0;
126 /* Nonzero means running Emacs without interactive terminal. */
130 /* Value of Lisp variable `noninteractive'.
131 Normally same as C variable `noninteractive'
132 but nothing terrible happens if user sets this one. */
136 /* Save argv and argc. */
140 static void sort_args ();
142 /* Signal code for the fatal signal that was received */
143 int fatal_error_code
;
145 /* Nonzero if handling a fatal error already */
146 int fatal_error_in_progress
;
148 /* Handle bus errors, illegal instruction, etc. */
150 fatal_error_signal (sig
)
153 fatal_error_code
= sig
;
154 signal (sig
, SIG_DFL
);
156 /* If fatal error occurs in code below, avoid infinite recursion. */
157 if (! fatal_error_in_progress
)
159 fatal_error_in_progress
= 1;
161 shut_down_emacs (sig
, 0, Qnil
);
165 LIB$
STOP (SS$_ABORT
);
167 /* Signal the same code; this time it will really be fatal.
168 Remember that since we're in a signal handler, the signal we're
169 going to send is probably blocked, so we have to unblock it if we
170 want to really receive it. */
172 sigunblock (sigmask (fatal_error_code
));
174 kill (getpid (), fatal_error_code
);
180 /* Handler for SIGDANGER. */
182 memory_warning_signal (sig
)
185 signal (sig
, memory_warning_signal
);
187 malloc_warning ("Operating system warns that virtual memory is running low.\n");
189 /* It might be unsafe to call do_auto_save now. */
190 force_auto_save_soon ();
194 /* Code for dealing with Lisp access to the Unix command line */
197 init_cmdargs (argc
, argv
, skip_args
)
203 Lisp_Object name
, dir
;
208 Vinvocation_name
= Ffile_name_nondirectory (build_string (argv
[0]));
209 Vinvocation_directory
= Ffile_name_directory (build_string (argv
[0]));
210 /* If we got no directory in argv[0], search PATH to find where
211 Emacs actually came from. */
212 if (NILP (Vinvocation_directory
))
215 int yes
= openp (Vexec_path
, Vinvocation_name
,
216 EXEC_SUFFIXES
, &found
, 1);
218 Vinvocation_directory
= Ffile_name_directory (found
);
221 if (!NILP (Vinvocation_directory
)
222 && NILP (Ffile_name_absolute_p (Vinvocation_directory
)))
223 /* Emacs was started with relative path, like ./emacs */
224 Vinvocation_directory
= Fexpand_file_name (Vinvocation_directory
, Qnil
);
226 Vinstallation_directory
= Qnil
;
228 if (!NILP (Vinvocation_directory
))
230 dir
= Vinvocation_directory
;
231 name
= Fexpand_file_name (Vinvocation_name
, dir
);
234 Lisp_Object tem
, lib_src_exists
;
235 Lisp_Object etc_exists
, info_exists
;
237 /* See if dir contains subdirs for use by Emacs.
238 Check for the ones that would exist in a build directory,
239 not including lisp and info. */
240 tem
= Fexpand_file_name (build_string ("lib-src"), dir
);
241 lib_src_exists
= Ffile_exists_p (tem
);
242 if (!NILP (lib_src_exists
))
244 tem
= Fexpand_file_name (build_string ("etc"), dir
);
245 etc_exists
= Ffile_exists_p (tem
);
246 if (!NILP (etc_exists
))
248 Vinstallation_directory
249 = Ffile_name_as_directory (dir
);
254 /* See if dir's parent contains those subdirs. */
255 tem
= Fexpand_file_name (build_string ("../lib-src"), dir
);
256 lib_src_exists
= Ffile_exists_p (tem
);
257 if (!NILP (lib_src_exists
))
259 tem
= Fexpand_file_name (build_string ("../etc"), dir
);
260 etc_exists
= Ffile_exists_p (tem
);
261 if (!NILP (etc_exists
))
263 tem
= Fexpand_file_name (build_string (".."), dir
);
264 Vinstallation_directory
265 = Ffile_name_as_directory (tem
);
270 /* If the Emacs executable is actually a link,
271 next try the dir that the link points into. */
272 tem
= Ffile_symlink_p (name
);
275 name
= Fexpand_file_name (tem
, dir
);
276 dir
= Ffile_name_directory (name
);
283 Vcommand_line_args
= Qnil
;
285 for (i
= argc
- 1; i
>= 0; i
--)
287 if (i
== 0 || i
> skip_args
)
289 = Fcons (build_string (argv
[i
]), Vcommand_line_args
);
293 DEFUN ("invocation-name", Finvocation_name
, Sinvocation_name
, 0, 0, 0,
294 "Return the program name that was used to run Emacs.\n\
295 Any directory names are omitted.")
298 return Fcopy_sequence (Vinvocation_name
);
301 DEFUN ("invocation-directory", Finvocation_directory
, Sinvocation_directory
,
303 "Return the directory name in which the Emacs executable was located")
306 return Fcopy_sequence (Vinvocation_directory
);
311 #ifdef LINK_CRTL_SHARE
312 #ifdef SHAREABLE_LIB_BUG
313 extern noshare
char **environ
;
314 #endif /* SHAREABLE_LIB_BUG */
315 #endif /* LINK_CRTL_SHARE */
318 #ifndef ORDINARY_LINK
319 /* We don't include crtbegin.o and crtend.o in the link,
320 so these functions and variables might be missed.
321 Provide dummy definitions to avoid error.
322 (We don't have any real constructors or destructors.) */
324 #ifndef GCC_CTORS_IN_LIBC
327 __do_global_ctors_aux ()
331 /* Linux has a bug in its library; avoid an error. */
333 char * __CTOR_LIST__
[2] = { (char *) (-1), 0 };
335 char * __DTOR_LIST__
[2] = { (char *) (-1), 0 };
336 #endif /* GCC_CTORS_IN_LIBC */
339 #endif /* __GNUC__ */
340 #endif /* ORDINARY_LINK */
342 /* Test whether the next argument in ARGV matches SSTR or a prefix of
343 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
344 (the argument is supposed to have a value) store in *VALPTR either
345 the next argument or the portion of this one after the equal sign.
346 ARGV is read starting at position *SKIPPTR; this index is advanced
347 by the number of arguments used.
349 Too bad we can't just use getopt for all of this, but we don't have
350 enough information to do it right. */
353 argmatch (argv
, argc
, sstr
, lstr
, minlen
, valptr
, skipptr
)
366 /* Don't access argv[argc]; give up in advance. */
367 if (argc
<= *skipptr
+ 1)
370 arg
= argv
[*skipptr
+1];
373 if (strcmp (arg
, sstr
) == 0)
377 *valptr
= argv
[*skipptr
+2];
384 arglen
= (valptr
!= NULL
&& (p
= index (arg
, '=')) != NULL
385 ? p
- arg
: strlen (arg
));
386 if (lstr
== 0 || arglen
< minlen
|| strncmp (arg
, lstr
, arglen
) != 0)
388 else if (valptr
== NULL
)
399 else if (argv
[*skipptr
+2] != NULL
)
401 *valptr
= argv
[*skipptr
+2];
412 main (argc
, argv
, envp
)
417 char stack_bottom_variable
;
422 #ifdef LINUX_SBRK_BUG
426 sort_args (argc
, argv
);
428 if (argmatch (argv
, argc
, "-version", "--version", 3, NULL
, &skip_args
))
431 tem
= Fsymbol_value (intern ("emacs-version"));
434 fprintf (stderr
, "Invalid value of `emacs-version'\n");
439 printf ("%s\n", XSTRING (tem
)->data
);
444 /* Map in shared memory, if we are using that. */
446 if (argmatch (argv
, argc
, "-nl", "--no-shared-memory", 6, NULL
, &skip_args
))
449 /* The shared memory was just restored, which clobbered this. */
455 /* The shared memory was just restored, which clobbered this. */
462 extern int malloc_cookie
;
463 /* This helps out unexnext.c. */
465 if (malloc_jumpstart (malloc_cookie
) != 0)
466 printf ("malloc jumpstart failed!\n");
471 /* If -map specified, map the data file in */
474 if (argmatch (argv
, argc
, "-map", "--map-data", 3, &mapin_file
, &skip_args
))
478 #ifdef LINK_CRTL_SHARE
479 #ifdef SHAREABLE_LIB_BUG
480 /* Bletcherous shared libraries! */
482 stdin
= fdopen (0, "r");
484 stdout
= fdopen (1, "w");
486 stderr
= fdopen (2, "w");
489 #endif /* SHAREABLE_LIB_BUG */
490 #endif /* LINK_CRTL_SHARE */
493 /* Record (approximately) where the stack begins. */
494 stack_bottom
= &stack_bottom_variable
;
496 #ifdef RUN_TIME_REMAP
498 run_time_remap (argv
[0]);
501 #ifdef USG_SHARED_LIBRARIES
503 brk ((void *)bss_end
);
508 #ifndef SYSTEM_MALLOC
511 /* Arrange to get warning messages as memory fills up. */
512 memory_warnings (0, malloc_warning
);
514 /* Arrange to disable interrupt input while malloc and friends are
516 uninterrupt_malloc ();
518 #endif /* not SYSTEM_MALLOC */
521 /* We do all file input/output as binary files. When we need to translate
522 newlines, we do that manually. */
524 (stdin
)->_flag
&= ~_IOTEXT
;
525 (stdout
)->_flag
&= ~_IOTEXT
;
526 (stderr
)->_flag
&= ~_IOTEXT
;
529 #ifdef SET_EMACS_PRIORITY
531 nice (emacs_priority
);
533 #endif /* SET_EMACS_PRIORITY */
535 #ifdef EXTRA_INITIALIZE
539 inhibit_window_system
= 0;
541 /* Handle the -t switch, which specifies filename to use as terminal */
544 if (argmatch (argv
, argc
, "-t", "--terminal", 4, &term
, &skip_args
))
549 result
= open (term
, O_RDWR
, 2 );
552 char *errstring
= strerror (errno
);
553 fprintf (stderr
, "emacs: %s: %s\n", term
, errstring
);
559 fprintf (stderr
, "emacs: %s: not a tty\n", term
);
562 fprintf (stderr
, "Using %s\n", term
);
563 #ifdef HAVE_WINDOW_SYSTEM
564 inhibit_window_system
= 1; /* -t => -nw */
568 if (argmatch (argv
, argc
, "-nw", "--no-windows", 6, NULL
, &skip_args
))
569 inhibit_window_system
= 1;
571 /* Handle the -batch switch, which means don't do interactive display. */
573 if (argmatch (argv
, argc
, "-batch", "--batch", 5, NULL
, &skip_args
))
576 /* Handle the --help option, which gives a usage message.. */
577 if (argmatch (argv
, argc
, "-help", "--help", 3, NULL
, &skip_args
))
580 Usage: %s [-t term] [--terminal term] [-nw] [--no-windows] [--batch]\n\
581 [-q] [--no-init-file] [-u user] [--user user] [--debug-init]\n\
582 [--version] [--no-site-file]\n\
583 [-f func] [--funcall func] [-l file] [--load file] [--insert file]\n\
584 [+linenum] file-to-visit [--kill]\n", argv
[0]);
588 #ifdef HAVE_X_WINDOWS
589 /* Stupid kludge to catch command-line display spec. We can't
590 handle this argument entirely in window system dependent code
591 because we don't even know which window system dependent code
592 to run until we've recognized this argument. */
596 int count_before
= skip_args
;
598 if (argmatch (argv
, argc
, "-d", "--display", 3, &displayname
, &skip_args
))
600 else if (argmatch (argv
, argc
, "-display", 0, 3, &displayname
, &skip_args
))
603 /* If we have the form --display=NAME,
604 convert it into -d name.
605 This requires inserting a new element into argv. */
606 if (displayname
!= 0 && skip_args
- count_before
== 1)
608 char **new = (char **) xmalloc (sizeof (char *) * (argc
+ 2));
611 for (j
= 0; j
< count_before
+ 1; j
++)
613 new[count_before
+ 1] = "-d";
614 new[count_before
+ 2] = displayname
;
615 for (j
= count_before
+ 2; j
<argc
; j
++)
616 new[j
+ 1] = argv
[j
];
620 /* Change --display to -d, when its arg is separate. */
621 else if (displayname
!= 0 && skip_args
> count_before
622 && argv
[count_before
+ 1][1] == '-')
623 argv
[count_before
+ 1] = "-d";
625 /* Don't actually discard this arg. */
626 skip_args
= count_before
;
630 if (! noninteractive
)
635 inherited_pgroup
= EMACS_GETPGRP (0);
636 setpgrp (0, getpid ());
639 #if defined (USG5) && defined (INTERRUPT_INPUT)
651 ! noninteractive
|| initialized
657 /* Don't catch these signals in batch mode if not initialized.
658 On some machines, this sets static data that would make
659 signal fail to work right when the dumped Emacs is run. */
660 signal (SIGHUP
, fatal_error_signal
);
661 signal (SIGQUIT
, fatal_error_signal
);
662 signal (SIGILL
, fatal_error_signal
);
663 signal (SIGTRAP
, fatal_error_signal
);
665 signal (SIGABRT
, fatal_error_signal
);
668 signal (SIGHWE
, fatal_error_signal
);
671 signal (SIGPRE
, fatal_error_signal
);
674 signal (SIGORE
, fatal_error_signal
);
677 signal (SIGUME
, fatal_error_signal
);
680 signal (SIGDLK
, fatal_error_signal
);
683 signal (SIGCPULIM
, fatal_error_signal
);
686 /* This is missing on some systems - OS/2, for example. */
687 signal (SIGIOT
, fatal_error_signal
);
690 signal (SIGEMT
, fatal_error_signal
);
692 signal (SIGFPE
, fatal_error_signal
);
694 signal (SIGBUS
, fatal_error_signal
);
696 signal (SIGSEGV
, fatal_error_signal
);
698 signal (SIGSYS
, fatal_error_signal
);
700 signal (SIGTERM
, fatal_error_signal
);
702 signal (SIGXCPU
, fatal_error_signal
);
705 signal (SIGXFSZ
, fatal_error_signal
);
709 /* This just means available memory is getting low. */
710 signal (SIGDANGER
, memory_warning_signal
);
714 /* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
715 signal (SIGXCPU
, fatal_error_signal
);
717 signal (SIGIOINT
, fatal_error_signal
);
719 signal (SIGGRANT
, fatal_error_signal
);
720 signal (SIGRETRACT
, fatal_error_signal
);
721 signal (SIGSOUND
, fatal_error_signal
);
722 signal (SIGMSG
, fatal_error_signal
);
726 noninteractive1
= noninteractive
;
728 /* Perform basic initializations (not merely interning symbols) */
735 init_syntax_once (); /* Create standard syntax table. */
736 /* Must be done before init_buffer */
737 init_casetab_once ();
738 init_buffer_once (); /* Create buffer table and some buffers */
739 init_minibuf_once (); /* Create list of minibuffers */
740 /* Must precede init_window_once */
741 init_window_once (); /* Init the window system */
747 running_asynch_code
= 0;
750 /* Call early 'cause init_environment needs it. */
752 /* Set defaults for several environment variables. */
753 if (initialized
) init_environment (argc
, argv
, skip_args
);
754 else init_gettimeofday ();
758 /* Initialize environment from registry settings. */
762 /* egetenv is a pretty low-level facility, which may get called in
763 many circumstances; it seems flimsy to put off initializing it
764 until calling init_callproc. */
765 set_process_environment ();
766 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
767 if this is not done. Do it after set_process_environment so that we
768 don't pollute Vprocess_environment. */
773 init_buffer (); /* Init default directory of main buffer */
775 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
776 init_cmdargs (argc
, argv
, skip_args
); /* Must precede init_lread. */
777 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
783 init_vms_input ();/* init_display calls get_frame_size, that needs this */
785 init_display (); /* Determine terminal type. init_sys_modes uses results */
787 init_keyboard (); /* This too must precede init_sys_modes */
789 init_vmsproc (); /* And this too. */
791 init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.) */
795 #ifdef LISP_FLOAT_TYPE
802 #ifdef CLASH_DETECTION
804 #endif /* CLASH_DETECTION */
806 /* Intern the names of all standard functions and variables; define standard keys */
810 /* The basic levels of Lisp must come first */
811 /* And data must come first of all
812 for the sake of symbols like error-message */
825 syms_of_casefiddle ();
829 #ifndef NO_DIR_LIBRARY
831 #endif /* not NO_DIR_LIBRARY */
837 #ifdef CLASH_DETECTION
839 #endif /* CLASH_DETECTION */
854 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
861 #ifdef HAVE_X_WINDOWS
870 #endif /* HAVE_X_MENU */
871 #endif /* HAVE_X_WINDOWS */
873 #if defined (MSDOS) && !defined (HAVE_X_WINDOWS)
879 syms_of_win32term ();
881 syms_of_win32faces ();
882 syms_of_win32select ();
883 syms_of_win32menu ();
884 #endif /* HAVE_NTGUI */
894 keys_of_casefiddle ();
908 /* Handle -l loadup-and-dump, args passed by Makefile. */
909 if (argmatch (argv
, argc
, "-l", "--load", 3, &file
, &skip_args
))
910 Vtop_level
= Fcons (intern ("load"),
911 Fcons (build_string (file
), Qnil
));
913 /* Unless next switch is -nl, load "loadup.el" first thing. */
914 if (!argmatch (argv
, argc
, "-nl", "--no-loadup", 6, NULL
, &skip_args
))
915 Vtop_level
= Fcons (intern ("load"),
916 Fcons (build_string ("loadup.el"), Qnil
));
917 #endif /* CANNOT_DUMP */
922 /* Erase any pre-dump messages in the message log, to avoid confusion */
923 Lisp_Object old_log_max
;
924 old_log_max
= Vmessage_log_max
;
925 XSETFASTINT (Vmessage_log_max
, 0);
926 message_dolog ("", 0, 1);
927 Vmessage_log_max
= old_log_max
;
932 #ifdef LOCALTIME_CACHE
933 /* Some versions of localtime have a bug. They cache the value of the time
934 zone rather than looking it up every time. Since localtime() is
935 called to bolt the undumping time into the undumped emacs, this
936 results in localtime ignoring the TZ environment variable.
937 This flushes the new TZ value into localtime. */
939 #endif /* defined (LOCALTIME_CACHE) */
941 /* Enter editor command loop. This never returns. */
946 /* Sort the args so we can find the most important ones
947 at the beginning of argv. */
949 /* First, here's a table of all the standard options. */
959 struct standard_args standard_args
[] =
961 { "-version", "--version", 110, 0 },
962 { "-help", "--help", 110, 0 },
963 { "-nl", "--no-shared-memory", 100, 0 },
965 { "-map", "--map-data", 100, 0 },
967 { "-t", "--terminal", 90, 1 },
968 { "-d", "--display", 80, 1 },
969 { "-display", 0, 80, 1 },
970 { "-nw", "--no-windows", 70, 0 },
971 { "-batch", "--batch", 60, 0 },
972 { "-q", "--no-init-file", 50, 0 },
973 { "-no-init-file", 0, 50, 0 },
974 { "-no-site-file", "--no-site-file", 40, 0 },
975 { "-u", "--user", 30, 1 },
976 { "-user", 0, 30, 1 },
977 { "-debug-init", "--debug-init", 20, 0 },
978 { "-i", "--icon-type", 15, 0 },
979 { "-itype", 0, 15, 0 },
980 { "-iconic", "--iconic", 15, 0 },
981 { "-bg", "--background-color", 10, 1 },
982 { "-background", 0, 10, 1 },
983 { "-fg", "--foreground-color", 10, 1 },
984 { "-foreground", 0, 10, 1 },
985 { "-bd", "--border-color", 10, 1 },
986 { "-bw", "--border-width", 10, 1 },
987 { "-ib", "--internal-border", 10, 1 },
988 { "-ms", "--mouse-color", 10, 1 },
989 { "-cr", "--cursor-color", 10, 1 },
990 { "-fn", "--font", 10, 1 },
991 { "-font", 0, 10, 1 },
992 { "-g", "--geometry", 10, 1 },
993 { "-geometry", 0, 10, 1 },
994 { "-T", "--title", 10, 1 },
995 { "-name", "--name", 10, 1 },
996 { "-xrm", "--xrm", 10, 1 },
997 { "-r", "--reverse-video", 5, 0 },
999 { "-reverse", 0, 5, 0 },
1000 { "-vb", "--vertical-scroll-bars", 5, 0 },
1001 /* These have the same priority as ordinary file name args,
1002 so they are not reordered with respect to those. */
1003 { "-L", "--directory", 0, 1 },
1004 { "-directory", 0, 0, 1 },
1005 { "-l", "--load", 0, 1 },
1006 { "-load", 0, 0, 1 },
1007 { "-f", "--funcall", 0, 1 },
1008 { "-funcall", 0, 0, 1 },
1009 { "-eval", "--eval", 0, 1 },
1010 { "-insert", "--insert", 0, 1 },
1011 /* This should be processed after ordinary file name args and the like. */
1012 { "-kill", "--kill", -10, 0 },
1015 /* Reorder the elements of ARGV (assumed to have ARGC elements)
1016 so that the highest priority ones come first.
1017 Do not change the order of elements of equal priority.
1018 If an option takes an argument, keep it and its argument together. */
1021 sort_args (argc
, argv
)
1025 char **new = (char **) xmalloc (sizeof (char *) * argc
);
1026 /* For each element of argv,
1027 the corresponding element of options is:
1028 0 for an option that takes no arguments,
1029 1 for an option that takes one argument, etc.
1030 -1 for an ordinary non-option argument. */
1031 int *options
= (int *) xmalloc (sizeof (int) * argc
);
1032 int *priority
= (int *) xmalloc (sizeof (int) * argc
);
1037 /* Categorize all the options,
1038 and figure out which argv elts are option arguments. */
1039 for (from
= 1; from
< argc
; from
++)
1043 if (argv
[from
][0] == '-')
1048 /* Look for a match with a known old-fashioned option. */
1049 for (i
= 0; i
< sizeof (standard_args
) / sizeof (standard_args
[0]); i
++)
1050 if (!strcmp (argv
[from
], standard_args
[i
].name
))
1052 options
[from
] = standard_args
[i
].nargs
;
1053 priority
[from
] = standard_args
[i
].priority
;
1054 from
+= standard_args
[i
].nargs
;
1058 /* Look for a match with a known long option.
1059 MATCH is -1 if no match so far, -2 if two or more matches so far,
1060 >= 0 (the table index of the match) if just one match so far. */
1061 if (argv
[from
][1] == '-')
1064 thislen
= strlen (argv
[from
]);
1065 equals
= index (argv
[from
], '=');
1067 thislen
= equals
- argv
[from
];
1070 i
< sizeof (standard_args
) / sizeof (standard_args
[0]); i
++)
1071 if (standard_args
[i
].longname
1072 && !strncmp (argv
[from
], standard_args
[i
].longname
,
1081 /* If we found exactly one match, use that. */
1084 options
[from
] = standard_args
[match
].nargs
;
1085 priority
[from
] = standard_args
[match
].priority
;
1086 /* If --OPTION=VALUE syntax is used,
1087 this option uses just one argv element. */
1090 from
+= options
[from
];
1097 /* Copy the arguments, in order of decreasing priority, to NEW. */
1102 int best_priority
= -9999;
1104 /* Find the highest priority remaining option.
1105 If several have equal priority, take the first of them. */
1106 for (from
= 1; from
< argc
; from
++)
1108 if (argv
[from
] != 0 && priority
[from
] > best_priority
)
1110 best_priority
= priority
[from
];
1113 /* Skip option arguments--they are tied to the options. */
1114 if (options
[from
] > 0)
1115 from
+= options
[from
];
1121 /* Copy the highest priority remaining option, with its args, to NEW. */
1122 new[to
++] = argv
[best
];
1123 for (i
= 0; i
< options
[best
]; i
++)
1124 new[to
++] = argv
[best
+ i
+ 1];
1126 /* Clear out this option in ARGV. */
1128 for (i
= 0; i
< options
[best
]; i
++)
1129 argv
[best
+ i
+ 1] = 0;
1132 bcopy (new, argv
, sizeof (char *) * argc
);
1135 DEFUN ("kill-emacs", Fkill_emacs
, Skill_emacs
, 0, 1, "P",
1136 "Exit the Emacs job and kill it.\n\
1137 If ARG is an integer, return ARG as the exit program code.\n\
1138 If ARG is a string, stuff it as keyboard input.\n\n\
1139 The value of `kill-emacs-hook', if not void,\n\
1140 is a list of functions (of no args),\n\
1141 all of which are called before Emacs is actually killed.")
1145 Lisp_Object hook
, hook1
;
1147 struct gcpro gcpro1
;
1154 if (!NILP (Vrun_hooks
) && !noninteractive
)
1155 call1 (Vrun_hooks
, intern ("kill-emacs-hook"));
1159 /* Is it really necessary to do this deassign
1160 when we are going to exit anyway? */
1165 shut_down_emacs (0, 0, STRINGP (arg
) ? arg
: Qnil
);
1167 /* If we have an auto-save list file,
1168 kill it because we are exiting Emacs deliberately (not crashing).
1169 Do it after shut_down_emacs, which does an auto-save. */
1170 if (STRINGP (Vauto_save_list_file_name
))
1171 unlink (XSTRING (Vauto_save_list_file_name
)->data
);
1173 exit (INTEGERP (arg
) ? XINT (arg
)
1184 /* Perform an orderly shutdown of Emacs. Autosave any modified
1185 buffers, kill any child processes, clean up the terminal modes (if
1186 we're in the foreground), and other stuff like that. Don't perform
1187 any redisplay; this may be called when Emacs is shutting down in
1188 the background, or after its X connection has died.
1190 If SIG is a signal number, print a message for it.
1192 This is called by fatal signal handlers, X protocol error handlers,
1196 shut_down_emacs (sig
, no_x
, stuff
)
1200 /* Prevent running of hooks from now on. */
1203 /* If we are controlling the terminal, reset terminal modes */
1204 #ifdef EMACS_HAVE_TTY_PGRP
1206 int pgrp
= EMACS_GETPGRP (0);
1209 if (EMACS_GET_TTY_PGRP (0, &tpgrp
) != -1
1214 if (sig
&& sig
!= SIGTERM
)
1215 fprintf (stderr
, "Fatal error (%d).", sig
);
1223 stuff_buffered_input (stuff
);
1225 kill_buffer_processes (Qnil
);
1226 Fdo_auto_save (Qt
, Qnil
);
1228 #ifdef CLASH_DETECTION
1229 unlock_all_files ();
1233 kill_vms_processes ();
1236 #if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
1237 #ifdef HAVE_X_WINDOWS
1238 /* It's not safe to call intern here. Maybe we are crashing. */
1239 if (!noninteractive
&& SYMBOLP (Vwindow_system
)
1240 && XSYMBOL (Vwindow_system
)->name
->size
== 1
1241 && XSYMBOL (Vwindow_system
)->name
->data
[0] == 'x'
1243 Fx_close_current_connection ();
1244 #endif /* HAVE_X_WINDOWS */
1248 /* There is a tendency for a SIGIO signal to arrive within exit,
1249 and cause a SIGHUP because the input descriptor is already closed. */
1251 signal (SIGIO
, SIG_IGN
);
1261 DEFUN ("dump-emacs-data", Fdump_emacs_data
, Sdump_emacs_data
, 1, 1, 0,
1262 "Dump current state of Emacs into data file FILENAME.\n\
1263 This function exists on systems that use HAVE_SHM.")
1265 Lisp_Object intoname
;
1267 extern char my_edata
[];
1270 CHECK_STRING (intoname
, 0);
1271 intoname
= Fexpand_file_name (intoname
, Qnil
);
1274 Vpurify_flag
= Qnil
;
1277 /* Tell malloc where start of impure now is */
1278 /* Also arrange for warnings when nearly out of space. */
1279 #ifndef SYSTEM_MALLOC
1280 memory_warnings (my_edata
, malloc_warning
);
1282 map_out_data (XSTRING (intoname
)->data
);
1289 #else /* not HAVE_SHM */
1291 DEFUN ("dump-emacs", Fdump_emacs
, Sdump_emacs
, 2, 2, 0,
1292 "Dump current state of Emacs into executable file FILENAME.\n\
1293 Take symbols from SYMFILE (presumably the file you executed to run Emacs).\n\
1294 This is used in the file `loadup.el' when building Emacs.\n\
1296 Bind `command-line-processed' to nil before dumping,\n\
1297 if you want the dumped Emacs to process its command line\n\
1298 and announce itself normally when it is run.")
1300 Lisp_Object intoname
, symname
;
1302 extern char my_edata
[];
1305 CHECK_STRING (intoname
, 0);
1306 intoname
= Fexpand_file_name (intoname
, Qnil
);
1307 if (!NILP (symname
))
1309 CHECK_STRING (symname
, 0);
1310 if (XSTRING (symname
)->size
)
1311 symname
= Fexpand_file_name (symname
, Qnil
);
1315 Vpurify_flag
= Qnil
;
1319 mapout_data (XSTRING (intoname
)->data
);
1321 /* Tell malloc where start of impure now is */
1322 /* Also arrange for warnings when nearly out of space. */
1323 #ifndef SYSTEM_MALLOC
1325 /* On Windows, this was done before dumping, and that once suffices.
1326 Meanwhile, my_edata is not valid on Windows. */
1327 memory_warnings (my_edata
, malloc_warning
);
1328 #endif /* not WINDOWSNT */
1330 unexec (XSTRING (intoname
)->data
,
1331 !NILP (symname
) ? XSTRING (symname
)->data
: 0, my_edata
, 0, 0);
1332 #endif /* not VMS */
1339 #endif /* not HAVE_SHM */
1341 #endif /* not CANNOT_DUMP */
1348 decode_env_path (evarname
, defalt
)
1349 char *evarname
, *defalt
;
1351 register char *path
, *p
;
1355 /* It's okay to use getenv here, because this function is only used
1356 to initialize variables when Emacs starts up, and isn't called
1359 path
= (char *) getenv (evarname
);
1367 p
= index (path
, SEPCHAR
);
1368 if (!p
) p
= path
+ strlen (path
);
1369 lpath
= Fcons (p
- path
? make_string (path
, p
- path
)
1370 : build_string ("."),
1377 return Fnreverse (lpath
);
1384 defsubr (&Sdump_emacs_data
);
1386 defsubr (&Sdump_emacs
);
1390 defsubr (&Skill_emacs
);
1392 defsubr (&Sinvocation_name
);
1393 defsubr (&Sinvocation_directory
);
1395 DEFVAR_LISP ("command-line-args", &Vcommand_line_args
,
1396 "Args passed by shell to Emacs, as a list of strings.");
1398 DEFVAR_LISP ("system-type", &Vsystem_type
,
1399 "Value is symbol indicating type of operating system you are using.");
1400 Vsystem_type
= intern (SYSTEM_TYPE
);
1402 DEFVAR_LISP ("system-configuration", &Vsystem_configuration
,
1403 "Value is string indicating configuration Emacs was built for.");
1404 Vsystem_configuration
= build_string (EMACS_CONFIGURATION
);
1406 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options
,
1407 "String containing the configuration options Emacs was built with.");
1408 Vsystem_configuration_options
= build_string (EMACS_CONFIG_OPTIONS
);
1410 DEFVAR_BOOL ("noninteractive", &noninteractive1
,
1411 "Non-nil means Emacs is running without interactive terminal.");
1413 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook
,
1414 "Hook to be run whenever kill-emacs is called.\n\
1415 Since kill-emacs may be invoked when the terminal is disconnected (or\n\
1416 in other similar situations), functions placed on this hook should not\n\
1417 expect to be able to interact with the user. To ask for confirmation,\n\
1418 see `kill-emacs-query-functions' instead.");
1419 Vkill_emacs_hook
= Qnil
;
1421 DEFVAR_INT ("emacs-priority", &emacs_priority
,
1422 "Priority for Emacs to run at.\n\
1423 This value is effective only if set before Emacs is dumped,\n\
1424 and only if the Emacs executable is installed with setuid to permit\n\
1425 it to change priority. (Emacs sets its uid back to the real uid.)\n\
1426 Currently, you need to define SET_EMACS_PRIORITY in `config.h'\n\
1427 before you compile Emacs, to enable the code for this feature.");
1430 DEFVAR_LISP ("invocation-name", &Vinvocation_name
,
1431 "The program name that was used to run Emacs.\n\
1432 Any directory names are omitted.");
1434 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory
,
1435 "The directory in which the Emacs executable was found, to run it.\n\
1436 The value is nil if that directory's name is not known.");
1438 DEFVAR_LISP ("installation-directory", &Vinstallation_directory
,
1439 "A directory within which to look for the `lib-src' and `etc' directories.\n\
1440 This is non-nil when we can't find those directories in their standard\n\
1441 installed locations, but we can find them\n\
1442 near where the Emacs executable was found.");
1443 Vinstallation_directory
= Qnil
;