1 /* Fully extensible Emacs, running on Unix, intended for GNU.
2 Copyright (C) 1985,86,87,93,94,95,97,98,1999,2001,2002
3 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
28 #include <sys/types.h>
40 #include <sys/ioctl.h>
45 #include "intervals.h"
49 #include "blockinput.h"
50 #include "syssignal.h"
52 #include "termhooks.h"
62 #include <sys/resource.h>
70 #if !defined (USG) || defined (BSD_PGRPS)
72 #define setpgrp setpgid
76 extern void malloc_warning
P_ ((char *));
77 extern void set_time_zone_rule
P_ ((char *));
79 extern char *index
P_ ((const char *, int));
82 /* Make these values available in GDB, which doesn't see macros. */
84 EMACS_INT gdb_valbits
= VALBITS
;
85 EMACS_INT gdb_gctypebits
= GCTYPEBITS
;
86 EMACS_INT gdb_emacs_intbits
= sizeof (EMACS_INT
) * BITS_PER_CHAR
;
88 EMACS_INT gdb_data_seg_bits
= DATA_SEG_BITS
;
90 EMACS_INT gdb_data_seg_bits
= 0;
92 EMACS_INT PVEC_FLAG
= PSEUDOVECTOR_FLAG
;
94 /* Command line args from shell, as list of strings. */
95 Lisp_Object Vcommand_line_args
;
97 /* The name under which Emacs was invoked, with any leading directory
99 Lisp_Object Vinvocation_name
;
101 /* The directory name from which Emacs was invoked. */
102 Lisp_Object Vinvocation_directory
;
104 /* The directory name in which to find subdirs such as lisp and etc.
105 nil means get them only from PATH_LOADSEARCH. */
106 Lisp_Object Vinstallation_directory
;
108 /* Hook run by `kill-emacs' before it does really anything. */
109 Lisp_Object Vkill_emacs_hook
;
111 /* An empty lisp string. To avoid having to build any other. */
112 Lisp_Object empty_string
;
115 /* Hooks for signal USR1 and USR2 handling. */
116 Lisp_Object Vsignal_USR1_hook
;
118 Lisp_Object Vsignal_USR2_hook
;
122 /* Search path separator. */
123 Lisp_Object Vpath_separator
;
125 /* Set nonzero after Emacs has started up the first time.
126 Prevents reinitialization of the Lisp world and keymaps
127 on subsequent starts. */
130 #ifdef DOUG_LEA_MALLOC
131 /* Preserves a pointer to the memory allocated that copies that
132 static data inside glibc's malloc. */
133 void *malloc_state_ptr
;
134 /* From glibc, a routine that returns a copy of the malloc internal state. */
135 extern void *malloc_get_state ();
136 /* From glibc, a routine that overwrites the malloc internal state. */
137 extern void malloc_set_state ();
138 /* Non-zero if the MALLOC_CHECK_ enviroment variable was set while
139 dumping. Used to work around a bug in glibc's malloc. */
140 int malloc_using_checking
;
143 /* Variable whose value is symbol giving operating system type. */
144 Lisp_Object Vsystem_type
;
146 /* Variable whose value is string giving configuration built for. */
147 Lisp_Object Vsystem_configuration
;
149 /* Variable whose value is string giving configuration options,
150 for use when reporting bugs. */
151 Lisp_Object Vsystem_configuration_options
;
153 Lisp_Object Qfile_name_handler_alist
;
155 /* Current and previous system locales for messages and time. */
156 Lisp_Object Vsystem_messages_locale
;
157 Lisp_Object Vprevious_system_messages_locale
;
158 Lisp_Object Vsystem_time_locale
;
159 Lisp_Object Vprevious_system_time_locale
;
161 /* If non-zero, emacs should not attempt to use a window-specific code,
162 but instead should use the virtual terminal under which it was started. */
163 int inhibit_window_system
;
165 /* If nonzero, set Emacs to run at this priority. This is also used
166 in child_setup and sys_suspend to make sure subshells run at normal
167 priority; those functions have their own extern declaration. */
168 EMACS_INT emacs_priority
;
170 /* If non-zero, a filter or a sentinel is running. Tested to save the match
171 data on the first attempt to change it inside asynchronous code. */
172 int running_asynch_code
;
176 extern int inherited_pgroup
;
179 #ifdef HAVE_X_WINDOWS
180 /* If non-zero, -d was specified, meaning we're using some window system. */
184 /* An address near the bottom of the stack.
185 Tells GC how to save a copy of the stack. */
188 #ifdef HAVE_WINDOW_SYSTEM
189 extern Lisp_Object Vwindow_system
;
190 #endif /* HAVE_WINDOW_SYSTEM */
192 extern Lisp_Object Vauto_save_list_file_name
;
194 #ifdef USG_SHARED_LIBRARIES
195 /* If nonzero, this is the place to put the end of the writable segment
198 unsigned int bss_end
= 0;
201 /* Nonzero means running Emacs without interactive terminal. */
205 /* Value of Lisp variable `noninteractive'.
206 Normally same as C variable `noninteractive'
207 but nothing terrible happens if user sets this one. */
211 /* Save argv and argc. */
215 static void sort_args ();
216 void syms_of_emacs ();
219 Usage: %s [OPTION-OR-FILENAME]...\n\
221 Run Emacs, the extensible, customizable, self-documenting real-time\n\
222 display editor. The recommended way to start Emacs for normal editing\n\
223 is with no options at all.\n\
225 Run M-x info RET m emacs RET m command arguments RET inside Emacs to\n\
226 read the main documentation for these command-line arguments.\n\
228 Initialization options:\n\
230 --batch do not do interactive display; implies -q\n\
231 --script FILE run FILE as an Emacs Lisp script.\n\
232 --debug-init enable Emacs Lisp debugger during init file\n\
233 --help display this help message and exit\n\
234 --multibyte, --no-unibyte run Emacs in multibyte mode\n\
235 --no-init-file, -q load neither ~/.emacs nor default.el\n\
236 --no-shared-memory, -nl do not use shared memory\n\
237 --no-site-file do not load site-start.el\n\
238 --no-splash do not display a splash screen on startup\n\
239 --no-window-system, -nw don't communicate with X, ignoring $DISPLAY\n\
240 --terminal, -t DEVICE use DEVICE for terminal I/O\n\
241 --unibyte, --no-multibyte run Emacs in unibyte mode\n\
242 --user, -u USER load ~USER/.emacs instead of your own\n\
243 --version display version information and exit\n\
247 FILE visit FILE using find-file\n\
248 +LINE FILE visit FILE using find-file, then go to line LINE\n\
249 +LINE:COLUMN FILE visit FILE using find-file, then go to line LINE,\n\
251 --directory, -L DIR add DIR to variable load-path\n\
252 --eval EXPR evaluate Emacs Lisp expression EXPR\n\
253 --execute EXPR evaluate Emacs Lisp expression EXPR\n\
254 --find-file FILE visit FILE\n\
255 --funcall, -f FUNC call Emacs function FUNC with no arguments\n\
256 --insert FILE insert contents of FILE into current buffer\n\
257 --kill exit without asking for confirmation\n\
258 --load, -l FILE load FILE of Emacs Lisp code using the load function\n\
259 --visit FILE visit FILE\n\
265 --background-color, -bg COLOR window background color\n\
266 --border-color, -bd COLOR main border color\n\
267 --border-width, -bw WIDTH width of main border\n\
268 --color=MODE color mode for character terminals;\n\
269 MODE defaults to `auto', and can also\n\
270 be `never', `auto', `always',\n\
271 or a mode name like `ansi8'\n\
272 --cursor-color, -cr COLOR color of the Emacs cursor indicating point\n\
273 --display, -d DISPLAY use X server DISPLAY\n\
274 --font, -fn FONT default font; must be fixed-width\n\
275 --foreground-color, -fg COLOR window foreground color\n\
276 --fullscreen, -fs make first frame fullscreen\n\
277 --fullwidth, -fw make the first frame wide as the screen\n\
278 --fullheight, -fh make the first frame high as the screen\n\
279 --geometry, -g GEOMETRY window geometry\n\
280 --iconic start Emacs in iconified state\n\
281 --icon-type, -i use picture of gnu for Emacs icon\n\
282 --internal-border, -ib WIDTH width between text and main border\n\
283 --line-spacing, -lsp PIXELS additional space to put between lines\n\
284 --mouse-color, -ms COLOR mouse cursor color in Emacs window\n\
285 --name NAME title of main Emacs window\n\
286 --reverse-video, -r, -rv switch foreground and background\n\
287 --title, -T, -wn TITLE title for Emacs windows\n\
288 --vertical-scroll-bars, -vb enable vertical scroll bars\n\
289 --xrm XRESOURCES set additional X resources\n\
291 You can generally also specify long option names with a single -; for\n\
292 example, -batch as well as --batch. You can use any unambiguous\n\
293 abbreviation for a --option.\n\
295 Various environment variables and window system resources also affect\n\
296 Emacs' operation. See the main documentation.\n\
300 Report bugs to %s. First, please see the Bugs\n\
301 section of the Emacs manual or the file BUGS.\n"
304 /* Signal code for the fatal signal that was received. */
305 int fatal_error_code
;
307 /* Nonzero if handling a fatal error already. */
308 int fatal_error_in_progress
;
310 /* If non-null, call this function from fatal_error_signal before
311 committing suicide. */
313 void (*fatal_error_signal_hook
) P_ ((void));
318 handle_USR1_signal (sig
)
321 struct input_event buf
;
323 bzero (&buf
, sizeof buf
);
324 buf
.kind
= USER_SIGNAL_EVENT
;
325 buf
.frame_or_window
= selected_frame
;
327 kbd_buffer_store_event (&buf
);
333 handle_USR2_signal (sig
)
336 struct input_event buf
;
338 bzero (&buf
, sizeof buf
);
339 buf
.kind
= USER_SIGNAL_EVENT
;
341 buf
.frame_or_window
= selected_frame
;
343 kbd_buffer_store_event (&buf
);
347 /* Handle bus errors, invalid instruction, etc. */
349 fatal_error_signal (sig
)
352 fatal_error_code
= sig
;
353 signal (sig
, SIG_DFL
);
355 TOTALLY_UNBLOCK_INPUT
;
357 /* If fatal error occurs in code below, avoid infinite recursion. */
358 if (! fatal_error_in_progress
)
360 fatal_error_in_progress
= 1;
362 shut_down_emacs (sig
, 0, Qnil
);
366 LIB$
STOP (SS$_ABORT
);
368 /* Signal the same code; this time it will really be fatal.
369 Remember that since we're in a signal handler, the signal we're
370 going to send is probably blocked, so we have to unblock it if we
371 want to really receive it. */
373 sigunblock (sigmask (fatal_error_code
));
376 if (fatal_error_signal_hook
)
377 fatal_error_signal_hook ();
379 kill (getpid (), fatal_error_code
);
385 /* Handler for SIGDANGER. */
387 memory_warning_signal (sig
)
390 signal (sig
, memory_warning_signal
);
392 malloc_warning ("Operating system warns that virtual memory is running low.\n");
394 /* It might be unsafe to call do_auto_save now. */
395 force_auto_save_soon ();
399 /* We define abort, rather than using it from the library,
400 so that GDB can return from a breakpoint here.
401 MSDOS has its own definition in msdos.c. */
403 #if ! defined (DOS_NT) && ! defined (NO_ABORT)
405 #ifndef ABORT_RETURN_TYPE
406 #define ABORT_RETURN_TYPE void
412 kill (getpid (), SIGABRT
);
413 /* This shouldn't be executed, but it prevents a warning. */
419 /* Code for dealing with Lisp access to the Unix command line. */
422 init_cmdargs (argc
, argv
, skip_args
)
428 Lisp_Object name
, dir
, tem
;
429 int count
= SPECPDL_INDEX ();
430 Lisp_Object raw_name
;
435 raw_name
= build_string (argv
[0]);
437 /* Add /: to the front of the name
438 if it would otherwise be treated as magic. */
439 tem
= Ffind_file_name_handler (raw_name
, Qt
);
441 raw_name
= concat2 (build_string ("/:"), raw_name
);
443 Vinvocation_name
= Ffile_name_nondirectory (raw_name
);
444 Vinvocation_directory
= Ffile_name_directory (raw_name
);
446 /* If we got no directory in argv[0], search PATH to find where
447 Emacs actually came from. */
448 if (NILP (Vinvocation_directory
))
451 int yes
= openp (Vexec_path
, Vinvocation_name
,
452 Vexec_suffixes
, &found
, make_number (X_OK
));
455 /* Add /: to the front of the name
456 if it would otherwise be treated as magic. */
457 tem
= Ffind_file_name_handler (found
, Qt
);
459 found
= concat2 (build_string ("/:"), found
);
460 Vinvocation_directory
= Ffile_name_directory (found
);
464 if (!NILP (Vinvocation_directory
)
465 && NILP (Ffile_name_absolute_p (Vinvocation_directory
)))
466 /* Emacs was started with relative path, like ./emacs.
468 Vinvocation_directory
= Fexpand_file_name (Vinvocation_directory
, Qnil
);
470 Vinstallation_directory
= Qnil
;
472 if (!NILP (Vinvocation_directory
))
474 dir
= Vinvocation_directory
;
475 name
= Fexpand_file_name (Vinvocation_name
, dir
);
478 Lisp_Object tem
, lib_src_exists
;
479 Lisp_Object etc_exists
, info_exists
;
481 /* See if dir contains subdirs for use by Emacs.
482 Check for the ones that would exist in a build directory,
483 not including lisp and info. */
484 tem
= Fexpand_file_name (build_string ("lib-src"), dir
);
485 lib_src_exists
= Ffile_exists_p (tem
);
488 /* MSDOS installations frequently remove lib-src, but we still
489 must set installation-directory, or else info won't find
490 its files (it uses the value of installation-directory). */
491 tem
= Fexpand_file_name (build_string ("info"), dir
);
492 info_exists
= Ffile_exists_p (tem
);
497 if (!NILP (lib_src_exists
) || !NILP (info_exists
))
499 tem
= Fexpand_file_name (build_string ("etc"), dir
);
500 etc_exists
= Ffile_exists_p (tem
);
501 if (!NILP (etc_exists
))
503 Vinstallation_directory
504 = Ffile_name_as_directory (dir
);
509 /* See if dir's parent contains those subdirs. */
510 tem
= Fexpand_file_name (build_string ("../lib-src"), dir
);
511 lib_src_exists
= Ffile_exists_p (tem
);
515 /* See the MSDOS commentary above. */
516 tem
= Fexpand_file_name (build_string ("../info"), dir
);
517 info_exists
= Ffile_exists_p (tem
);
522 if (!NILP (lib_src_exists
) || !NILP (info_exists
))
524 tem
= Fexpand_file_name (build_string ("../etc"), dir
);
525 etc_exists
= Ffile_exists_p (tem
);
526 if (!NILP (etc_exists
))
528 tem
= Fexpand_file_name (build_string (".."), dir
);
529 Vinstallation_directory
530 = Ffile_name_as_directory (tem
);
535 /* If the Emacs executable is actually a link,
536 next try the dir that the link points into. */
537 tem
= Ffile_symlink_p (name
);
540 name
= Fexpand_file_name (tem
, dir
);
541 dir
= Ffile_name_directory (name
);
548 Vcommand_line_args
= Qnil
;
550 for (i
= argc
- 1; i
>= 0; i
--)
552 if (i
== 0 || i
> skip_args
)
554 = Fcons (build_string (argv
[i
]), Vcommand_line_args
);
557 unbind_to (count
, Qnil
);
560 DEFUN ("invocation-name", Finvocation_name
, Sinvocation_name
, 0, 0, 0,
561 doc
: /* Return the program name that was used to run Emacs.
562 Any directory names are omitted. */)
565 return Fcopy_sequence (Vinvocation_name
);
568 DEFUN ("invocation-directory", Finvocation_directory
, Sinvocation_directory
,
570 doc
: /* Return the directory name in which the Emacs executable was located. */)
573 return Fcopy_sequence (Vinvocation_directory
);
578 #ifdef LINK_CRTL_SHARE
579 #ifdef SHARABLE_LIB_BUG
580 extern noshare
char **environ
;
581 #endif /* SHARABLE_LIB_BUG */
582 #endif /* LINK_CRTL_SHARE */
586 /* A valid but unlikely value for the TZ environment value.
587 It is OK (though a bit slower) if the user actually chooses this value. */
588 static char dump_tz
[] = "UtC0";
591 #ifndef ORDINARY_LINK
592 /* We don't include crtbegin.o and crtend.o in the link,
593 so these functions and variables might be missed.
594 Provide dummy definitions to avoid error.
595 (We don't have any real constructors or destructors.) */
597 #ifndef GCC_CTORS_IN_LIBC
598 void __do_global_ctors ()
600 void __do_global_ctors_aux ()
602 void __do_global_dtors ()
604 /* Linux has a bug in its library; avoid an error. */
606 char * __CTOR_LIST__
[2] = { (char *) (-1), 0 };
608 char * __DTOR_LIST__
[2] = { (char *) (-1), 0 };
609 #endif /* GCC_CTORS_IN_LIBC */
612 #endif /* __GNUC__ */
613 #endif /* ORDINARY_LINK */
615 /* Test whether the next argument in ARGV matches SSTR or a prefix of
616 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
617 (the argument is supposed to have a value) store in *VALPTR either
618 the next argument or the portion of this one after the equal sign.
619 ARGV is read starting at position *SKIPPTR; this index is advanced
620 by the number of arguments used.
622 Too bad we can't just use getopt for all of this, but we don't have
623 enough information to do it right. */
626 argmatch (argv
, argc
, sstr
, lstr
, minlen
, valptr
, skipptr
)
639 /* Don't access argv[argc]; give up in advance. */
640 if (argc
<= *skipptr
+ 1)
643 arg
= argv
[*skipptr
+1];
646 if (strcmp (arg
, sstr
) == 0)
650 *valptr
= argv
[*skipptr
+2];
657 arglen
= (valptr
!= NULL
&& (p
= index (arg
, '=')) != NULL
658 ? p
- arg
: strlen (arg
));
659 if (lstr
== 0 || arglen
< minlen
|| strncmp (arg
, lstr
, arglen
) != 0)
661 else if (valptr
== NULL
)
672 else if (argv
[*skipptr
+2] != NULL
)
674 *valptr
= argv
[*skipptr
+2];
684 #ifdef DOUG_LEA_MALLOC
686 /* malloc can be invoked even before main (e.g. by the dynamic
687 linker), so the dumped malloc state must be restored as early as
688 possible using this special hook. */
691 malloc_initialize_hook ()
694 extern char **environ
;
699 if (!malloc_using_checking
)
700 /* Work around a bug in glibc's malloc. MALLOC_CHECK_ must be
701 ignored if the heap to be restored was constructed without
702 malloc checking. Can't use unsetenv, since that calls malloc. */
706 for (p
= environ
; p
&& *p
; p
++)
707 if (strncmp (*p
, "MALLOC_CHECK_=", 14) == 0)
716 malloc_set_state (malloc_state_ptr
);
717 free (malloc_state_ptr
);
720 malloc_using_checking
= getenv ("MALLOC_CHECK_") != NULL
;
723 void (*__malloc_initialize_hook
) () = malloc_initialize_hook
;
725 #endif /* DOUG_LEA_MALLOC */
728 #define REPORT_EMACS_BUG_ADDRESS "bug-gnu-emacs@gnu.org"
729 #define REPORT_EMACS_BUG_PRETEST_ADDRESS "emacs-pretest-bug@gnu.org"
731 /* This function is used to determine an address to which bug report should
735 bug_reporting_address ()
741 temp
= Fsymbol_value (intern ("emacs-version"));
743 /* When `emacs-version' is invalid, use normal address. */
745 return REPORT_EMACS_BUG_ADDRESS
;
747 string
= SDATA (temp
);
749 /* Count dots in `emacs-version'. */
757 /* When `emacs-version' has at least three dots, it is development or
758 pretest version of Emacs. */
759 return count
>= 3 ? REPORT_EMACS_BUG_PRETEST_ADDRESS
: REPORT_EMACS_BUG_ADDRESS
;
765 main (argc
, argv
, envp
)
773 char stack_bottom_variable
;
774 int do_initial_setlocale
;
779 #ifdef HAVE_SETRLIMIT
786 extern Lisp_Object
*stack_base
;
790 #ifdef LINUX_SBRK_BUG
794 #ifdef RUN_TIME_REMAP
796 run_time_remap (argv
[0]);
801 unexec_init_emacs_zone ();
804 sort_args (argc
, argv
);
806 while (argv
[argc
]) argc
++;
808 if (argmatch (argv
, argc
, "-version", "--version", 3, NULL
, &skip_args
)
809 /* We don't know the version number unless this is a dumped Emacs.
810 So ignore --version otherwise. */
814 tem
= Fsymbol_value (intern ("emacs-version"));
817 fprintf (stderr
, "Invalid value of `emacs-version'\n");
822 printf ("GNU Emacs %s\n", SDATA (tem
));
823 printf ("Copyright (C) 2002 Free Software Foundation, Inc.\n");
824 printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
825 printf ("You may redistribute copies of Emacs\n");
826 printf ("under the terms of the GNU General Public License.\n");
827 printf ("For more information about these matters, ");
828 printf ("see the file named COPYING.\n");
833 /* Map in shared memory, if we are using that. */
835 if (argmatch (argv
, argc
, "-nl", "--no-shared-memory", 6, NULL
, &skip_args
))
838 /* The shared memory was just restored, which clobbered this. */
844 /* The shared memory was just restored, which clobbered this. */
851 extern int malloc_cookie
;
852 /* This helps out unexnext.c. */
854 if (malloc_jumpstart (malloc_cookie
) != 0)
855 printf ("malloc jumpstart failed!\n");
860 /* Skip process serial number passed in the form -psn_x_y as
861 command-line argument. */
862 if (argc
> skip_args
+ 1 && strncmp (argv
[skip_args
+1], "-psn_", 5) == 0)
867 /* If -map specified, map the data file in. */
870 if (argmatch (argv
, argc
, "-map", "--map-data", 3, &mapin_file
, &skip_args
))
874 #ifdef LINK_CRTL_SHARE
875 #ifdef SHARABLE_LIB_BUG
876 /* Bletcherous shared libraries! */
878 stdin
= fdopen (0, "r");
880 stdout
= fdopen (1, "w");
882 stderr
= fdopen (2, "w");
885 #endif /* SHARABLE_LIB_BUG */
886 #endif /* LINK_CRTL_SHARE */
889 #if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
890 /* Extend the stack space available.
891 Don't do that if dumping, since some systems (e.g. DJGPP)
892 might define a smaller stack limit at that time. */
895 && (!noninteractive
|| initialized
)
897 && !getrlimit (RLIMIT_STACK
, &rlim
))
900 extern int re_max_failures
;
901 /* Approximate the amount regex.c needs per unit of re_max_failures. */
902 int ratio
= 20 * sizeof (char *);
903 /* Then add 33% to cover the size of the smaller stacks that regex.c
904 successively allocates and discards, on its way to the maximum. */
906 /* Add in some extra to cover
907 what we're likely to use for other reasons. */
908 newlim
= re_max_failures
* ratio
+ 200000;
910 /* NetBSD (at least NetBSD 1.2G and former) has a bug in its
911 stack allocation routine for new process that the allocation
912 fails if stack limit is not on page boundary. So, round up the
913 new limit to page boundary. */
914 newlim
= (newlim
+ getpagesize () - 1) / getpagesize () * getpagesize();
916 if (newlim
> rlim
.rlim_max
)
918 newlim
= rlim
.rlim_max
;
919 /* Don't let regex.c overflow the stack we have. */
920 re_max_failures
= (newlim
- 200000) / ratio
;
922 if (rlim
.rlim_cur
< newlim
)
923 rlim
.rlim_cur
= newlim
;
925 setrlimit (RLIMIT_STACK
, &rlim
);
927 #endif /* HAVE_SETRLIMIT and RLIMIT_STACK */
929 /* Record (approximately) where the stack begins. */
930 stack_bottom
= &stack_bottom_variable
;
932 #ifdef USG_SHARED_LIBRARIES
934 brk ((void *)bss_end
);
939 #ifndef SYSTEM_MALLOC
940 /* Arrange to get warning messages as memory fills up. */
941 memory_warnings (0, malloc_warning
);
943 /* Call malloc at least once, to run the initial __malloc_hook.
944 Also call realloc and free for consistency. */
945 free (realloc (malloc (4), 4));
947 /* Arrange to disable interrupt input inside malloc etc. */
948 uninterrupt_malloc ();
949 #endif /* not SYSTEM_MALLOC */
952 /* We do all file input/output as binary files. When we need to translate
953 newlines, we do that manually. */
957 if (!isatty (fileno (stdin
)))
958 setmode (fileno (stdin
), O_BINARY
);
959 if (!isatty (fileno (stdout
)))
962 setmode (fileno (stdout
), O_BINARY
);
964 #else /* not __DJGPP__ >= 2 */
965 (stdin
)->_flag
&= ~_IOTEXT
;
966 (stdout
)->_flag
&= ~_IOTEXT
;
967 (stderr
)->_flag
&= ~_IOTEXT
;
968 #endif /* not __DJGPP__ >= 2 */
971 #ifdef SET_EMACS_PRIORITY
973 nice (emacs_priority
);
975 #endif /* SET_EMACS_PRIORITY */
977 /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
978 The build procedure uses this while dumping, to ensure that the
979 dumped Emacs does not have its system locale tables initialized,
980 as that might cause screwups when the dumped Emacs starts up. */
982 char *lc_all
= getenv ("LC_ALL");
983 do_initial_setlocale
= ! lc_all
|| strcmp (lc_all
, "C");
986 /* Set locale now, so that initial error messages are localized properly.
987 fixup_locale must wait until later, since it builds strings. */
988 if (do_initial_setlocale
)
989 setlocale (LC_ALL
, "");
991 #ifdef EXTRA_INITIALIZE
995 inhibit_window_system
= 0;
997 /* Handle the -t switch, which specifies filename to use as terminal. */
1001 if (argmatch (argv
, argc
, "-t", "--terminal", 4, &term
, &skip_args
))
1006 result
= emacs_open (term
, O_RDWR
, 0);
1009 char *errstring
= strerror (errno
);
1010 fprintf (stderr
, "%s: %s: %s\n", argv
[0], term
, errstring
);
1016 fprintf (stderr
, "%s: %s: not a tty\n", argv
[0], term
);
1019 fprintf (stderr
, "Using %s\n", term
);
1020 #ifdef HAVE_WINDOW_SYSTEM
1021 inhibit_window_system
= 1; /* -t => -nw */
1028 /* Command line option --no-windows is deprecated and thus not mentioned
1029 in the manual and usage informations. */
1030 if (argmatch (argv
, argc
, "-nw", "--no-window-system", 6, NULL
, &skip_args
)
1031 || argmatch (argv
, argc
, "-nw", "--no-windows", 6, NULL
, &skip_args
))
1032 inhibit_window_system
= 1;
1034 /* Handle the -batch switch, which means don't do interactive display. */
1036 if (argmatch (argv
, argc
, "-batch", "--batch", 5, NULL
, &skip_args
))
1038 if (argmatch (argv
, argc
, "-script", "--script", 3, &junk
, &skip_args
))
1040 noninteractive
= 1; /* Set batch mode. */
1041 /* Convert --script to -l, un-skip it, and sort again so that -l will be
1042 handled in proper sequence. */
1043 argv
[skip_args
- 1] = "-l";
1045 sort_args (argc
, argv
);
1048 /* Handle the --help option, which gives a usage message. */
1049 if (argmatch (argv
, argc
, "-help", "--help", 3, NULL
, &skip_args
))
1051 printf (USAGE1
, argv
[0]);
1053 printf (USAGE3
, bug_reporting_address ());
1057 if (! noninteractive
)
1062 inherited_pgroup
= EMACS_GETPGRP (0);
1063 setpgrp (0, getpid ());
1066 #if defined (USG5) && defined (INTERRUPT_INPUT)
1074 /* Don't catch SIGHUP if dumping. */
1081 sigblock (sigmask (SIGHUP
));
1082 /* In --batch mode, don't catch SIGHUP if already ignored.
1083 That makes nohup work. */
1084 if (! noninteractive
1085 || signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
1086 signal (SIGHUP
, fatal_error_signal
);
1087 sigunblock (sigmask (SIGHUP
));
1092 ! noninteractive
|| initialized
1098 /* Don't catch these signals in batch mode if dumping.
1099 On some machines, this sets static data that would make
1100 signal fail to work right when the dumped Emacs is run. */
1101 signal (SIGQUIT
, fatal_error_signal
);
1102 signal (SIGILL
, fatal_error_signal
);
1103 signal (SIGTRAP
, fatal_error_signal
);
1105 signal (SIGUSR1
, handle_USR1_signal
);
1107 signal (SIGUSR2
, handle_USR2_signal
);
1111 signal (SIGABRT
, fatal_error_signal
);
1114 signal (SIGHWE
, fatal_error_signal
);
1117 signal (SIGPRE
, fatal_error_signal
);
1120 signal (SIGORE
, fatal_error_signal
);
1123 signal (SIGUME
, fatal_error_signal
);
1126 signal (SIGDLK
, fatal_error_signal
);
1129 signal (SIGCPULIM
, fatal_error_signal
);
1132 /* This is missing on some systems - OS/2, for example. */
1133 signal (SIGIOT
, fatal_error_signal
);
1136 signal (SIGEMT
, fatal_error_signal
);
1138 signal (SIGFPE
, fatal_error_signal
);
1140 signal (SIGBUS
, fatal_error_signal
);
1142 signal (SIGSEGV
, fatal_error_signal
);
1144 signal (SIGSYS
, fatal_error_signal
);
1146 signal (SIGTERM
, fatal_error_signal
);
1148 signal (SIGXCPU
, fatal_error_signal
);
1151 signal (SIGXFSZ
, fatal_error_signal
);
1152 #endif /* SIGXFSZ */
1155 /* This just means available memory is getting low. */
1156 signal (SIGDANGER
, memory_warning_signal
);
1160 /* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
1161 signal (SIGXCPU
, fatal_error_signal
);
1163 signal (SIGIOINT
, fatal_error_signal
);
1165 signal (SIGGRANT
, fatal_error_signal
);
1166 signal (SIGRETRACT
, fatal_error_signal
);
1167 signal (SIGSOUND
, fatal_error_signal
);
1168 signal (SIGMSG
, fatal_error_signal
);
1172 noninteractive1
= noninteractive
;
1174 /* Perform basic initializations (not merely interning symbols). */
1181 init_charset_once ();
1182 init_coding_once ();
1183 init_syntax_once (); /* Create standard syntax table. */
1184 init_category_once (); /* Create standard category table. */
1185 /* Must be done before init_buffer. */
1186 init_casetab_once ();
1187 init_buffer_once (); /* Create buffer table and some buffers. */
1188 init_minibuf_once (); /* Create list of minibuffers. */
1189 /* Must precede init_window_once. */
1191 /* Call syms_of_xfaces before init_window_once because that
1192 function creates Vterminal_frame. Termcap frames now use
1193 faces, and the face implementation uses some symbols as
1196 /* Call syms_of_keyboard before init_window_once because
1197 keyboard sets up symbols that include some face names that
1198 the X support will want to use. This can happen when
1199 CANNOT_DUMP is defined. */
1200 syms_of_keyboard ();
1203 /* init_window_once calls make_terminal_frame which on Mac OS
1204 creates a full-fledge output_mac type frame. This does not
1205 work correctly before syms_of_textprop, syms_of_macfns,
1206 syms_of_ccl, syms_of_fontset, syms_of_xterm, syms_of_search,
1207 syms_of_frame, mac_initialize, and init_keyboard have already
1209 syms_of_textprop ();
1223 init_window_once (); /* Init the window system. */
1224 init_fileio_once (); /* Must precede any path manipulation. */
1229 if (do_initial_setlocale
)
1232 Vsystem_messages_locale
= Vprevious_system_messages_locale
;
1233 Vsystem_time_locale
= Vprevious_system_time_locale
;
1238 #ifdef CLASH_DETECTION
1242 running_asynch_code
= 0;
1244 /* Handle --unibyte and the EMACS_UNIBYTE envvar,
1245 but not while dumping. */
1248 int inhibit_unibyte
= 0;
1250 /* --multibyte overrides EMACS_UNIBYTE. */
1251 if (argmatch (argv
, argc
, "-no-unibyte", "--no-unibyte", 4, NULL
, &skip_args
)
1252 || argmatch (argv
, argc
, "-multibyte", "--multibyte", 4, NULL
, &skip_args
)
1253 /* Ignore EMACS_UNIBYTE before dumping. */
1254 || (!initialized
&& noninteractive
))
1255 inhibit_unibyte
= 1;
1257 /* --unibyte requests that we set up to do everything with single-byte
1258 buffers and strings. We need to handle this before calling
1259 init_lread, init_editfns and other places that generate Lisp strings
1260 from text in the environment. */
1261 /* Actually this shouldn't be needed as of 20.4 in a generally
1262 unibyte environment. As handa says, environment values
1263 aren't now decoded; also existing buffers are now made
1264 unibyte during startup if .emacs sets unibyte. Tested with
1265 8-bit data in environment variables and /etc/passwd, setting
1266 unibyte and Latin-1 in .emacs. -- Dave Love */
1267 if (argmatch (argv
, argc
, "-unibyte", "--unibyte", 4, NULL
, &skip_args
)
1268 || argmatch (argv
, argc
, "-no-multibyte", "--no-multibyte", 4, NULL
, &skip_args
)
1269 || (getenv ("EMACS_UNIBYTE") && !inhibit_unibyte
))
1271 Lisp_Object old_log_max
;
1272 Lisp_Object symbol
, tail
;
1274 symbol
= intern ("default-enable-multibyte-characters");
1275 Fset (symbol
, Qnil
);
1279 /* Erase pre-dump messages in *Messages* now so no abort. */
1280 old_log_max
= Vmessage_log_max
;
1281 XSETFASTINT (Vmessage_log_max
, 0);
1282 message_dolog ("", 0, 1, 0);
1283 Vmessage_log_max
= old_log_max
;
1286 for (tail
= Vbuffer_alist
; CONSP (tail
);
1291 buffer
= Fcdr (XCAR (tail
));
1292 /* Verify that all buffers are empty now, as they
1294 if (BUF_Z (XBUFFER (buffer
)) > BUF_BEG (XBUFFER (buffer
)))
1296 /* It is safe to do this crudely in an empty buffer. */
1297 XBUFFER (buffer
)->enable_multibyte_characters
= Qnil
;
1303 = argmatch (argv
, argc
, "-nl", "--no-loadup", 6, NULL
, &skip_args
);
1306 #ifdef HAVE_X_WINDOWS
1307 /* Stupid kludge to catch command-line display spec. We can't
1308 handle this argument entirely in window system dependent code
1309 because we don't even know which window system dependent code
1310 to run until we've recognized this argument. */
1312 char *displayname
= 0;
1313 int count_before
= skip_args
;
1315 /* Skip any number of -d options, but only use the last one. */
1318 int count_before_this
= skip_args
;
1320 if (argmatch (argv
, argc
, "-d", "--display", 3, &displayname
, &skip_args
))
1322 else if (argmatch (argv
, argc
, "-display", 0, 3, &displayname
, &skip_args
))
1327 count_before
= count_before_this
;
1330 /* If we have the form --display=NAME,
1331 convert it into -d name.
1332 This requires inserting a new element into argv. */
1333 if (displayname
!= 0 && skip_args
- count_before
== 1)
1335 char **new = (char **) xmalloc (sizeof (char *) * (argc
+ 2));
1338 for (j
= 0; j
< count_before
+ 1; j
++)
1340 new[count_before
+ 1] = "-d";
1341 new[count_before
+ 2] = displayname
;
1342 for (j
= count_before
+ 2; j
<argc
; j
++)
1343 new[j
+ 1] = argv
[j
];
1347 /* Change --display to -d, when its arg is separate. */
1348 else if (displayname
!= 0 && skip_args
> count_before
1349 && argv
[count_before
+ 1][1] == '-')
1350 argv
[count_before
+ 1] = "-d";
1352 /* Don't actually discard this arg. */
1353 skip_args
= count_before
;
1357 /* argmatch must not be used after here,
1358 except when bulding temacs
1359 because the -d argument has not been skipped in skip_args. */
1362 /* Call early 'cause init_environment needs it. */
1364 /* Set defaults for several environment variables. */
1366 init_environment (argc
, argv
, skip_args
);
1372 /* Initialize environment from registry settings. */
1373 init_environment (argv
);
1374 init_ntproc (); /* must precede init_editfns. */
1379 init_mac_osx_environment ();
1382 /* egetenv is a pretty low-level facility, which may get called in
1383 many circumstances; it seems flimsy to put off initializing it
1384 until calling init_callproc. */
1385 set_process_environment ();
1386 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
1387 if this is not done. Do it after set_process_environment so that we
1388 don't pollute Vprocess_environment. */
1389 /* Setting LANG here will defeat the startup locale processing... */
1394 init_buffer (); /* Init default directory of main buffer. */
1396 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
1397 init_cmdargs (argc
, argv
, skip_args
); /* Must precede init_lread. */
1401 /* Erase any pre-dump messages in the message log, to avoid confusion. */
1402 Lisp_Object old_log_max
;
1403 old_log_max
= Vmessage_log_max
;
1404 XSETFASTINT (Vmessage_log_max
, 0);
1405 message_dolog ("", 0, 1, 0);
1406 Vmessage_log_max
= old_log_max
;
1409 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
1412 /* Intern the names of all standard functions and variables;
1413 define standard keys. */
1417 /* The basic levels of Lisp must come first. */
1418 /* And data must come first of all
1419 for the sake of symbols like error-message. */
1421 /* Called before init_window_once for Mac OS Classic. */
1429 syms_of_floatfns ();
1433 syms_of_bytecode ();
1435 syms_of_casefiddle ();
1437 syms_of_callproc ();
1438 syms_of_category ();
1440 /* Called before init_window_once for Mac OS Classic. */
1445 #ifndef NO_DIR_LIBRARY
1447 #endif /* not NO_DIR_LIBRARY */
1453 syms_of_coding (); /* This should be after syms_of_fileio. */
1454 #ifdef CLASH_DETECTION
1455 syms_of_filelock ();
1456 #endif /* CLASH_DETECTION */
1465 /* Called before init_window_once for Mac OS Classic. */
1476 /* Called before init_window_once for Mac OS Classic. */
1477 syms_of_textprop ();
1479 syms_of_composite ();
1485 #endif /* WINDOWSNT */
1488 #ifdef HAVE_X_WINDOWS
1498 #endif /* HAVE_X_WINDOWS */
1502 /* Called before init_window_once for Mac OS Classic. */
1510 syms_of_w32select ();
1513 #endif /* HAVE_NTGUI */
1520 #endif /* HAVE_CARBON */
1530 keys_of_casefiddle ();
1533 keys_of_keyboard ();
1539 if (!noninteractive
)
1542 init_vms_input ();/* init_display calls get_frame_size, that needs this. */
1544 init_display (); /* Determine terminal type. init_sys_modes uses results. */
1547 /* Called before init_window_once for Mac OS Classic. */
1548 init_keyboard (); /* This too must precede init_sys_modes. */
1551 init_vmsproc (); /* And this too. */
1553 init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.). */
1554 #if defined (HAVE_X_WINDOWS) || defined (WINDOWSNT)
1556 #endif /* HAVE_X_WINDOWS */
1574 /* Handle -l loadup, args passed by Makefile. */
1575 if (argmatch (argv
, argc
, "-l", "--load", 3, &file
, &skip_args
))
1576 Vtop_level
= Fcons (intern ("load"),
1577 Fcons (build_string (file
), Qnil
));
1578 /* Unless next switch is -nl, load "loadup.el" first thing. */
1580 Vtop_level
= Fcons (intern ("load"),
1581 Fcons (build_string ("loadup.el"), Qnil
));
1588 /* If the execution TZ happens to be the same as the dump TZ,
1589 change it to some other value and then change it back,
1590 to force the underlying implementation to reload the TZ info.
1591 This is needed on implementations that load TZ info from files,
1592 since the TZ file contents may differ between dump and execution. */
1593 char *tz
= getenv ("TZ");
1594 if (tz
&& !strcmp (tz
, dump_tz
))
1604 /* Set up for profiling. This is known to work on FreeBSD and
1605 GNU/Linux. It might work on some other systems too. Give it a
1606 try and tell us if it works on your system. To compile for
1607 profiling use something like `make CFLAGS="-pg -g -O -DPROFILING=1'. */
1608 #if defined (__FreeBSD__) || defined (__linux)
1612 extern void _mcleanup ();
1614 extern void safe_bcopy ();
1615 extern void dump_opcode_frequencies ();
1618 /* This uses safe_bcopy because that function comes first in the
1619 Emacs executable. It might be better to use something that
1620 gives the start of the text segment, but start_of_text is not
1621 defined on all systems now. */
1622 monstartup (safe_bcopy
, &etext
);
1631 #ifdef LOCALTIME_CACHE
1632 /* Some versions of localtime have a bug. They cache the value of the time
1633 zone rather than looking it up every time. Since localtime() is
1634 called to bolt the undumping time into the undumped emacs, this
1635 results in localtime ignoring the TZ environment variable.
1636 This flushes the new TZ value into localtime. */
1638 #endif /* defined (LOCALTIME_CACHE) */
1640 /* Enter editor command loop. This never returns. */
1646 /* Sort the args so we can find the most important ones
1647 at the beginning of argv. */
1649 /* First, here's a table of all the standard options. */
1651 struct standard_args
1659 struct standard_args standard_args
[] =
1661 { "-version", "--version", 150, 0 },
1663 { "-nl", "--no-shared-memory", 140, 0 },
1666 { "-map", "--map-data", 130, 0 },
1668 { "-t", "--terminal", 120, 1 },
1669 { "-nw", "--no-window-system", 110, 0 },
1670 { "-nw", "--no-windows", 110, 0 },
1671 { "-batch", "--batch", 100, 0 },
1672 { "-script", "--script", 100, 1 },
1673 { "-help", "--help", 90, 0 },
1674 { "-no-unibyte", "--no-unibyte", 83, 0 },
1675 { "-multibyte", "--multibyte", 82, 0 },
1676 { "-unibyte", "--unibyte", 81, 0 },
1677 { "-no-multibyte", "--no-multibyte", 80, 0 },
1678 { "-nl", "--no-loadup", 70, 0 },
1679 /* -d must come last before the options handled in startup.el. */
1680 { "-d", "--display", 60, 1 },
1681 { "-display", 0, 60, 1 },
1682 /* Now for the options handled in startup.el. */
1683 { "-q", "--no-init-file", 50, 0 },
1684 { "-no-init-file", 0, 50, 0 },
1685 { "-no-site-file", "--no-site-file", 40, 0 },
1686 { "-no-splash", "--no-splash", 40, 0 },
1687 { "-u", "--user", 30, 1 },
1688 { "-user", 0, 30, 1 },
1689 { "-debug-init", "--debug-init", 20, 0 },
1690 { "-i", "--icon-type", 15, 0 },
1691 { "-itype", 0, 15, 0 },
1692 { "-iconic", "--iconic", 15, 0 },
1693 { "-bg", "--background-color", 10, 1 },
1694 { "-background", 0, 10, 1 },
1695 { "-fg", "--foreground-color", 10, 1 },
1696 { "-foreground", 0, 10, 1 },
1697 { "-bd", "--border-color", 10, 1 },
1698 { "-bw", "--border-width", 10, 1 },
1699 { "-ib", "--internal-border", 10, 1 },
1700 { "-ms", "--mouse-color", 10, 1 },
1701 { "-cr", "--cursor-color", 10, 1 },
1702 { "-fn", "--font", 10, 1 },
1703 { "-font", 0, 10, 1 },
1704 { "-fs", "--fullscreen", 10, 0 },
1705 { "-fw", "--fullwidth", 10, 0 },
1706 { "-fh", "--fullheight", 10, 0 },
1707 { "-g", "--geometry", 10, 1 },
1708 { "-geometry", 0, 10, 1 },
1709 { "-T", "--title", 10, 1 },
1710 { "-title", 0, 10, 1 },
1711 { "-name", "--name", 10, 1 },
1712 { "-xrm", "--xrm", 10, 1 },
1713 { "-r", "--reverse-video", 5, 0 },
1715 { "-reverse", 0, 5, 0 },
1716 { "-hb", "--horizontal-scroll-bars", 5, 0 },
1717 { "-vb", "--vertical-scroll-bars", 5, 0 },
1718 { "-color", "--color", 5, 0},
1719 /* These have the same priority as ordinary file name args,
1720 so they are not reordered with respect to those. */
1721 { "-L", "--directory", 0, 1 },
1722 { "-directory", 0, 0, 1 },
1723 { "-l", "--load", 0, 1 },
1724 { "-load", 0, 0, 1 },
1725 { "-f", "--funcall", 0, 1 },
1726 { "-funcall", 0, 0, 1 },
1727 { "-eval", "--eval", 0, 1 },
1728 { "-execute", "--execute", 0, 1 },
1729 { "-find-file", "--find-file", 0, 1 },
1730 { "-visit", "--visit", 0, 1 },
1731 { "-file", "--file", 0, 1 },
1732 { "-insert", "--insert", 0, 1 },
1733 /* This should be processed after ordinary file name args and the like. */
1734 { "-kill", "--kill", -10, 0 },
1737 /* Reorder the elements of ARGV (assumed to have ARGC elements)
1738 so that the highest priority ones come first.
1739 Do not change the order of elements of equal priority.
1740 If an option takes an argument, keep it and its argument together.
1742 If an option that takes no argument appears more
1743 than once, eliminate all but one copy of it. */
1746 sort_args (argc
, argv
)
1750 char **new = (char **) xmalloc (sizeof (char *) * argc
);
1751 /* For each element of argv,
1752 the corresponding element of options is:
1753 0 for an option that takes no arguments,
1754 1 for an option that takes one argument, etc.
1755 -1 for an ordinary non-option argument. */
1756 int *options
= (int *) xmalloc (sizeof (int) * argc
);
1757 int *priority
= (int *) xmalloc (sizeof (int) * argc
);
1759 int incoming_used
= 1;
1763 /* Categorize all the options,
1764 and figure out which argv elts are option arguments. */
1765 for (from
= 1; from
< argc
; from
++)
1769 if (argv
[from
][0] == '-')
1774 /* If we have found "--", don't consider
1775 any more arguments as options. */
1776 if (argv
[from
][1] == '-' && argv
[from
][2] == 0)
1778 /* Leave the "--", and everything following it, at the end. */
1779 for (; from
< argc
; from
++)
1781 priority
[from
] = -100;
1787 /* Look for a match with a known old-fashioned option. */
1788 for (i
= 0; i
< sizeof (standard_args
) / sizeof (standard_args
[0]); i
++)
1789 if (!strcmp (argv
[from
], standard_args
[i
].name
))
1791 options
[from
] = standard_args
[i
].nargs
;
1792 priority
[from
] = standard_args
[i
].priority
;
1793 if (from
+ standard_args
[i
].nargs
>= argc
)
1794 fatal ("Option `%s' requires an argument\n", argv
[from
]);
1795 from
+= standard_args
[i
].nargs
;
1799 /* Look for a match with a known long option.
1800 MATCH is -1 if no match so far, -2 if two or more matches so far,
1801 >= 0 (the table index of the match) if just one match so far. */
1802 if (argv
[from
][1] == '-')
1805 thislen
= strlen (argv
[from
]);
1806 equals
= index (argv
[from
], '=');
1808 thislen
= equals
- argv
[from
];
1811 i
< sizeof (standard_args
) / sizeof (standard_args
[0]); i
++)
1812 if (standard_args
[i
].longname
1813 && !strncmp (argv
[from
], standard_args
[i
].longname
,
1822 /* If we found exactly one match, use that. */
1825 options
[from
] = standard_args
[match
].nargs
;
1826 priority
[from
] = standard_args
[match
].priority
;
1827 /* If --OPTION=VALUE syntax is used,
1828 this option uses just one argv element. */
1831 if (from
+ options
[from
] >= argc
)
1832 fatal ("Option `%s' requires an argument\n", argv
[from
]);
1833 from
+= options
[from
];
1840 /* Copy the arguments, in order of decreasing priority, to NEW. */
1842 while (incoming_used
< argc
)
1845 int best_priority
= -9999;
1847 /* Find the highest priority remaining option.
1848 If several have equal priority, take the first of them. */
1849 for (from
= 1; from
< argc
; from
++)
1851 if (argv
[from
] != 0 && priority
[from
] > best_priority
)
1853 best_priority
= priority
[from
];
1856 /* Skip option arguments--they are tied to the options. */
1857 if (options
[from
] > 0)
1858 from
+= options
[from
];
1864 /* Copy the highest priority remaining option, with its args, to NEW.
1865 Unless it is a duplicate of the previous one. */
1866 if (! (options
[best
] == 0
1867 && ! strcmp (new[to
- 1], argv
[best
])))
1869 new[to
++] = argv
[best
];
1870 for (i
= 0; i
< options
[best
]; i
++)
1871 new[to
++] = argv
[best
+ i
+ 1];
1874 incoming_used
+= 1 + (options
[best
] > 0 ? options
[best
] : 0);
1876 /* Clear out this option in ARGV. */
1878 for (i
= 0; i
< options
[best
]; i
++)
1879 argv
[best
+ i
+ 1] = 0;
1882 /* If duplicate options were deleted, fill up extra space with null ptrs. */
1886 bcopy (new, argv
, sizeof (char *) * argc
);
1893 DEFUN ("kill-emacs", Fkill_emacs
, Skill_emacs
, 0, 1, "P",
1894 doc
: /* Exit the Emacs job and kill it.
1895 If ARG is an integer, return ARG as the exit program code.
1896 If ARG is a string, stuff it as keyboard input.
1898 The value of `kill-emacs-hook', if not void,
1899 is a list of functions (of no args),
1900 all of which are called before Emacs is actually killed. */)
1904 struct gcpro gcpro1
;
1911 if (!NILP (Vrun_hooks
) && !noninteractive
)
1912 call1 (Vrun_hooks
, intern ("kill-emacs-hook"));
1916 /* Is it really necessary to do this deassign
1917 when we are going to exit anyway? */
1922 shut_down_emacs (0, 0, STRINGP (arg
) ? arg
: Qnil
);
1924 /* If we have an auto-save list file,
1925 kill it because we are exiting Emacs deliberately (not crashing).
1926 Do it after shut_down_emacs, which does an auto-save. */
1927 if (STRINGP (Vauto_save_list_file_name
))
1928 unlink (SDATA (Vauto_save_list_file_name
));
1930 exit (INTEGERP (arg
) ? XINT (arg
)
1941 /* Perform an orderly shutdown of Emacs. Autosave any modified
1942 buffers, kill any child processes, clean up the terminal modes (if
1943 we're in the foreground), and other stuff like that. Don't perform
1944 any redisplay; this may be called when Emacs is shutting down in
1945 the background, or after its X connection has died.
1947 If SIG is a signal number, print a message for it.
1949 This is called by fatal signal handlers, X protocol error handlers,
1953 shut_down_emacs (sig
, no_x
, stuff
)
1957 /* Prevent running of hooks from now on. */
1960 /* If we are controlling the terminal, reset terminal modes. */
1961 #ifdef EMACS_HAVE_TTY_PGRP
1963 int pgrp
= EMACS_GETPGRP (0);
1966 if (EMACS_GET_TTY_PGRP (0, &tpgrp
) != -1
1971 if (sig
&& sig
!= SIGTERM
)
1972 fprintf (stderr
, "Fatal error (%d).", sig
);
1980 stuff_buffered_input (stuff
);
1982 kill_buffer_processes (Qnil
);
1983 Fdo_auto_save (Qt
, Qnil
);
1985 #ifdef CLASH_DETECTION
1986 unlock_all_files ();
1990 kill_vms_processes ();
1993 #if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
1994 #ifdef HAVE_X_WINDOWS
1995 /* It's not safe to call intern here. Maybe we are crashing. */
1996 if (!noninteractive
&& SYMBOLP (Vwindow_system
)
1997 && SCHARS (SYMBOL_NAME (Vwindow_system
)) == 1
1998 && SREF (SYMBOL_NAME (Vwindow_system
), 0) == 'x'
2000 Fx_close_current_connection ();
2001 #endif /* HAVE_X_WINDOWS */
2005 /* There is a tendency for a SIGIO signal to arrive within exit,
2006 and cause a SIGHUP because the input descriptor is already closed. */
2008 signal (SIGIO
, SIG_IGN
);
2015 /* Do this only if terminating normally, we want glyph matrices
2016 etc. in a core dump. */
2017 if (sig
== 0 || sig
== SIGTERM
)
2019 check_glyph_memory ();
2020 check_message_stack ();
2034 DEFUN ("dump-emacs-data", Fdump_emacs_data
, Sdump_emacs_data
, 1, 1, 0,
2035 doc
: /* Dump current state of Emacs into data file FILENAME.
2036 This function exists on systems that use HAVE_SHM. */)
2038 Lisp_Object filename
;
2040 extern char my_edata
[];
2044 CHECK_STRING (filename
);
2045 filename
= Fexpand_file_name (filename
, Qnil
);
2048 Vpurify_flag
= Qnil
;
2051 /* Tell malloc where start of impure now is. */
2052 /* Also arrange for warnings when nearly out of space. */
2053 #ifndef SYSTEM_MALLOC
2054 memory_warnings (my_edata
, malloc_warning
);
2056 map_out_data (SDATA (filename
));
2063 #else /* not HAVE_SHM */
2065 DEFUN ("dump-emacs", Fdump_emacs
, Sdump_emacs
, 2, 2, 0,
2066 doc
: /* Dump current state of Emacs into executable file FILENAME.
2067 Take symbols from SYMFILE (presumably the file you executed to run Emacs).
2068 This is used in the file `loadup.el' when building Emacs.
2070 You must run Emacs in batch mode in order to dump it. */)
2072 Lisp_Object filename
, symfile
;
2074 extern char my_edata
[];
2077 int count
= SPECPDL_INDEX ();
2081 if (! noninteractive
)
2082 error ("Dumping Emacs works only in batch mode");
2084 /* Bind `command-line-processed' to nil before dumping,
2085 so that the dumped Emacs will process its command line
2086 and set up to work with X windows if appropriate. */
2087 symbol
= intern ("command-line-processed");
2088 specbind (symbol
, Qnil
);
2090 CHECK_STRING (filename
);
2091 filename
= Fexpand_file_name (filename
, Qnil
);
2092 if (!NILP (symfile
))
2094 CHECK_STRING (symfile
);
2095 if (SCHARS (symfile
))
2096 symfile
= Fexpand_file_name (symfile
, Qnil
);
2100 Vpurify_flag
= Qnil
;
2103 set_time_zone_rule (dump_tz
);
2104 #ifndef LOCALTIME_CACHE
2105 /* Force a tz reload, since set_time_zone_rule doesn't. */
2112 mapout_data (SDATA (filename
));
2114 /* Tell malloc where start of impure now is. */
2115 /* Also arrange for warnings when nearly out of space. */
2116 #ifndef SYSTEM_MALLOC
2118 /* On Windows, this was done before dumping, and that once suffices.
2119 Meanwhile, my_edata is not valid on Windows. */
2120 memory_warnings (my_edata
, malloc_warning
);
2121 #endif /* not WINDOWSNT */
2123 #ifdef DOUG_LEA_MALLOC
2124 malloc_state_ptr
= malloc_get_state ();
2127 #ifdef USE_MMAP_FOR_BUFFERS
2130 unexec (SDATA (filename
),
2131 !NILP (symfile
) ? SDATA (symfile
) : 0, my_edata
, 0, 0);
2132 #ifdef USE_MMAP_FOR_BUFFERS
2135 #ifdef DOUG_LEA_MALLOC
2136 free (malloc_state_ptr
);
2138 #endif /* not VMS */
2142 return unbind_to (count
, Qnil
);
2145 #endif /* not HAVE_SHM */
2147 #endif /* not CANNOT_DUMP */
2150 /* Recover from setlocale (LC_ALL, ""). */
2154 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
2155 so that numbers are read and printed properly for Emacs Lisp. */
2156 setlocale (LC_NUMERIC
, "C");
2159 /* Set system locale CATEGORY, with previous locale *PLOCALE, to
2162 synchronize_locale (category
, plocale
, desired_locale
)
2164 Lisp_Object
*plocale
;
2165 Lisp_Object desired_locale
;
2167 if (! EQ (*plocale
, desired_locale
))
2169 *plocale
= desired_locale
;
2170 setlocale (category
, (STRINGP (desired_locale
)
2171 ? (char *)(SDATA (desired_locale
))
2176 /* Set system time locale to match Vsystem_time_locale, if possible. */
2178 synchronize_system_time_locale ()
2180 synchronize_locale (LC_TIME
, &Vprevious_system_time_locale
,
2181 Vsystem_time_locale
);
2184 /* Set system messages locale to match Vsystem_messages_locale, if
2187 synchronize_system_messages_locale ()
2190 synchronize_locale (LC_MESSAGES
, &Vprevious_system_messages_locale
,
2191 Vsystem_messages_locale
);
2194 #endif /* HAVE_SETLOCALE */
2201 decode_env_path (evarname
, defalt
)
2202 char *evarname
, *defalt
;
2204 register char *path
, *p
;
2205 Lisp_Object lpath
, element
, tem
;
2207 /* It's okay to use getenv here, because this function is only used
2208 to initialize variables when Emacs starts up, and isn't called
2211 path
= (char *) getenv (evarname
);
2217 /* Ensure values from the environment use the proper directory separator. */
2220 p
= alloca (strlen (path
) + 1);
2224 if ('/' == DIRECTORY_SEP
)
2225 dostounix_filename (path
);
2227 unixtodos_filename (path
);
2233 p
= index (path
, SEPCHAR
);
2234 if (!p
) p
= path
+ strlen (path
);
2235 element
= (p
- path
? make_string (path
, p
- path
)
2236 : build_string ("."));
2238 /* Add /: to the front of the name
2239 if it would otherwise be treated as magic. */
2240 tem
= Ffind_file_name_handler (element
, Qt
);
2242 /* However, if the handler says "I'm safe",
2243 don't bother adding /:. */
2247 prop
= Fget (tem
, intern ("safe-magic"));
2253 element
= concat2 (build_string ("/:"), element
);
2255 lpath
= Fcons (element
, lpath
);
2261 return Fnreverse (lpath
);
2267 Qfile_name_handler_alist
= intern ("file-name-handler-alist");
2268 staticpro (&Qfile_name_handler_alist
);
2272 defsubr (&Sdump_emacs_data
);
2274 defsubr (&Sdump_emacs
);
2278 defsubr (&Skill_emacs
);
2280 defsubr (&Sinvocation_name
);
2281 defsubr (&Sinvocation_directory
);
2283 DEFVAR_LISP ("command-line-args", &Vcommand_line_args
,
2284 doc
: /* Args passed by shell to Emacs, as a list of strings.
2285 Many arguments are deleted from the list as they are processed. */);
2287 DEFVAR_LISP ("system-type", &Vsystem_type
,
2288 doc
: /* Value is symbol indicating type of operating system you are using. */);
2289 Vsystem_type
= intern (SYSTEM_TYPE
);
2291 DEFVAR_LISP ("system-configuration", &Vsystem_configuration
,
2292 doc
: /* Value is string indicating configuration Emacs was built for.
2293 On MS-Windows, the value reflects the OS flavor and version on which
2294 Emacs is running. */);
2295 Vsystem_configuration
= build_string (EMACS_CONFIGURATION
);
2297 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options
,
2298 doc
: /* String containing the configuration options Emacs was built with. */);
2299 Vsystem_configuration_options
= build_string (EMACS_CONFIG_OPTIONS
);
2301 DEFVAR_BOOL ("noninteractive", &noninteractive1
,
2302 doc
: /* Non-nil means Emacs is running without interactive terminal. */);
2304 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook
,
2305 doc
: /* Hook to be run when kill-emacs is called.
2306 Since `kill-emacs' may be invoked when the terminal is disconnected (or
2307 in other similar situations), functions placed on this hook should not
2308 expect to be able to interact with the user. To ask for confirmation,
2309 see `kill-emacs-query-functions' instead.
2311 The hook is not run in batch mode, i.e., if `noninteractive' is non-nil. */);
2312 Vkill_emacs_hook
= Qnil
;
2314 empty_string
= build_string ("");
2315 staticpro (&empty_string
);
2318 DEFVAR_LISP ("signal-USR1-hook", &Vsignal_USR1_hook
,
2319 doc
: /* Hook to be run whenever emacs receives a USR1 signal. */);
2320 Vsignal_USR1_hook
= Qnil
;
2322 DEFVAR_LISP ("signal-USR2-hook", &Vsignal_USR2_hook
,
2323 doc
: /* Hook to be run whenever emacs receives a USR2 signal. */);
2324 Vsignal_USR2_hook
= Qnil
;
2329 DEFVAR_INT ("emacs-priority", &emacs_priority
,
2330 doc
: /* Priority for Emacs to run at.
2331 This value is effective only if set before Emacs is dumped,
2332 and only if the Emacs executable is installed with setuid to permit
2333 it to change priority. (Emacs sets its uid back to the real uid.)
2334 Currently, you need to define SET_EMACS_PRIORITY in `config.h'
2335 before you compile Emacs, to enable the code for this feature. */);
2338 DEFVAR_LISP ("path-separator", &Vpath_separator
,
2339 doc
: /* The directory separator in search paths, as a string. */);
2342 Vpath_separator
= make_string (&c
, 1);
2345 DEFVAR_LISP ("invocation-name", &Vinvocation_name
,
2346 doc
: /* The program name that was used to run Emacs.
2347 Any directory names are omitted. */);
2349 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory
,
2350 doc
: /* The directory in which the Emacs executable was found, to run it.
2351 The value is nil if that directory's name is not known. */);
2353 DEFVAR_LISP ("installation-directory", &Vinstallation_directory
,
2354 doc
: /* A directory within which to look for the `lib-src' and `etc' directories.
2355 This is non-nil when we can't find those directories in their standard
2356 installed locations, but we can find them
2357 near where the Emacs executable was found. */);
2358 Vinstallation_directory
= Qnil
;
2360 DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale
,
2361 doc
: /* System locale for messages. */);
2362 Vsystem_messages_locale
= Qnil
;
2364 DEFVAR_LISP ("previous-system-messages-locale",
2365 &Vprevious_system_messages_locale
,
2366 doc
: /* Most recently used system locale for messages. */);
2367 Vprevious_system_messages_locale
= Qnil
;
2369 DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale
,
2370 doc
: /* System locale for time. */);
2371 Vsystem_time_locale
= Qnil
;
2373 DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale
,
2374 doc
: /* Most recently used system locale for time. */);
2375 Vprevious_system_time_locale
= Qnil
;