1 /* Fully extensible Emacs, running on Unix, intended for GNU.
2 Copyright (C) 1985,86,87,93,94,95,97,98,1999 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, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
27 #include <sys/types.h>
39 #include <sys/ioctl.h>
44 #include "intervals.h"
48 #include "blockinput.h"
49 #include "syssignal.h"
51 #include "termhooks.h"
60 #include <sys/resource.h>
67 extern void malloc_warning ();
68 extern void set_time_zone_rule ();
69 extern char *index ();
71 /* Command line args from shell, as list of strings */
72 Lisp_Object Vcommand_line_args
;
74 /* The name under which Emacs was invoked, with any leading directory
76 Lisp_Object Vinvocation_name
;
78 /* The directory name from which Emacs was invoked. */
79 Lisp_Object Vinvocation_directory
;
81 /* The directory name in which to find subdirs such as lisp and etc.
82 nil means get them only from PATH_LOADSEARCH. */
83 Lisp_Object Vinstallation_directory
;
85 /* Hook run by `kill-emacs' before it does really anything. */
86 Lisp_Object Vkill_emacs_hook
;
89 /* Hooks for signal USR1 and USR2 handing */
90 Lisp_Object Vsignal_USR1_hook
;
92 Lisp_Object Vsignal_USR2_hook
;
96 /* Search path separator. */
97 Lisp_Object Vpath_separator
;
99 /* Set nonzero after Emacs has started up the first time.
100 Prevents reinitialization of the Lisp world and keymaps
101 on subsequent starts. */
104 #ifdef DOUG_LEA_MALLOC
105 /* Preserves a pointer to the memory allocated that copies that
106 static data inside glibc's malloc. */
107 void *malloc_state_ptr
;
108 /* From glibc, a routine that returns a copy of the malloc internal state. */
109 extern void *malloc_get_state ();
110 /* From glibc, a routine that overwrites the malloc internal state. */
111 extern void malloc_set_state ();
112 /* Non-zero if the MALLOC_CHECK_ enviroment variable was set while
113 dumping. Used to work around a bug in glibc's malloc. */
114 int malloc_using_checking
;
117 /* Variable whose value is symbol giving operating system type. */
118 Lisp_Object Vsystem_type
;
120 /* Variable whose value is string giving configuration built for. */
121 Lisp_Object Vsystem_configuration
;
123 /* Variable whose value is string giving configuration options,
124 for use when reporting bugs. */
125 Lisp_Object Vsystem_configuration_options
;
127 Lisp_Object Qfile_name_handler_alist
;
129 /* Current and previous system locales for messages and time. */
130 Lisp_Object Vsystem_messages_locale
;
131 Lisp_Object Vprevious_system_messages_locale
;
132 Lisp_Object Vsystem_time_locale
;
133 Lisp_Object Vprevious_system_time_locale
;
135 /* If non-zero, emacs should not attempt to use an window-specific code,
136 but instead should use the virtual terminal under which it was started */
137 int inhibit_window_system
;
139 /* If nonzero, set Emacs to run at this priority. This is also used
140 in child_setup and sys_suspend to make sure subshells run at normal
141 priority; Those functions have their own extern declaration. */
144 /* If non-zero a filter or a sentinel is running. Tested to save the match
145 data on the first attempt to change it inside asynchronous code. */
146 int running_asynch_code
;
150 extern int inherited_pgroup
;
153 #ifdef HAVE_X_WINDOWS
154 /* If non-zero, -d was specified, meaning we're using some window system. */
158 /* An address near the bottom of the stack.
159 Tells GC how to save a copy of the stack. */
162 #ifdef HAVE_WINDOW_SYSTEM
163 extern Lisp_Object Vwindow_system
;
164 #endif /* HAVE_WINDOW_SYSTEM */
166 extern Lisp_Object Vauto_save_list_file_name
;
168 #ifdef USG_SHARED_LIBRARIES
169 /* If nonzero, this is the place to put the end of the writable segment
172 unsigned int bss_end
= 0;
175 /* Nonzero means running Emacs without interactive terminal. */
179 /* Value of Lisp variable `noninteractive'.
180 Normally same as C variable `noninteractive'
181 but nothing terrible happens if user sets this one. */
185 /* Save argv and argc. */
189 static void sort_args ();
190 void syms_of_emacs ();
192 /* Signal code for the fatal signal that was received */
193 int fatal_error_code
;
195 /* Nonzero if handling a fatal error already */
196 int fatal_error_in_progress
;
200 handle_USR1_signal (sig
)
203 struct input_event buf
;
205 buf
.kind
= user_signal
;
207 buf
.frame_or_window
= selected_frame
;
211 kbd_buffer_store_event (&buf
);
217 handle_USR2_signal (sig
)
220 struct input_event buf
;
222 buf
.kind
= user_signal
;
224 buf
.frame_or_window
= selected_frame
;
228 kbd_buffer_store_event (&buf
);
232 /* Handle bus errors, illegal instruction, etc. */
234 fatal_error_signal (sig
)
237 fatal_error_code
= sig
;
238 signal (sig
, SIG_DFL
);
240 TOTALLY_UNBLOCK_INPUT
;
242 /* If fatal error occurs in code below, avoid infinite recursion. */
243 if (! fatal_error_in_progress
)
245 fatal_error_in_progress
= 1;
247 shut_down_emacs (sig
, 0, Qnil
);
251 LIB$
STOP (SS$_ABORT
);
253 /* Signal the same code; this time it will really be fatal.
254 Remember that since we're in a signal handler, the signal we're
255 going to send is probably blocked, so we have to unblock it if we
256 want to really receive it. */
258 sigunblock (sigmask (fatal_error_code
));
260 kill (getpid (), fatal_error_code
);
266 /* Handler for SIGDANGER. */
268 memory_warning_signal (sig
)
271 signal (sig
, memory_warning_signal
);
273 malloc_warning ("Operating system warns that virtual memory is running low.\n");
275 /* It might be unsafe to call do_auto_save now. */
276 force_auto_save_soon ();
280 /* We define abort, rather than using it from the library,
281 so that GDB can return from a breakpoint here.
282 MSDOS has its own definition on msdos.c */
284 #if ! defined (DOS_NT) && ! defined (NO_ABORT)
286 #ifndef ABORT_RETURN_TYPE
287 #define ABORT_RETURN_TYPE void
293 kill (getpid (), SIGABRT
);
294 /* This shouldn't be executed, but it prevents a warning. */
300 /* Code for dealing with Lisp access to the Unix command line */
303 init_cmdargs (argc
, argv
, skip_args
)
309 Lisp_Object name
, dir
, tem
;
310 int count
= specpdl_ptr
- specpdl
;
311 Lisp_Object raw_name
;
316 raw_name
= build_string (argv
[0]);
318 /* Add /: to the front of the name
319 if it would otherwise be treated as magic. */
320 tem
= Ffind_file_name_handler (raw_name
, Qt
);
322 raw_name
= concat2 (build_string ("/:"), raw_name
);
324 Vinvocation_name
= Ffile_name_nondirectory (raw_name
);
325 Vinvocation_directory
= Ffile_name_directory (raw_name
);
327 /* If we got no directory in argv[0], search PATH to find where
328 Emacs actually came from. */
329 if (NILP (Vinvocation_directory
))
332 int yes
= openp (Vexec_path
, Vinvocation_name
,
333 EXEC_SUFFIXES
, &found
, 1);
336 /* Add /: to the front of the name
337 if it would otherwise be treated as magic. */
338 tem
= Ffind_file_name_handler (found
, Qt
);
340 found
= concat2 (build_string ("/:"), found
);
341 Vinvocation_directory
= Ffile_name_directory (found
);
345 if (!NILP (Vinvocation_directory
)
346 && NILP (Ffile_name_absolute_p (Vinvocation_directory
)))
347 /* Emacs was started with relative path, like ./emacs.
349 Vinvocation_directory
= Fexpand_file_name (Vinvocation_directory
, Qnil
);
351 Vinstallation_directory
= Qnil
;
353 if (!NILP (Vinvocation_directory
))
355 dir
= Vinvocation_directory
;
356 name
= Fexpand_file_name (Vinvocation_name
, dir
);
359 Lisp_Object tem
, lib_src_exists
;
360 Lisp_Object etc_exists
, info_exists
;
362 /* See if dir contains subdirs for use by Emacs.
363 Check for the ones that would exist in a build directory,
364 not including lisp and info. */
365 tem
= Fexpand_file_name (build_string ("lib-src"), dir
);
366 lib_src_exists
= Ffile_exists_p (tem
);
369 /* MSDOS installations frequently remove lib-src, but we still
370 must set installation-directory, or else info won't find
371 its files (it uses the value of installation-directory). */
372 tem
= Fexpand_file_name (build_string ("info"), dir
);
373 info_exists
= Ffile_exists_p (tem
);
378 if (!NILP (lib_src_exists
) || !NILP (info_exists
))
380 tem
= Fexpand_file_name (build_string ("etc"), dir
);
381 etc_exists
= Ffile_exists_p (tem
);
382 if (!NILP (etc_exists
))
384 Vinstallation_directory
385 = Ffile_name_as_directory (dir
);
390 /* See if dir's parent contains those subdirs. */
391 tem
= Fexpand_file_name (build_string ("../lib-src"), dir
);
392 lib_src_exists
= Ffile_exists_p (tem
);
396 /* See the MSDOS commentary above. */
397 tem
= Fexpand_file_name (build_string ("../info"), dir
);
398 info_exists
= Ffile_exists_p (tem
);
403 if (!NILP (lib_src_exists
) || !NILP (info_exists
))
405 tem
= Fexpand_file_name (build_string ("../etc"), dir
);
406 etc_exists
= Ffile_exists_p (tem
);
407 if (!NILP (etc_exists
))
409 tem
= Fexpand_file_name (build_string (".."), dir
);
410 Vinstallation_directory
411 = Ffile_name_as_directory (tem
);
416 /* If the Emacs executable is actually a link,
417 next try the dir that the link points into. */
418 tem
= Ffile_symlink_p (name
);
421 name
= Fexpand_file_name (tem
, dir
);
422 dir
= Ffile_name_directory (name
);
429 Vcommand_line_args
= Qnil
;
431 for (i
= argc
- 1; i
>= 0; i
--)
433 if (i
== 0 || i
> skip_args
)
435 = Fcons (build_string (argv
[i
]), Vcommand_line_args
);
438 unbind_to (count
, Qnil
);
441 DEFUN ("invocation-name", Finvocation_name
, Sinvocation_name
, 0, 0, 0,
442 "Return the program name that was used to run Emacs.\n\
443 Any directory names are omitted.")
446 return Fcopy_sequence (Vinvocation_name
);
449 DEFUN ("invocation-directory", Finvocation_directory
, Sinvocation_directory
,
451 "Return the directory name in which the Emacs executable was located")
454 return Fcopy_sequence (Vinvocation_directory
);
459 #ifdef LINK_CRTL_SHARE
460 #ifdef SHARABLE_LIB_BUG
461 extern noshare
char **environ
;
462 #endif /* SHARABLE_LIB_BUG */
463 #endif /* LINK_CRTL_SHARE */
467 /* A valid but unlikely value for the TZ environment value.
468 It is OK (though a bit slower) if the user actually chooses this value. */
469 static char dump_tz
[] = "UtC0";
472 #ifndef ORDINARY_LINK
473 /* We don't include crtbegin.o and crtend.o in the link,
474 so these functions and variables might be missed.
475 Provide dummy definitions to avoid error.
476 (We don't have any real constructors or destructors.) */
478 #ifndef GCC_CTORS_IN_LIBC
479 void __do_global_ctors ()
481 void __do_global_ctors_aux ()
483 void __do_global_dtors ()
485 /* Linux has a bug in its library; avoid an error. */
487 char * __CTOR_LIST__
[2] = { (char *) (-1), 0 };
489 char * __DTOR_LIST__
[2] = { (char *) (-1), 0 };
490 #endif /* GCC_CTORS_IN_LIBC */
493 #endif /* __GNUC__ */
494 #endif /* ORDINARY_LINK */
496 /* Test whether the next argument in ARGV matches SSTR or a prefix of
497 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
498 (the argument is supposed to have a value) store in *VALPTR either
499 the next argument or the portion of this one after the equal sign.
500 ARGV is read starting at position *SKIPPTR; this index is advanced
501 by the number of arguments used.
503 Too bad we can't just use getopt for all of this, but we don't have
504 enough information to do it right. */
507 argmatch (argv
, argc
, sstr
, lstr
, minlen
, valptr
, skipptr
)
520 /* Don't access argv[argc]; give up in advance. */
521 if (argc
<= *skipptr
+ 1)
524 arg
= argv
[*skipptr
+1];
527 if (strcmp (arg
, sstr
) == 0)
531 *valptr
= argv
[*skipptr
+2];
538 arglen
= (valptr
!= NULL
&& (p
= index (arg
, '=')) != NULL
539 ? p
- arg
: strlen (arg
));
540 if (lstr
== 0 || arglen
< minlen
|| strncmp (arg
, lstr
, arglen
) != 0)
542 else if (valptr
== NULL
)
553 else if (argv
[*skipptr
+2] != NULL
)
555 *valptr
= argv
[*skipptr
+2];
565 #ifdef DOUG_LEA_MALLOC
567 /* malloc can be invoked even before main (e.g. by the dynamic
568 linker), so the dumped malloc state must be restored as early as
569 possible using this special hook. */
572 malloc_initialize_hook ()
574 extern char **environ
;
578 if (!malloc_using_checking
)
579 /* Work around a bug in glibc's malloc. MALLOC_CHECK_ must be
580 ignored if the heap to be restored was constructed without
581 malloc checking. Can't use unsetenv, since that calls malloc. */
585 for (p
= environ
; *p
; p
++)
586 if (strncmp (*p
, "MALLOC_CHECK_=", 14) == 0)
595 malloc_set_state (malloc_state_ptr
);
596 free (malloc_state_ptr
);
599 malloc_using_checking
= getenv ("MALLOC_CHECK_") != NULL
;
602 void (*__malloc_initialize_hook
) () = malloc_initialize_hook
;
604 #endif /* DOUG_LEA_MALLOC */
608 main (argc
, argv
, envp
)
613 char stack_bottom_variable
;
614 int do_initial_setlocale
;
618 #ifdef HAVE_SETRLIMIT
623 #ifdef LINUX_SBRK_BUG
627 #ifdef RUN_TIME_REMAP
629 run_time_remap (argv
[0]);
632 sort_args (argc
, argv
);
634 while (argv
[argc
]) argc
++;
636 if (argmatch (argv
, argc
, "-version", "--version", 3, NULL
, &skip_args
)
637 /* We don't know the version number unless this is a dumped Emacs.
638 So ignore --version otherwise. */
642 tem
= Fsymbol_value (intern ("emacs-version"));
645 fprintf (stderr
, "Invalid value of `emacs-version'\n");
650 printf ("GNU Emacs %s\n", XSTRING (tem
)->data
);
651 printf ("Copyright (C) 1999 Free Software Foundation, Inc.\n");
652 printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
653 printf ("You may redistribute copies of Emacs\n");
654 printf ("under the terms of the GNU General Public License.\n");
655 printf ("For more information about these matters, ");
656 printf ("see the file named COPYING.\n");
661 /* Map in shared memory, if we are using that. */
663 if (argmatch (argv
, argc
, "-nl", "--no-shared-memory", 6, NULL
, &skip_args
))
666 /* The shared memory was just restored, which clobbered this. */
672 /* The shared memory was just restored, which clobbered this. */
679 extern int malloc_cookie
;
680 /* This helps out unexnext.c. */
682 if (malloc_jumpstart (malloc_cookie
) != 0)
683 printf ("malloc jumpstart failed!\n");
688 /* If -map specified, map the data file in */
691 if (argmatch (argv
, argc
, "-map", "--map-data", 3, &mapin_file
, &skip_args
))
695 #ifdef LINK_CRTL_SHARE
696 #ifdef SHARABLE_LIB_BUG
697 /* Bletcherous shared libraries! */
699 stdin
= fdopen (0, "r");
701 stdout
= fdopen (1, "w");
703 stderr
= fdopen (2, "w");
706 #endif /* SHARABLE_LIB_BUG */
707 #endif /* LINK_CRTL_SHARE */
710 #if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
711 /* Extend the stack space available.
712 Don't do that if dumping, since some systems (e.g. DJGPP)
713 might define a smaller stack limit at that time. */
716 && (!noninteractive
|| initialized
)
718 && !getrlimit (RLIMIT_STACK
, &rlim
))
721 extern int re_max_failures
;
722 /* Approximate the amount regex.c needs per unit of re_max_failures. */
723 int ratio
= 20 * sizeof (char *);
724 /* Then add 33% to cover the size of the smaller stacks that regex.c
725 successively allocates and discards, on its way to the maximum. */
727 /* Add in some extra to cover
728 what we're likely to use for other reasons. */
729 newlim
= re_max_failures
* ratio
+ 200000;
731 /* NetBSD (at least NetBSD 1.2G and former) has a bug in its
732 stack allocation routine for new process that the allocation
733 fails if stack limit is not on page boundary. So, round up the
734 new limit to page boundary. */
735 newlim
= (newlim
+ getpagesize () - 1) / getpagesize () * getpagesize();
737 if (newlim
> rlim
.rlim_max
)
739 newlim
= rlim
.rlim_max
;
740 /* Don't let regex.c overflow the stack we have. */
741 re_max_failures
= (newlim
- 200000) / ratio
;
743 if (rlim
.rlim_cur
< newlim
)
744 rlim
.rlim_cur
= newlim
;
746 setrlimit (RLIMIT_STACK
, &rlim
);
748 #endif /* HAVE_SETRLIMIT and RLIMIT_STACK */
750 /* Record (approximately) where the stack begins. */
751 stack_bottom
= &stack_bottom_variable
;
753 #ifdef USG_SHARED_LIBRARIES
755 brk ((void *)bss_end
);
760 #ifndef SYSTEM_MALLOC
761 /* Arrange to get warning messages as memory fills up. */
762 memory_warnings (0, malloc_warning
);
764 /* Call malloc at least once, to run the initial __malloc_hook.
765 Also call realloc and free for consistency. */
766 free (realloc (malloc (4), 4));
768 /* Arrange to disable interrupt input inside malloc etc. */
769 uninterrupt_malloc ();
770 #endif /* not SYSTEM_MALLOC */
773 /* We do all file input/output as binary files. When we need to translate
774 newlines, we do that manually. */
778 if (!isatty (fileno (stdin
)))
779 setmode (fileno (stdin
), O_BINARY
);
780 if (!isatty (fileno (stdout
)))
783 setmode (fileno (stdout
), O_BINARY
);
785 #else /* not __DJGPP__ >= 2 */
786 (stdin
)->_flag
&= ~_IOTEXT
;
787 (stdout
)->_flag
&= ~_IOTEXT
;
788 (stderr
)->_flag
&= ~_IOTEXT
;
789 #endif /* not __DJGPP__ >= 2 */
792 #ifdef SET_EMACS_PRIORITY
794 nice (emacs_priority
);
796 #endif /* SET_EMACS_PRIORITY */
798 /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
799 The build procedure uses this while dumping, to ensure that the
800 dumped Emacs does not have its system locale tables initialized,
801 as that might cause screwups when the dumped Emacs starts up. */
803 char *lc_all
= getenv ("LC_ALL");
804 do_initial_setlocale
= ! lc_all
|| strcmp (lc_all
, "C");
807 /* Set locale now, so that initial error messages are localized properly.
808 fixup_locale must wait until later, since it builds strings. */
809 if (do_initial_setlocale
)
810 setlocale (LC_ALL
, "");
812 #ifdef EXTRA_INITIALIZE
816 inhibit_window_system
= 0;
818 /* Handle the -t switch, which specifies filename to use as terminal */
822 if (argmatch (argv
, argc
, "-t", "--terminal", 4, &term
, &skip_args
))
827 result
= emacs_open (term
, O_RDWR
, 0);
830 char *errstring
= strerror (errno
);
831 fprintf (stderr
, "emacs: %s: %s\n", term
, errstring
);
837 fprintf (stderr
, "emacs: %s: not a tty\n", term
);
840 fprintf (stderr
, "Using %s\n", term
);
841 #ifdef HAVE_WINDOW_SYSTEM
842 inhibit_window_system
= 1; /* -t => -nw */
849 if (argmatch (argv
, argc
, "-nw", "--no-windows", 6, NULL
, &skip_args
))
850 inhibit_window_system
= 1;
852 /* Handle the -batch switch, which means don't do interactive display. */
854 if (argmatch (argv
, argc
, "-batch", "--batch", 5, NULL
, &skip_args
))
857 /* Handle the --help option, which gives a usage message.. */
858 if (argmatch (argv
, argc
, "-help", "--help", 3, NULL
, &skip_args
))
861 Usage: %s [--batch] [-t term] [--terminal term]\n\
862 [-d display] [--display display] [-nw] [--no-windows]\n\
863 [-q] [--no-init-file] [-u user] [--user user] [--debug-init]\n\
864 [--unibyte] [--multibyte] [--version] [--no-site-file]\n\
865 [-f func] [--funcall func] [-l file] [--load file] [--eval expr]\n\
866 [--execute expr] [--visit file] [--file file] [--insert file]\n\
867 [+linenum] file-to-visit [--kill]\n\
868 Report bugs to bug-gnu-emacs@gnu.org. First, please see\n\
869 the Bugs section of the Emacs manual or the file BUGS.\n", argv
[0]);
873 if (! noninteractive
)
878 inherited_pgroup
= EMACS_GETPGRP (0);
879 setpgrp (0, getpid ());
882 #if defined (USG5) && defined (INTERRUPT_INPUT)
890 /* Don't catch SIGHUP if dumping. */
897 sigblock (sigmask (SIGHUP
));
898 /* In --batch mode, don't catch SIGHUP if already ignored.
899 That makes nohup work. */
901 || signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
902 signal (SIGHUP
, fatal_error_signal
);
903 sigunblock (sigmask (SIGHUP
));
908 ! noninteractive
|| initialized
914 /* Don't catch these signals in batch mode if dumping.
915 On some machines, this sets static data that would make
916 signal fail to work right when the dumped Emacs is run. */
917 signal (SIGQUIT
, fatal_error_signal
);
918 signal (SIGILL
, fatal_error_signal
);
919 signal (SIGTRAP
, fatal_error_signal
);
921 signal (SIGUSR1
, handle_USR1_signal
);
923 signal (SIGUSR2
, handle_USR2_signal
);
927 signal (SIGABRT
, fatal_error_signal
);
930 signal (SIGHWE
, fatal_error_signal
);
933 signal (SIGPRE
, fatal_error_signal
);
936 signal (SIGORE
, fatal_error_signal
);
939 signal (SIGUME
, fatal_error_signal
);
942 signal (SIGDLK
, fatal_error_signal
);
945 signal (SIGCPULIM
, fatal_error_signal
);
948 /* This is missing on some systems - OS/2, for example. */
949 signal (SIGIOT
, fatal_error_signal
);
952 signal (SIGEMT
, fatal_error_signal
);
954 signal (SIGFPE
, fatal_error_signal
);
956 signal (SIGBUS
, fatal_error_signal
);
958 signal (SIGSEGV
, fatal_error_signal
);
960 signal (SIGSYS
, fatal_error_signal
);
962 signal (SIGTERM
, fatal_error_signal
);
964 signal (SIGXCPU
, fatal_error_signal
);
967 signal (SIGXFSZ
, fatal_error_signal
);
971 /* This just means available memory is getting low. */
972 signal (SIGDANGER
, memory_warning_signal
);
976 /* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
977 signal (SIGXCPU
, fatal_error_signal
);
979 signal (SIGIOINT
, fatal_error_signal
);
981 signal (SIGGRANT
, fatal_error_signal
);
982 signal (SIGRETRACT
, fatal_error_signal
);
983 signal (SIGSOUND
, fatal_error_signal
);
984 signal (SIGMSG
, fatal_error_signal
);
988 noninteractive1
= noninteractive
;
990 /* Perform basic initializations (not merely interning symbols) */
997 init_charset_once ();
999 init_syntax_once (); /* Create standard syntax table. */
1000 init_category_once (); /* Create standard category table. */
1001 /* Must be done before init_buffer */
1002 init_casetab_once ();
1003 init_buffer_once (); /* Create buffer table and some buffers */
1004 init_minibuf_once (); /* Create list of minibuffers */
1005 /* Must precede init_window_once */
1007 /* Call syms_of_xfaces before init_window_once because that
1008 function creates Vterminal_frame. Termcap frames now use
1009 faces, and the face implementation uses some symbols as
1015 init_window_once (); /* Init the window system */
1016 init_fileio_once (); /* Must precede any path manipulation. */
1021 if (do_initial_setlocale
)
1024 Vsystem_messages_locale
= Vprevious_system_messages_locale
;
1025 Vsystem_time_locale
= Vprevious_system_time_locale
;
1031 #ifdef CLASH_DETECTION
1034 running_asynch_code
= 0;
1036 /* Handle --unibyte and the EMACS_UNIBYTE envvar,
1037 but not while dumping. */
1040 ! noninteractive
|| initialized
1046 int inhibit_unibyte
= 0;
1048 /* --multibyte overrides EMACS_UNIBYTE. */
1049 if (argmatch (argv
, argc
, "-no-unibyte", "--no-unibyte", 4, NULL
, &skip_args
)
1050 || argmatch (argv
, argc
, "-multibyte", "--multibyte", 4, NULL
, &skip_args
))
1051 inhibit_unibyte
= 1;
1053 /* --unibyte requests that we set up to do everything with single-byte
1054 buffers and strings. We need to handle this before calling
1055 init_lread, init_editfns and other places that generate Lisp strings
1056 from text in the environment. */
1057 /* Actually this shouldn't be needed as of 20.4 in a generally
1058 unibyte environment. As handa says, environment values
1059 aren't now decoded; also existing buffers are now made
1060 unibyte during startup if .emacs sets unibyte. Tested with
1061 8-bit data in environment variables and /etc/passwd, setting
1062 unibyte and Latin-1 in .emacs. -- Dave Love */
1063 if (argmatch (argv
, argc
, "-unibyte", "--unibyte", 4, NULL
, &skip_args
)
1064 || argmatch (argv
, argc
, "-no-multibyte", "--no-multibyte", 4, NULL
, &skip_args
)
1065 || (getenv ("EMACS_UNIBYTE") && !inhibit_unibyte
))
1067 Lisp_Object old_log_max
;
1068 Lisp_Object symbol
, tail
;
1070 symbol
= intern ("default-enable-multibyte-characters");
1071 Fset (symbol
, Qnil
);
1075 /* Erase pre-dump messages in *Messages* now so no abort. */
1076 old_log_max
= Vmessage_log_max
;
1077 XSETFASTINT (Vmessage_log_max
, 0);
1078 message_dolog ("", 0, 1, 0);
1079 Vmessage_log_max
= old_log_max
;
1082 for (tail
= Vbuffer_alist
; CONSP (tail
);
1087 buffer
= Fcdr (XCAR (tail
));
1088 /* Verify that all buffers are empty now, as they
1090 if (BUF_Z (XBUFFER (buffer
)) > BUF_BEG (XBUFFER (buffer
)))
1092 /* It is safe to do this crudely in an empty buffer. */
1093 XBUFFER (buffer
)->enable_multibyte_characters
= Qnil
;
1099 = !argmatch (argv
, argc
, "-nl", "--no-loadup", 6, NULL
, &skip_args
);
1102 #ifdef HAVE_X_WINDOWS
1103 /* Stupid kludge to catch command-line display spec. We can't
1104 handle this argument entirely in window system dependent code
1105 because we don't even know which window system dependent code
1106 to run until we've recognized this argument. */
1108 char *displayname
= 0;
1109 int count_before
= skip_args
;
1111 /* Skip any number of -d options, but only use the last one. */
1114 int count_before_this
= skip_args
;
1116 if (argmatch (argv
, argc
, "-d", "--display", 3, &displayname
, &skip_args
))
1118 else if (argmatch (argv
, argc
, "-display", 0, 3, &displayname
, &skip_args
))
1123 count_before
= count_before_this
;
1126 /* If we have the form --display=NAME,
1127 convert it into -d name.
1128 This requires inserting a new element into argv. */
1129 if (displayname
!= 0 && skip_args
- count_before
== 1)
1131 char **new = (char **) xmalloc (sizeof (char *) * (argc
+ 2));
1134 for (j
= 0; j
< count_before
+ 1; j
++)
1136 new[count_before
+ 1] = "-d";
1137 new[count_before
+ 2] = displayname
;
1138 for (j
= count_before
+ 2; j
<argc
; j
++)
1139 new[j
+ 1] = argv
[j
];
1143 /* Change --display to -d, when its arg is separate. */
1144 else if (displayname
!= 0 && skip_args
> count_before
1145 && argv
[count_before
+ 1][1] == '-')
1146 argv
[count_before
+ 1] = "-d";
1148 /* Don't actually discard this arg. */
1149 skip_args
= count_before
;
1153 /* argmatch must not be used after here,
1154 except when bulding temacs
1155 because the -d argument has not been skipped in skip_args. */
1158 /* Call early 'cause init_environment needs it. */
1160 /* Set defaults for several environment variables. */
1162 init_environment (argc
, argv
, skip_args
);
1168 /* Initialize environment from registry settings. */
1169 init_environment (argv
);
1170 init_ntproc (); /* must precede init_editfns */
1173 /* egetenv is a pretty low-level facility, which may get called in
1174 many circumstances; it seems flimsy to put off initializing it
1175 until calling init_callproc. */
1176 set_process_environment ();
1177 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
1178 if this is not done. Do it after set_process_environment so that we
1179 don't pollute Vprocess_environment. */
1184 init_buffer (); /* Init default directory of main buffer */
1186 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
1187 init_cmdargs (argc
, argv
, skip_args
); /* Must precede init_lread. */
1191 /* Erase any pre-dump messages in the message log, to avoid confusion */
1192 Lisp_Object old_log_max
;
1193 old_log_max
= Vmessage_log_max
;
1194 XSETFASTINT (Vmessage_log_max
, 0);
1195 message_dolog ("", 0, 1, 0);
1196 Vmessage_log_max
= old_log_max
;
1199 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
1202 /* Intern the names of all standard functions and variables;
1203 define standard keys. */
1207 /* The basic levels of Lisp must come first */
1208 /* And data must come first of all
1209 for the sake of symbols like error-message */
1216 syms_of_floatfns ();
1220 syms_of_bytecode ();
1222 syms_of_casefiddle ();
1224 syms_of_callproc ();
1225 syms_of_category ();
1229 #ifndef NO_DIR_LIBRARY
1231 #endif /* not NO_DIR_LIBRARY */
1237 syms_of_coding (); /* This should be after syms_of_fileio. */
1238 #ifdef CLASH_DETECTION
1239 syms_of_filelock ();
1240 #endif /* CLASH_DETECTION */
1243 syms_of_keyboard ();
1248 syms_of_mocklisp ();
1259 syms_of_textprop ();
1265 #endif /* WINDOWSNT */
1268 #ifdef HAVE_X_WINDOWS
1275 #endif /* HAVE_X_WINDOWS */
1284 syms_of_w32faces ();
1285 syms_of_w32select ();
1288 #endif /* HAVE_NTGUI */
1298 keys_of_casefiddle ();
1301 keys_of_keyboard ();
1309 if (!noninteractive
)
1312 init_vms_input ();/* init_display calls get_frame_size, that needs this */
1314 init_display (); /* Determine terminal type. init_sys_modes uses results */
1316 init_keyboard (); /* This too must precede init_sys_modes */
1318 init_vmsproc (); /* And this too. */
1320 init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.) */
1321 #ifdef HAVE_X_WINDOWS
1323 #endif /* HAVE_X_WINDOWS */
1328 #ifdef LISP_FLOAT_TYPE
1342 /* Handle -l loadup, args passed by Makefile. */
1343 if (argmatch (argv
, argc
, "-l", "--load", 3, &file
, &skip_args
))
1344 Vtop_level
= Fcons (intern ("load"),
1345 Fcons (build_string (file
), Qnil
));
1347 /* Unless next switch is -nl, load "loadup.el" first thing. */
1349 Vtop_level
= Fcons (intern ("load"),
1350 Fcons (build_string ("loadup.el"), Qnil
));
1351 #endif /* CANNOT_DUMP */
1358 /* If the execution TZ happens to be the same as the dump TZ,
1359 change it to some other value and then change it back,
1360 to force the underlying implementation to reload the TZ info.
1361 This is needed on implementations that load TZ info from files,
1362 since the TZ file contents may differ between dump and execution. */
1363 char *tz
= getenv ("TZ");
1364 if (tz
&& !strcmp (tz
, dump_tz
))
1374 /* Gerd Moellmann <gerd@acm.org> says this makes profiling work on
1375 FreeBSD. It might work on some other systems too.
1376 Give it a try and tell me if it works on your system. */
1377 #if defined (__FreeBSD__) || defined (__linux)
1381 extern void _mcleanup ();
1383 extern void safe_bcopy ();
1384 extern void dump_opcode_frequencies ();
1387 // atexit (dump_opcode_frequencies);
1388 /* This uses safe_bcopy because that function comes first in the
1389 Emacs executable. It might be better to use something that
1390 gives the start of the text segment, but start_of_text is not
1391 defined on all systems now. */
1392 monstartup (safe_bcopy
, &etext
);
1401 #ifdef LOCALTIME_CACHE
1402 /* Some versions of localtime have a bug. They cache the value of the time
1403 zone rather than looking it up every time. Since localtime() is
1404 called to bolt the undumping time into the undumped emacs, this
1405 results in localtime ignoring the TZ environment variable.
1406 This flushes the new TZ value into localtime. */
1408 #endif /* defined (LOCALTIME_CACHE) */
1410 /* Enter editor command loop. This never returns. */
1415 /* Sort the args so we can find the most important ones
1416 at the beginning of argv. */
1418 /* First, here's a table of all the standard options. */
1420 struct standard_args
1428 struct standard_args standard_args
[] =
1430 { "-version", "--version", 150, 0 },
1432 { "-nl", "--no-shared-memory", 140, 0 },
1435 { "-map", "--map-data", 130, 0 },
1437 { "-t", "--terminal", 120, 1 },
1438 { "-nw", "--no-windows", 110, 0 },
1439 { "-batch", "--batch", 100, 0 },
1440 { "-help", "--help", 90, 0 },
1441 { "-no-unibyte", "--no-unibyte", 83, 0 },
1442 { "-multibyte", "--multibyte", 82, 0 },
1443 { "-unibyte", "--unibyte", 81, 0 },
1444 { "-no-multibyte", "--no-multibyte", 80, 0 },
1446 { "-nl", "--no-loadup", 70, 0 },
1448 /* -d must come last before the options handled in startup.el. */
1449 { "-d", "--display", 60, 1 },
1450 { "-display", 0, 60, 1 },
1451 /* Now for the options handled in startup.el. */
1452 { "-q", "--no-init-file", 50, 0 },
1453 { "-no-init-file", 0, 50, 0 },
1454 { "-no-site-file", "--no-site-file", 40, 0 },
1455 { "-u", "--user", 30, 1 },
1456 { "-user", 0, 30, 1 },
1457 { "-debug-init", "--debug-init", 20, 0 },
1458 { "-i", "--icon-type", 15, 0 },
1459 { "-itype", 0, 15, 0 },
1460 { "-iconic", "--iconic", 15, 0 },
1461 { "-bg", "--background-color", 10, 1 },
1462 { "-background", 0, 10, 1 },
1463 { "-fg", "--foreground-color", 10, 1 },
1464 { "-foreground", 0, 10, 1 },
1465 { "-bd", "--border-color", 10, 1 },
1466 { "-bw", "--border-width", 10, 1 },
1467 { "-ib", "--internal-border", 10, 1 },
1468 { "-ms", "--mouse-color", 10, 1 },
1469 { "-cr", "--cursor-color", 10, 1 },
1470 { "-fn", "--font", 10, 1 },
1471 { "-font", 0, 10, 1 },
1472 { "-g", "--geometry", 10, 1 },
1473 { "-geometry", 0, 10, 1 },
1474 { "-T", "--title", 10, 1 },
1475 { "-title", 0, 10, 1 },
1476 { "-name", "--name", 10, 1 },
1477 { "-xrm", "--xrm", 10, 1 },
1478 { "-r", "--reverse-video", 5, 0 },
1480 { "-reverse", 0, 5, 0 },
1481 { "-hb", "--horizontal-scroll-bars", 5, 0 },
1482 { "-vb", "--vertical-scroll-bars", 5, 0 },
1483 /* These have the same priority as ordinary file name args,
1484 so they are not reordered with respect to those. */
1485 { "-L", "--directory", 0, 1 },
1486 { "-directory", 0, 0, 1 },
1487 { "-l", "--load", 0, 1 },
1488 { "-load", 0, 0, 1 },
1489 { "-f", "--funcall", 0, 1 },
1490 { "-funcall", 0, 0, 1 },
1491 { "-eval", "--eval", 0, 1 },
1492 { "-execute", "--execute", 0, 1 },
1493 { "-find-file", "--find-file", 0, 1 },
1494 { "-visit", "--visit", 0, 1 },
1495 { "-file", "--file", 0, 1 },
1496 { "-insert", "--insert", 0, 1 },
1497 /* This should be processed after ordinary file name args and the like. */
1498 { "-kill", "--kill", -10, 0 },
1501 /* Reorder the elements of ARGV (assumed to have ARGC elements)
1502 so that the highest priority ones come first.
1503 Do not change the order of elements of equal priority.
1504 If an option takes an argument, keep it and its argument together.
1506 If an option that takes no argument appears more
1507 than once, eliminate all but one copy of it. */
1510 sort_args (argc
, argv
)
1514 char **new = (char **) xmalloc (sizeof (char *) * argc
);
1515 /* For each element of argv,
1516 the corresponding element of options is:
1517 0 for an option that takes no arguments,
1518 1 for an option that takes one argument, etc.
1519 -1 for an ordinary non-option argument. */
1520 int *options
= (int *) xmalloc (sizeof (int) * argc
);
1521 int *priority
= (int *) xmalloc (sizeof (int) * argc
);
1523 int incoming_used
= 1;
1527 /* Categorize all the options,
1528 and figure out which argv elts are option arguments. */
1529 for (from
= 1; from
< argc
; from
++)
1533 if (argv
[from
][0] == '-')
1538 /* If we have found "--", don't consider
1539 any more arguments as options. */
1540 if (argv
[from
][1] == '-' && argv
[from
][2] == 0)
1542 /* Leave the "--", and everything following it, at the end. */
1543 for (; from
< argc
; from
++)
1545 priority
[from
] = -100;
1551 /* Look for a match with a known old-fashioned option. */
1552 for (i
= 0; i
< sizeof (standard_args
) / sizeof (standard_args
[0]); i
++)
1553 if (!strcmp (argv
[from
], standard_args
[i
].name
))
1555 options
[from
] = standard_args
[i
].nargs
;
1556 priority
[from
] = standard_args
[i
].priority
;
1557 if (from
+ standard_args
[i
].nargs
>= argc
)
1558 fatal ("Option `%s' requires an argument\n", argv
[from
]);
1559 from
+= standard_args
[i
].nargs
;
1563 /* Look for a match with a known long option.
1564 MATCH is -1 if no match so far, -2 if two or more matches so far,
1565 >= 0 (the table index of the match) if just one match so far. */
1566 if (argv
[from
][1] == '-')
1569 thislen
= strlen (argv
[from
]);
1570 equals
= index (argv
[from
], '=');
1572 thislen
= equals
- argv
[from
];
1575 i
< sizeof (standard_args
) / sizeof (standard_args
[0]); i
++)
1576 if (standard_args
[i
].longname
1577 && !strncmp (argv
[from
], standard_args
[i
].longname
,
1586 /* If we found exactly one match, use that. */
1589 options
[from
] = standard_args
[match
].nargs
;
1590 priority
[from
] = standard_args
[match
].priority
;
1591 /* If --OPTION=VALUE syntax is used,
1592 this option uses just one argv element. */
1595 if (from
+ options
[from
] >= argc
)
1596 fatal ("Option `%s' requires an argument\n", argv
[from
]);
1597 from
+= options
[from
];
1604 /* Copy the arguments, in order of decreasing priority, to NEW. */
1606 while (incoming_used
< argc
)
1609 int best_priority
= -9999;
1611 /* Find the highest priority remaining option.
1612 If several have equal priority, take the first of them. */
1613 for (from
= 1; from
< argc
; from
++)
1615 if (argv
[from
] != 0 && priority
[from
] > best_priority
)
1617 best_priority
= priority
[from
];
1620 /* Skip option arguments--they are tied to the options. */
1621 if (options
[from
] > 0)
1622 from
+= options
[from
];
1628 /* Copy the highest priority remaining option, with its args, to NEW.
1629 Unless it is a duplicate of the previous one. */
1630 if (! (options
[best
] == 0
1631 && ! strcmp (new[to
- 1], argv
[best
])))
1633 new[to
++] = argv
[best
];
1634 for (i
= 0; i
< options
[best
]; i
++)
1635 new[to
++] = argv
[best
+ i
+ 1];
1638 incoming_used
+= 1 + (options
[best
] > 0 ? options
[best
] : 0);
1640 /* Clear out this option in ARGV. */
1642 for (i
= 0; i
< options
[best
]; i
++)
1643 argv
[best
+ i
+ 1] = 0;
1646 /* If duplicate options were deleted, fill up extra space with null ptrs. */
1650 bcopy (new, argv
, sizeof (char *) * argc
);
1657 DEFUN ("kill-emacs", Fkill_emacs
, Skill_emacs
, 0, 1, "P",
1658 "Exit the Emacs job and kill it.\n\
1659 If ARG is an integer, return ARG as the exit program code.\n\
1660 If ARG is a string, stuff it as keyboard input.\n\n\
1661 The value of `kill-emacs-hook', if not void,\n\
1662 is a list of functions (of no args),\n\
1663 all of which are called before Emacs is actually killed.")
1667 struct gcpro gcpro1
;
1674 if (!NILP (Vrun_hooks
) && !noninteractive
)
1675 call1 (Vrun_hooks
, intern ("kill-emacs-hook"));
1679 /* Is it really necessary to do this deassign
1680 when we are going to exit anyway? */
1685 shut_down_emacs (0, 0, STRINGP (arg
) ? arg
: Qnil
);
1687 /* If we have an auto-save list file,
1688 kill it because we are exiting Emacs deliberately (not crashing).
1689 Do it after shut_down_emacs, which does an auto-save. */
1690 if (STRINGP (Vauto_save_list_file_name
))
1691 unlink (XSTRING (Vauto_save_list_file_name
)->data
);
1693 exit (INTEGERP (arg
) ? XINT (arg
)
1704 /* Perform an orderly shutdown of Emacs. Autosave any modified
1705 buffers, kill any child processes, clean up the terminal modes (if
1706 we're in the foreground), and other stuff like that. Don't perform
1707 any redisplay; this may be called when Emacs is shutting down in
1708 the background, or after its X connection has died.
1710 If SIG is a signal number, print a message for it.
1712 This is called by fatal signal handlers, X protocol error handlers,
1716 shut_down_emacs (sig
, no_x
, stuff
)
1720 /* Prevent running of hooks from now on. */
1723 /* If we are controlling the terminal, reset terminal modes */
1724 #ifdef EMACS_HAVE_TTY_PGRP
1726 int pgrp
= EMACS_GETPGRP (0);
1729 if (EMACS_GET_TTY_PGRP (0, &tpgrp
) != -1
1734 if (sig
&& sig
!= SIGTERM
)
1735 fprintf (stderr
, "Fatal error (%d).", sig
);
1743 stuff_buffered_input (stuff
);
1745 kill_buffer_processes (Qnil
);
1746 Fdo_auto_save (Qt
, Qnil
);
1748 #ifdef CLASH_DETECTION
1749 unlock_all_files ();
1753 kill_vms_processes ();
1756 #if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
1757 #ifdef HAVE_X_WINDOWS
1758 /* It's not safe to call intern here. Maybe we are crashing. */
1759 if (!noninteractive
&& SYMBOLP (Vwindow_system
)
1760 && XSYMBOL (Vwindow_system
)->name
->size
== 1
1761 && XSYMBOL (Vwindow_system
)->name
->data
[0] == 'x'
1763 Fx_close_current_connection ();
1764 #endif /* HAVE_X_WINDOWS */
1768 /* There is a tendency for a SIGIO signal to arrive within exit,
1769 and cause a SIGHUP because the input descriptor is already closed. */
1771 signal (SIGIO
, SIG_IGN
);
1778 check_glyph_memory ();
1779 check_message_stack ();
1792 DEFUN ("dump-emacs-data", Fdump_emacs_data
, Sdump_emacs_data
, 1, 1, 0,
1793 "Dump current state of Emacs into data file FILENAME.\n\
1794 This function exists on systems that use HAVE_SHM.")
1796 Lisp_Object filename
;
1798 extern char my_edata
[];
1801 CHECK_STRING (filename
, 0);
1802 filename
= Fexpand_file_name (filename
, Qnil
);
1805 Vpurify_flag
= Qnil
;
1808 /* Tell malloc where start of impure now is */
1809 /* Also arrange for warnings when nearly out of space. */
1810 #ifndef SYSTEM_MALLOC
1811 memory_warnings (my_edata
, malloc_warning
);
1813 map_out_data (XSTRING (filename
)->data
);
1820 #else /* not HAVE_SHM */
1822 DEFUN ("dump-emacs", Fdump_emacs
, Sdump_emacs
, 2, 2, 0,
1823 "Dump current state of Emacs into executable file FILENAME.\n\
1824 Take symbols from SYMFILE (presumably the file you executed to run Emacs).\n\
1825 This is used in the file `loadup.el' when building Emacs.\n\
1827 You must run Emacs in batch mode in order to dump it.")
1829 Lisp_Object filename
, symfile
;
1831 extern char my_edata
[];
1834 int count
= specpdl_ptr
- specpdl
;
1836 if (! noninteractive
)
1837 error ("Dumping Emacs works only in batch mode");
1839 /* Bind `command-line-processed' to nil before dumping,
1840 so that the dumped Emacs will process its command line
1841 and set up to work with X windows if appropriate. */
1842 symbol
= intern ("command-line-process");
1843 specbind (symbol
, Qnil
);
1845 CHECK_STRING (filename
, 0);
1846 filename
= Fexpand_file_name (filename
, Qnil
);
1847 if (!NILP (symfile
))
1849 CHECK_STRING (symfile
, 0);
1850 if (XSTRING (symfile
)->size
)
1851 symfile
= Fexpand_file_name (symfile
, Qnil
);
1855 Vpurify_flag
= Qnil
;
1858 set_time_zone_rule (dump_tz
);
1859 #ifndef LOCALTIME_CACHE
1860 /* Force a tz reload, since set_time_zone_rule doesn't. */
1867 mapout_data (XSTRING (filename
)->data
);
1869 /* Tell malloc where start of impure now is */
1870 /* Also arrange for warnings when nearly out of space. */
1871 #ifndef SYSTEM_MALLOC
1873 /* On Windows, this was done before dumping, and that once suffices.
1874 Meanwhile, my_edata is not valid on Windows. */
1875 memory_warnings (my_edata
, malloc_warning
);
1876 #endif /* not WINDOWSNT */
1878 #ifdef DOUG_LEA_MALLOC
1879 malloc_state_ptr
= malloc_get_state ();
1881 unexec (XSTRING (filename
)->data
,
1882 !NILP (symfile
) ? XSTRING (symfile
)->data
: 0, my_edata
, 0, 0);
1883 #ifdef DOUG_LEA_MALLOC
1884 free (malloc_state_ptr
);
1886 #endif /* not VMS */
1890 return unbind_to (count
, Qnil
);
1893 #endif /* not HAVE_SHM */
1895 #endif /* not CANNOT_DUMP */
1898 /* Recover from setlocale (LC_ALL, ""). */
1904 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
1905 so that numbers are read and printed properly for Emacs Lisp. */
1906 setlocale (LC_NUMERIC
, "C");
1909 l
= setlocale (LC_MESSAGES
, (char *) 0);
1910 Vprevious_system_messages_locale
= l
? build_string (l
) : Qnil
;
1912 l
= setlocale (LC_TIME
, (char *) 0);
1913 Vprevious_system_time_locale
= l
? build_string (l
) : Qnil
;
1917 synchronize_locale (category
, plocale
, desired_locale
)
1919 Lisp_Object
*plocale
;
1920 Lisp_Object desired_locale
;
1922 if (STRINGP (desired_locale
)
1923 && (NILP (*plocale
) || NILP (Fstring_equal (*plocale
, desired_locale
)))
1924 && setlocale (category
, XSTRING (desired_locale
)->data
))
1925 *plocale
= desired_locale
;
1928 /* Set system time locale to match Vsystem_time_locale, if possible. */
1930 synchronize_system_time_locale ()
1932 synchronize_locale (LC_TIME
, &Vprevious_system_time_locale
,
1933 Vsystem_time_locale
);
1936 /* Set system messages locale to match Vsystem_messages_locale, if
1939 synchronize_system_messages_locale ()
1942 synchronize_locale (LC_MESSAGES
, &Vprevious_system_messages_locale
,
1943 Vsystem_messages_locale
);
1946 #endif /* HAVE_SETLOCALE */
1953 decode_env_path (evarname
, defalt
)
1954 char *evarname
, *defalt
;
1956 register char *path
, *p
;
1957 Lisp_Object lpath
, element
, tem
;
1959 /* It's okay to use getenv here, because this function is only used
1960 to initialize variables when Emacs starts up, and isn't called
1963 path
= (char *) getenv (evarname
);
1969 /* Ensure values from the environment use the proper directory separator. */
1972 p
= alloca (strlen (path
) + 1);
1976 if ('/' == DIRECTORY_SEP
)
1977 dostounix_filename (path
);
1979 unixtodos_filename (path
);
1985 p
= index (path
, SEPCHAR
);
1986 if (!p
) p
= path
+ strlen (path
);
1987 element
= (p
- path
? make_string (path
, p
- path
)
1988 : build_string ("."));
1990 /* Add /: to the front of the name
1991 if it would otherwise be treated as magic. */
1992 tem
= Ffind_file_name_handler (element
, Qt
);
1994 element
= concat2 (build_string ("/:"), element
);
1996 lpath
= Fcons (element
, lpath
);
2002 return Fnreverse (lpath
);
2008 Qfile_name_handler_alist
= intern ("file-name-handler-alist");
2009 staticpro (&Qfile_name_handler_alist
);
2013 defsubr (&Sdump_emacs_data
);
2015 defsubr (&Sdump_emacs
);
2019 defsubr (&Skill_emacs
);
2021 defsubr (&Sinvocation_name
);
2022 defsubr (&Sinvocation_directory
);
2024 DEFVAR_LISP ("command-line-args", &Vcommand_line_args
,
2025 "Args passed by shell to Emacs, as a list of strings.");
2027 DEFVAR_LISP ("system-type", &Vsystem_type
,
2028 "Value is symbol indicating type of operating system you are using.");
2029 Vsystem_type
= intern (SYSTEM_TYPE
);
2031 DEFVAR_LISP ("system-configuration", &Vsystem_configuration
,
2032 "Value is string indicating configuration Emacs was built for.");
2033 Vsystem_configuration
= build_string (EMACS_CONFIGURATION
);
2035 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options
,
2036 "String containing the configuration options Emacs was built with.");
2037 Vsystem_configuration_options
= build_string (EMACS_CONFIG_OPTIONS
);
2039 DEFVAR_BOOL ("noninteractive", &noninteractive1
,
2040 "Non-nil means Emacs is running without interactive terminal.");
2042 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook
,
2043 "Hook to be run whenever kill-emacs is called.\n\
2044 Since kill-emacs may be invoked when the terminal is disconnected (or\n\
2045 in other similar situations), functions placed on this hook should not\n\
2046 expect to be able to interact with the user. To ask for confirmation,\n\
2047 see `kill-emacs-query-functions' instead.");
2048 Vkill_emacs_hook
= Qnil
;
2051 DEFVAR_LISP ("signal-USR1-hook", &Vsignal_USR1_hook
,
2052 "Hook to be run whenever emacs receives a USR1 signal");
2053 Vsignal_USR1_hook
= Qnil
;
2055 DEFVAR_LISP ("signal-USR2-hook", &Vsignal_USR2_hook
,
2056 "Hook to be run whenever emacs receives a USR2 signal");
2057 Vsignal_USR2_hook
= Qnil
;
2062 DEFVAR_INT ("emacs-priority", &emacs_priority
,
2063 "Priority for Emacs to run at.\n\
2064 This value is effective only if set before Emacs is dumped,\n\
2065 and only if the Emacs executable is installed with setuid to permit\n\
2066 it to change priority. (Emacs sets its uid back to the real uid.)\n\
2067 Currently, you need to define SET_EMACS_PRIORITY in `config.h'\n\
2068 before you compile Emacs, to enable the code for this feature.");
2071 DEFVAR_LISP ("path-separator", &Vpath_separator
,
2072 "The directory separator in search paths, as a string.");
2075 Vpath_separator
= make_string (&c
, 1);
2078 DEFVAR_LISP ("invocation-name", &Vinvocation_name
,
2079 "The program name that was used to run Emacs.\n\
2080 Any directory names are omitted.");
2082 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory
,
2083 "The directory in which the Emacs executable was found, to run it.\n\
2084 The value is nil if that directory's name is not known.");
2086 DEFVAR_LISP ("installation-directory", &Vinstallation_directory
,
2087 "A directory within which to look for the `lib-src' and `etc' directories.\n\
2088 This is non-nil when we can't find those directories in their standard\n\
2089 installed locations, but we can find them\n\
2090 near where the Emacs executable was found.");
2091 Vinstallation_directory
= Qnil
;
2093 DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale
,
2094 "System locale for messages.");
2095 Vsystem_messages_locale
= Qnil
;
2097 DEFVAR_LISP ("previous-system-messages-locale",
2098 &Vprevious_system_messages_locale
,
2099 "Most recently used system locale for messages.");
2100 Vprevious_system_messages_locale
= Qnil
;
2102 DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale
,
2103 "System locale for time.");
2104 Vsystem_time_locale
= Qnil
;
2106 DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale
,
2107 "Most recently used system locale for time.");
2108 Vprevious_system_time_locale
= Qnil
;