(syms_of_emacs): Doc fix.
[bpt/emacs.git] / src / emacs.c
1 /* Fully extensible Emacs, running on Unix, intended for GNU.
2 Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 1998, 1999,
3 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
4
5 This file is part of GNU Emacs.
6
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)
10 any later version.
11
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.
16
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., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA. */
21
22
23 #include <config.h>
24 #include <signal.h>
25 #include <errno.h>
26 #include <stdio.h>
27
28 #include <sys/types.h>
29 #include <sys/file.h>
30
31 #ifdef VMS
32 #include <ssdef.h>
33 #endif
34
35 #ifdef HAVE_UNISTD_H
36 #include <unistd.h>
37 #endif
38
39 #ifdef BSD_SYSTEM
40 #include <sys/ioctl.h>
41 #endif
42
43 #ifdef WINDOWSNT
44 #include <fcntl.h>
45 #include <windows.h> /* just for w32.h */
46 #include "w32.h"
47 #include "w32heap.h" /* for prototype of sbrk */
48 #endif
49
50 #include "lisp.h"
51 #include "commands.h"
52 #include "intervals.h"
53 #include "buffer.h"
54 #include "window.h"
55
56 #include "systty.h"
57 #include "blockinput.h"
58 #include "syssignal.h"
59 #include "process.h"
60 #include "termhooks.h"
61 #include "keyboard.h"
62 #include "keymap.h"
63
64 #ifdef HAVE_SETLOCALE
65 #include <locale.h>
66 #endif
67
68 #ifdef HAVE_SETRLIMIT
69 #include <sys/time.h>
70 #include <sys/resource.h>
71 #endif
72
73 #ifdef HAVE_PERSONALITY_LINUX32
74 #include <sys/personality.h>
75 #endif
76
77 #ifndef O_RDWR
78 #define O_RDWR 2
79 #endif
80
81 #ifdef HAVE_SETPGID
82 #if !defined (USG) || defined (BSD_PGRPS)
83 #undef setpgrp
84 #define setpgrp setpgid
85 #endif
86 #endif
87
88 extern void malloc_warning P_ ((char *));
89 extern void set_time_zone_rule P_ ((char *));
90 #ifdef HAVE_INDEX
91 extern char *index P_ ((const char *, int));
92 #endif
93
94 /* Make these values available in GDB, which doesn't see macros. */
95
96 #ifdef USE_LSB_TAG
97 int gdb_use_lsb = 1;
98 #else
99 int gdb_use_lsb = 0;
100 #endif
101 #ifdef NO_UNION_TYPE
102 int gdb_use_union = 0;
103 #else
104 int gdb_use_union = 1;
105 #endif
106 EMACS_INT gdb_valbits = VALBITS;
107 EMACS_INT gdb_gctypebits = GCTYPEBITS;
108 #ifdef DATA_SEG_BITS
109 EMACS_INT gdb_data_seg_bits = DATA_SEG_BITS;
110 #else
111 EMACS_INT gdb_data_seg_bits = 0;
112 #endif
113 EMACS_INT PVEC_FLAG = PSEUDOVECTOR_FLAG;
114 EMACS_INT gdb_array_mark_flag = ARRAY_MARK_FLAG;
115 /* GDB might say "No enum type named pvec_type" if we don't have at
116 least one symbol with that type, and then xbacktrace could fail. */
117 enum pvec_type gdb_pvec_type = PVEC_TYPE_MASK;
118
119 /* Command line args from shell, as list of strings. */
120 Lisp_Object Vcommand_line_args;
121
122 /* The name under which Emacs was invoked, with any leading directory
123 names discarded. */
124 Lisp_Object Vinvocation_name;
125
126 /* The directory name from which Emacs was invoked. */
127 Lisp_Object Vinvocation_directory;
128
129 /* The directory name in which to find subdirs such as lisp and etc.
130 nil means get them only from PATH_LOADSEARCH. */
131 Lisp_Object Vinstallation_directory;
132
133 /* Hook run by `kill-emacs' before it does really anything. */
134 Lisp_Object Vkill_emacs_hook;
135
136 /* An empty lisp string. To avoid having to build any other. */
137 Lisp_Object empty_string;
138
139 /* Search path separator. */
140 Lisp_Object Vpath_separator;
141
142 /* Set nonzero after Emacs has started up the first time.
143 Prevents reinitialization of the Lisp world and keymaps
144 on subsequent starts. */
145 int initialized;
146
147 #ifdef DOUG_LEA_MALLOC
148 /* Preserves a pointer to the memory allocated that copies that
149 static data inside glibc's malloc. */
150 void *malloc_state_ptr;
151 /* From glibc, a routine that returns a copy of the malloc internal state. */
152 extern void *malloc_get_state ();
153 /* From glibc, a routine that overwrites the malloc internal state. */
154 extern int malloc_set_state ();
155 /* Non-zero if the MALLOC_CHECK_ enviroment variable was set while
156 dumping. Used to work around a bug in glibc's malloc. */
157 int malloc_using_checking;
158 #endif
159
160 /* Variable whose value is symbol giving operating system type. */
161 Lisp_Object Vsystem_type;
162
163 /* Variable whose value is string giving configuration built for. */
164 Lisp_Object Vsystem_configuration;
165
166 /* Variable whose value is string giving configuration options,
167 for use when reporting bugs. */
168 Lisp_Object Vsystem_configuration_options;
169
170 Lisp_Object Qfile_name_handler_alist;
171
172 /* Current and previous system locales for messages and time. */
173 Lisp_Object Vsystem_messages_locale;
174 Lisp_Object Vprevious_system_messages_locale;
175 Lisp_Object Vsystem_time_locale;
176 Lisp_Object Vprevious_system_time_locale;
177
178 /* If non-zero, emacs should not attempt to use a window-specific code,
179 but instead should use the virtual terminal under which it was started. */
180 int inhibit_window_system;
181
182 /* If nonzero, set Emacs to run at this priority. This is also used
183 in child_setup and sys_suspend to make sure subshells run at normal
184 priority; those functions have their own extern declaration. */
185 EMACS_INT emacs_priority;
186
187 /* If non-zero, a filter or a sentinel is running. Tested to save the match
188 data on the first attempt to change it inside asynchronous code. */
189 int running_asynch_code;
190
191 #ifdef BSD_PGRPS
192 /* See sysdep.c. */
193 extern int inherited_pgroup;
194 #endif
195
196 #ifdef HAVE_X_WINDOWS
197 /* If non-zero, -d was specified, meaning we're using some window system. */
198 int display_arg;
199 #endif
200
201 /* An address near the bottom of the stack.
202 Tells GC how to save a copy of the stack. */
203 char *stack_bottom;
204
205 /* The address where the heap starts (from the first sbrk (0) call). */
206 static void *my_heap_start;
207
208 /* The gap between BSS end and heap start as far as we can tell. */
209 static unsigned long heap_bss_diff;
210
211 /* If the gap between BSS end and heap start is larger than this we try to
212 work around it, and if that fails, output a warning in dump-emacs. */
213 #define MAX_HEAP_BSS_DIFF (1024*1024)
214
215
216 #ifdef HAVE_WINDOW_SYSTEM
217 extern Lisp_Object Vwindow_system;
218 #endif /* HAVE_WINDOW_SYSTEM */
219
220 extern Lisp_Object Vauto_save_list_file_name;
221
222 extern Lisp_Object Vinhibit_redisplay;
223
224 #ifdef USG_SHARED_LIBRARIES
225 /* If nonzero, this is the place to put the end of the writable segment
226 at startup. */
227
228 unsigned int bss_end = 0;
229 #endif
230
231 /* Nonzero means running Emacs without interactive terminal. */
232
233 int noninteractive;
234
235 /* Value of Lisp variable `noninteractive'.
236 Normally same as C variable `noninteractive'
237 but nothing terrible happens if user sets this one. */
238
239 int noninteractive1;
240
241 /* Save argv and argc. */
242 char **initial_argv;
243 int initial_argc;
244
245 static void sort_args ();
246 void syms_of_emacs ();
247
248 /* MSVC needs each string be shorter than 2048 bytes, so the usage
249 strings below are split to not overflow this limit. */
250 #define USAGE1 "\
251 Usage: %s [OPTION-OR-FILENAME]...\n\
252 \n\
253 Run Emacs, the extensible, customizable, self-documenting real-time\n\
254 display editor. The recommended way to start Emacs for normal editing\n\
255 is with no options at all.\n\
256 \n\
257 Run M-x info RET m emacs RET m emacs invocation RET inside Emacs to\n\
258 read the main documentation for these command-line arguments.\n\
259 \n\
260 Initialization options:\n\
261 \n\
262 --batch do not do interactive display; implies -q\n\
263 --debug-init enable Emacs Lisp debugger for init file\n\
264 --display, -d DISPLAY use X server DISPLAY\n\
265 --multibyte, --no-unibyte inhibit the effect of EMACS_UNIBYTE\n\
266 --no-desktop do not load a saved desktop\n\
267 --no-init-file, -q load neither ~/.emacs nor default.el\n\
268 --no-shared-memory, -nl do not use shared memory\n\
269 --no-site-file do not load site-start.el\n\
270 --no-splash do not display a splash screen on startup\n\
271 --no-window-system, -nw do not communicate with X, ignoring $DISPLAY\n\
272 --quick, -Q equivalent to -q --no-site-file --no-splash\n\
273 --script FILE run FILE as an Emacs Lisp script\n\
274 --terminal, -t DEVICE use DEVICE for terminal I/O\n\
275 --unibyte, --no-multibyte run Emacs in unibyte mode\n\
276 --user, -u USER load ~USER/.emacs instead of your own\n\
277 \n%s"
278
279 #define USAGE2 "\
280 Action options:\n\
281 \n\
282 FILE visit FILE using find-file\n\
283 +LINE FILE visit FILE using find-file, then go to line LINE\n\
284 +LINE:COLUMN FILE visit FILE using find-file, then go to line LINE,\n\
285 column COLUMN\n\
286 --directory, -L DIR add DIR to variable load-path\n\
287 --eval EXPR evaluate Emacs Lisp expression EXPR\n\
288 --execute EXPR evaluate Emacs Lisp expression EXPR\n\
289 --file FILE visit FILE using find-file\n\
290 --find-file FILE visit FILE using find-file\n\
291 --funcall, -f FUNC call Emacs Lisp function FUNC with no arguments\n\
292 --insert FILE insert contents of FILE into current buffer\n\
293 --kill exit without asking for confirmation\n\
294 --load, -l FILE load Emacs Lisp FILE using the load function\n\
295 --visit FILE visit FILE using find-file\n\
296 \n"
297
298 #define USAGE3 "\
299 Display options:\n\
300 \n\
301 --background-color, -bg COLOR window background color\n\
302 --basic-display, -D disable many display features;\n\
303 used for debugging Emacs\n\
304 --border-color, -bd COLOR main border color\n\
305 --border-width, -bw WIDTH width of main border\n\
306 --color, --color=MODE color mode for character terminals;\n\
307 MODE defaults to `auto', and can also\n\
308 be `never', `auto', `always',\n\
309 or a mode name like `ansi8'\n\
310 --cursor-color, -cr COLOR color of the Emacs cursor indicating point\n\
311 --font, -fn FONT default font; must be fixed-width\n\
312 --foreground-color, -fg COLOR window foreground color\n\
313 --fullheight, -fh make the first frame high as the screen\n\
314 --fullscreen, -fs make first frame fullscreen\n\
315 --fullwidth, -fw make the first frame wide as the screen\n\
316 --geometry, -g GEOMETRY window geometry\n\
317 --no-bitmap-icon, -nbi do not use picture of gnu for Emacs icon\n\
318 --iconic start Emacs in iconified state\n\
319 --internal-border, -ib WIDTH width between text and main border\n\
320 --line-spacing, -lsp PIXELS additional space to put between lines\n\
321 --mouse-color, -ms COLOR mouse cursor color in Emacs window\n\
322 --name NAME title for initial Emacs frame\n\
323 --no-blinking-cursor, -nbc disable blinking cursor\n\
324 --reverse-video, -r, -rv switch foreground and background\n\
325 --title, -T TITLE title for initial Emacs frame\n\
326 --vertical-scroll-bars, -vb enable vertical scroll bars\n\
327 --xrm XRESOURCES set additional X resources\n\
328 --help display this help and exit\n\
329 --version output version information and exit\n\
330 \n"
331
332 #define USAGE4 "\
333 You can generally also specify long option names with a single -; for\n\
334 example, -batch as well as --batch. You can use any unambiguous\n\
335 abbreviation for a --option.\n\
336 \n\
337 Various environment variables and window system resources also affect\n\
338 Emacs' operation. See the main documentation.\n\
339 \n\
340 Report bugs to %s. First, please see the Bugs\n\
341 section of the Emacs manual or the file BUGS.\n"
342
343 \f
344 /* Signal code for the fatal signal that was received. */
345 int fatal_error_code;
346
347 /* Nonzero if handling a fatal error already. */
348 int fatal_error_in_progress;
349
350 /* If non-null, call this function from fatal_error_signal before
351 committing suicide. */
352
353 void (*fatal_error_signal_hook) P_ ((void));
354
355 #ifdef HAVE_GTK_AND_PTHREAD
356 /* When compiled with GTK and running under Gnome, multiple threads meay be
357 created. Keep track of our main thread to make sure signals are delivered
358 to it (see syssignal.h). */
359
360 pthread_t main_thread;
361 #endif
362
363
364 #if defined (SIGUSR1) || defined (SIGUSR2)
365 SIGTYPE
366 handle_user_signal (sig)
367 int sig;
368 {
369 struct input_event buf;
370
371 SIGNAL_THREAD_CHECK (sig);
372 bzero (&buf, sizeof buf);
373 buf.kind = USER_SIGNAL_EVENT;
374 buf.frame_or_window = selected_frame;
375
376 kbd_buffer_store_event (&buf);
377 buf.code = sig;
378 kbd_buffer_store_event (&buf);
379 }
380 #endif
381
382 /* Handle bus errors, invalid instruction, etc. */
383 SIGTYPE
384 fatal_error_signal (sig)
385 int sig;
386 {
387 SIGNAL_THREAD_CHECK (sig);
388 fatal_error_code = sig;
389 signal (sig, SIG_DFL);
390
391 TOTALLY_UNBLOCK_INPUT;
392
393 /* If fatal error occurs in code below, avoid infinite recursion. */
394 if (! fatal_error_in_progress)
395 {
396 fatal_error_in_progress = 1;
397
398 shut_down_emacs (sig, 0, Qnil);
399 }
400
401 #ifdef VMS
402 LIB$STOP (SS$_ABORT);
403 #else
404 /* Signal the same code; this time it will really be fatal.
405 Remember that since we're in a signal handler, the signal we're
406 going to send is probably blocked, so we have to unblock it if we
407 want to really receive it. */
408 #ifndef MSDOS
409 sigunblock (sigmask (fatal_error_code));
410 #endif
411
412 if (fatal_error_signal_hook)
413 fatal_error_signal_hook ();
414
415 kill (getpid (), fatal_error_code);
416 #endif /* not VMS */
417 }
418
419 #ifdef SIGDANGER
420
421 /* Handler for SIGDANGER. */
422 SIGTYPE
423 memory_warning_signal (sig)
424 int sig;
425 {
426 signal (sig, memory_warning_signal);
427 SIGNAL_THREAD_CHECK (sig);
428
429 malloc_warning ("Operating system warns that virtual memory is running low.\n");
430
431 /* It might be unsafe to call do_auto_save now. */
432 force_auto_save_soon ();
433 }
434 #endif
435
436 /* We define abort, rather than using it from the library,
437 so that GDB can return from a breakpoint here.
438 MSDOS has its own definition in msdos.c. */
439
440 #if ! defined (DOS_NT) && ! defined (NO_ABORT)
441
442 #ifndef ABORT_RETURN_TYPE
443 #define ABORT_RETURN_TYPE void
444 #endif
445
446 ABORT_RETURN_TYPE
447 abort ()
448 {
449 kill (getpid (), SIGABRT);
450 /* This shouldn't be executed, but it prevents a warning. */
451 exit (1);
452 }
453 #endif
454
455 \f
456 /* Code for dealing with Lisp access to the Unix command line. */
457
458 static void
459 init_cmdargs (argc, argv, skip_args)
460 int argc;
461 char **argv;
462 int skip_args;
463 {
464 register int i;
465 Lisp_Object name, dir, tem;
466 int count = SPECPDL_INDEX ();
467 Lisp_Object raw_name;
468
469 initial_argv = argv;
470 initial_argc = argc;
471
472 raw_name = build_string (argv[0]);
473
474 /* Add /: to the front of the name
475 if it would otherwise be treated as magic. */
476 tem = Ffind_file_name_handler (raw_name, Qt);
477 if (! NILP (tem))
478 raw_name = concat2 (build_string ("/:"), raw_name);
479
480 Vinvocation_name = Ffile_name_nondirectory (raw_name);
481 Vinvocation_directory = Ffile_name_directory (raw_name);
482
483 /* If we got no directory in argv[0], search PATH to find where
484 Emacs actually came from. */
485 if (NILP (Vinvocation_directory))
486 {
487 Lisp_Object found;
488 int yes = openp (Vexec_path, Vinvocation_name,
489 Vexec_suffixes, &found, make_number (X_OK));
490 if (yes == 1)
491 {
492 /* Add /: to the front of the name
493 if it would otherwise be treated as magic. */
494 tem = Ffind_file_name_handler (found, Qt);
495 if (! NILP (tem))
496 found = concat2 (build_string ("/:"), found);
497 Vinvocation_directory = Ffile_name_directory (found);
498 }
499 }
500
501 if (!NILP (Vinvocation_directory)
502 && NILP (Ffile_name_absolute_p (Vinvocation_directory)))
503 /* Emacs was started with relative path, like ./emacs.
504 Make it absolute. */
505 Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, Qnil);
506
507 Vinstallation_directory = Qnil;
508
509 if (!NILP (Vinvocation_directory))
510 {
511 dir = Vinvocation_directory;
512 name = Fexpand_file_name (Vinvocation_name, dir);
513 while (1)
514 {
515 Lisp_Object tem, lib_src_exists;
516 Lisp_Object etc_exists, info_exists;
517
518 /* See if dir contains subdirs for use by Emacs.
519 Check for the ones that would exist in a build directory,
520 not including lisp and info. */
521 tem = Fexpand_file_name (build_string ("lib-src"), dir);
522 lib_src_exists = Ffile_exists_p (tem);
523
524 #ifdef MSDOS
525 /* MSDOS installations frequently remove lib-src, but we still
526 must set installation-directory, or else info won't find
527 its files (it uses the value of installation-directory). */
528 tem = Fexpand_file_name (build_string ("info"), dir);
529 info_exists = Ffile_exists_p (tem);
530 #else
531 info_exists = Qnil;
532 #endif
533
534 if (!NILP (lib_src_exists) || !NILP (info_exists))
535 {
536 tem = Fexpand_file_name (build_string ("etc"), dir);
537 etc_exists = Ffile_exists_p (tem);
538 if (!NILP (etc_exists))
539 {
540 Vinstallation_directory
541 = Ffile_name_as_directory (dir);
542 break;
543 }
544 }
545
546 /* See if dir's parent contains those subdirs. */
547 tem = Fexpand_file_name (build_string ("../lib-src"), dir);
548 lib_src_exists = Ffile_exists_p (tem);
549
550
551 #ifdef MSDOS
552 /* See the MSDOS commentary above. */
553 tem = Fexpand_file_name (build_string ("../info"), dir);
554 info_exists = Ffile_exists_p (tem);
555 #else
556 info_exists = Qnil;
557 #endif
558
559 if (!NILP (lib_src_exists) || !NILP (info_exists))
560 {
561 tem = Fexpand_file_name (build_string ("../etc"), dir);
562 etc_exists = Ffile_exists_p (tem);
563 if (!NILP (etc_exists))
564 {
565 tem = Fexpand_file_name (build_string (".."), dir);
566 Vinstallation_directory
567 = Ffile_name_as_directory (tem);
568 break;
569 }
570 }
571
572 /* If the Emacs executable is actually a link,
573 next try the dir that the link points into. */
574 tem = Ffile_symlink_p (name);
575 if (!NILP (tem))
576 {
577 name = Fexpand_file_name (tem, dir);
578 dir = Ffile_name_directory (name);
579 }
580 else
581 break;
582 }
583 }
584
585 Vcommand_line_args = Qnil;
586
587 for (i = argc - 1; i >= 0; i--)
588 {
589 if (i == 0 || i > skip_args)
590 /* For the moment, we keep arguments as is in unibyte strings.
591 They are decoded in the function command-line after we know
592 locale-coding-system. */
593 Vcommand_line_args
594 = Fcons (make_unibyte_string (argv[i], strlen (argv[i])),
595 Vcommand_line_args);
596 }
597
598 unbind_to (count, Qnil);
599 }
600
601 DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
602 doc: /* Return the program name that was used to run Emacs.
603 Any directory names are omitted. */)
604 ()
605 {
606 return Fcopy_sequence (Vinvocation_name);
607 }
608
609 DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
610 0, 0, 0,
611 doc: /* Return the directory name in which the Emacs executable was located. */)
612 ()
613 {
614 return Fcopy_sequence (Vinvocation_directory);
615 }
616
617 \f
618 #ifdef VMS
619 #ifdef LINK_CRTL_SHARE
620 #ifdef SHARABLE_LIB_BUG
621 extern noshare char **environ;
622 #endif /* SHARABLE_LIB_BUG */
623 #endif /* LINK_CRTL_SHARE */
624 #endif /* VMS */
625
626 #ifdef HAVE_TZSET
627 /* A valid but unlikely value for the TZ environment value.
628 It is OK (though a bit slower) if the user actually chooses this value. */
629 static char dump_tz[] = "UtC0";
630 #endif
631
632 #ifndef ORDINARY_LINK
633 /* We don't include crtbegin.o and crtend.o in the link,
634 so these functions and variables might be missed.
635 Provide dummy definitions to avoid error.
636 (We don't have any real constructors or destructors.) */
637 #ifdef __GNUC__
638 #ifndef GCC_CTORS_IN_LIBC
639 void __do_global_ctors ()
640 {}
641 void __do_global_ctors_aux ()
642 {}
643 void __do_global_dtors ()
644 {}
645 /* GNU/Linux has a bug in its library; avoid an error. */
646 #ifndef GNU_LINUX
647 char * __CTOR_LIST__[2] = { (char *) (-1), 0 };
648 #endif
649 char * __DTOR_LIST__[2] = { (char *) (-1), 0 };
650 #endif /* GCC_CTORS_IN_LIBC */
651 void __main ()
652 {}
653 #endif /* __GNUC__ */
654 #endif /* ORDINARY_LINK */
655
656 /* Test whether the next argument in ARGV matches SSTR or a prefix of
657 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
658 (the argument is supposed to have a value) store in *VALPTR either
659 the next argument or the portion of this one after the equal sign.
660 ARGV is read starting at position *SKIPPTR; this index is advanced
661 by the number of arguments used.
662
663 Too bad we can't just use getopt for all of this, but we don't have
664 enough information to do it right. */
665
666 static int
667 argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr)
668 char **argv;
669 int argc;
670 char *sstr;
671 char *lstr;
672 int minlen;
673 char **valptr;
674 int *skipptr;
675 {
676 char *p = NULL;
677 int arglen;
678 char *arg;
679
680 /* Don't access argv[argc]; give up in advance. */
681 if (argc <= *skipptr + 1)
682 return 0;
683
684 arg = argv[*skipptr+1];
685 if (arg == NULL)
686 return 0;
687 if (strcmp (arg, sstr) == 0)
688 {
689 if (valptr != NULL)
690 {
691 *valptr = argv[*skipptr+2];
692 *skipptr += 2;
693 }
694 else
695 *skipptr += 1;
696 return 1;
697 }
698 arglen = (valptr != NULL && (p = index (arg, '=')) != NULL
699 ? p - arg : strlen (arg));
700 if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
701 return 0;
702 else if (valptr == NULL)
703 {
704 *skipptr += 1;
705 return 1;
706 }
707 else if (p != NULL)
708 {
709 *valptr = p+1;
710 *skipptr += 1;
711 return 1;
712 }
713 else if (argv[*skipptr+2] != NULL)
714 {
715 *valptr = argv[*skipptr+2];
716 *skipptr += 2;
717 return 1;
718 }
719 else
720 {
721 return 0;
722 }
723 }
724
725 #ifdef DOUG_LEA_MALLOC
726
727 /* malloc can be invoked even before main (e.g. by the dynamic
728 linker), so the dumped malloc state must be restored as early as
729 possible using this special hook. */
730
731 static void
732 malloc_initialize_hook ()
733 {
734 #ifndef USE_CRT_DLL
735 extern char **environ;
736 #endif
737
738 if (initialized)
739 {
740 if (!malloc_using_checking)
741 /* Work around a bug in glibc's malloc. MALLOC_CHECK_ must be
742 ignored if the heap to be restored was constructed without
743 malloc checking. Can't use unsetenv, since that calls malloc. */
744 {
745 char **p;
746
747 for (p = environ; p && *p; p++)
748 if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0)
749 {
750 do
751 *p = p[1];
752 while (*++p);
753 break;
754 }
755 }
756
757 malloc_set_state (malloc_state_ptr);
758 #ifndef XMALLOC_OVERRUN_CHECK
759 free (malloc_state_ptr);
760 #endif
761 }
762 else
763 {
764 if (my_heap_start == 0)
765 my_heap_start = sbrk (0);
766 malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL;
767 }
768 }
769
770 void (*__malloc_initialize_hook) () = malloc_initialize_hook;
771
772 #endif /* DOUG_LEA_MALLOC */
773
774
775 #define REPORT_EMACS_BUG_ADDRESS "bug-gnu-emacs@gnu.org"
776 #define REPORT_EMACS_BUG_PRETEST_ADDRESS "emacs-pretest-bug@gnu.org"
777
778 /* This function is used to determine an address to which bug report should
779 be sent. */
780
781 char *
782 bug_reporting_address ()
783 {
784 int count = 0;
785 Lisp_Object temp;
786 char *string;
787
788 temp = Fsymbol_value (intern ("emacs-version"));
789
790 /* When `emacs-version' is invalid, use normal address. */
791 if (!STRINGP(temp))
792 return REPORT_EMACS_BUG_ADDRESS;
793
794 string = SDATA (temp);
795
796 /* Count dots in `emacs-version'. */
797 while (*string)
798 {
799 if (*string == '.')
800 count++;
801 string++;
802 }
803
804 /* When `emacs-version' has at least three dots, it is development or
805 pretest version of Emacs. */
806 return count >= 3 ? REPORT_EMACS_BUG_PRETEST_ADDRESS : REPORT_EMACS_BUG_ADDRESS;
807 }
808
809
810 /* ARGSUSED */
811 int
812 main (argc, argv
813 #ifdef VMS
814 , envp
815 #endif
816 )
817 int argc;
818 char **argv;
819 #ifdef VMS
820 char **envp;
821 #endif
822 {
823 #if GC_MARK_STACK
824 Lisp_Object dummy;
825 #endif
826 char stack_bottom_variable;
827 int do_initial_setlocale;
828 int skip_args = 0;
829 #ifndef USE_CRT_DLL
830 extern int errno;
831 #endif
832 #ifdef HAVE_SETRLIMIT
833 struct rlimit rlim;
834 #endif
835 int no_loadup = 0;
836 char *junk = 0;
837
838 #if GC_MARK_STACK
839 extern Lisp_Object *stack_base;
840 stack_base = &dummy;
841 #endif
842
843 if (!initialized)
844 {
845 extern char my_endbss[];
846 extern char *my_endbss_static;
847
848 if (my_heap_start == 0)
849 my_heap_start = sbrk (0);
850
851 heap_bss_diff = (char *)my_heap_start - max (my_endbss, my_endbss_static);
852 }
853
854 #ifdef LINUX_SBRK_BUG
855 __sbrk (1);
856 #endif
857
858 #ifdef RUN_TIME_REMAP
859 if (initialized)
860 run_time_remap (argv[0]);
861 #endif
862
863 #ifdef MAC_OSX
864 if (!initialized)
865 unexec_init_emacs_zone ();
866 #endif
867
868 sort_args (argc, argv);
869 argc = 0;
870 while (argv[argc]) argc++;
871
872 if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args)
873 /* We don't know the version number unless this is a dumped Emacs.
874 So ignore --version otherwise. */
875 && initialized)
876 {
877 Lisp_Object tem;
878 tem = Fsymbol_value (intern ("emacs-version"));
879 if (!STRINGP (tem))
880 {
881 fprintf (stderr, "Invalid value of `emacs-version'\n");
882 exit (1);
883 }
884 else
885 {
886 printf ("GNU Emacs %s\n", SDATA (tem));
887 printf ("Copyright (C) 2006 Free Software Foundation, Inc.\n");
888 printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
889 printf ("You may redistribute copies of Emacs\n");
890 printf ("under the terms of the GNU General Public License.\n");
891 printf ("For more information about these matters, ");
892 printf ("see the file named COPYING.\n");
893 exit (0);
894 }
895 }
896
897 #ifdef HAVE_PERSONALITY_LINUX32
898 /* See if there is a gap between the end of BSS and the heap.
899 In that case, set personality and exec ourself again. */
900 if (!initialized
901 && (strcmp (argv[argc-1], "dump") == 0
902 || strcmp (argv[argc-1], "bootstrap") == 0)
903 && heap_bss_diff > MAX_HEAP_BSS_DIFF)
904 {
905 if (! getenv ("EMACS_HEAP_EXEC"))
906 {
907 /* Set this so we only do this once. */
908 putenv("EMACS_HEAP_EXEC=true");
909
910 /* A flag to turn off address randomization which is introduced
911 in linux kernel shipped with fedora core 4 */
912 #define ADD_NO_RANDOMIZE 0x0040000
913 personality (PER_LINUX32 | ADD_NO_RANDOMIZE);
914 #undef ADD_NO_RANDOMIZE
915
916 execvp (argv[0], argv);
917
918 /* If the exec fails, try to dump anyway. */
919 perror ("execvp");
920 }
921 }
922 #endif /* HAVE_PERSONALITY_LINUX32 */
923
924
925 /* Map in shared memory, if we are using that. */
926 #ifdef HAVE_SHM
927 if (argmatch (argv, argc, "-nl", "--no-shared-memory", 6, NULL, &skip_args))
928 {
929 map_in_data (0);
930 /* The shared memory was just restored, which clobbered this. */
931 skip_args = 1;
932 }
933 else
934 {
935 map_in_data (1);
936 /* The shared memory was just restored, which clobbered this. */
937 skip_args = 0;
938 }
939 #endif
940
941 #ifdef NeXT
942 {
943 extern int malloc_cookie;
944 /* This helps out unexnext.c. */
945 if (initialized)
946 if (malloc_jumpstart (malloc_cookie) != 0)
947 printf ("malloc jumpstart failed!\n");
948 }
949 #endif /* NeXT */
950
951 #ifdef MAC_OSX
952 /* Skip process serial number passed in the form -psn_x_y as
953 command-line argument. The WindowServer adds this option when
954 Emacs is invoked from the Finder or by the `open' command. In
955 these cases, the working directory becomes `/', so we change it
956 to the user's home directory. */
957 if (argc > skip_args + 1 && strncmp (argv[skip_args+1], "-psn_", 5) == 0)
958 {
959 chdir (getenv ("HOME"));
960 skip_args++;
961 }
962 #endif /* MAC_OSX */
963
964 #ifdef VMS
965 /* If -map specified, map the data file in. */
966 {
967 char *file;
968 if (argmatch (argv, argc, "-map", "--map-data", 3, &file, &skip_args))
969 mapin_data (file);
970 }
971
972 #ifdef LINK_CRTL_SHARE
973 #ifdef SHARABLE_LIB_BUG
974 /* Bletcherous shared libraries! */
975 if (!stdin)
976 stdin = fdopen (0, "r");
977 if (!stdout)
978 stdout = fdopen (1, "w");
979 if (!stderr)
980 stderr = fdopen (2, "w");
981 if (!environ)
982 environ = envp;
983 #endif /* SHARABLE_LIB_BUG */
984 #endif /* LINK_CRTL_SHARE */
985 #endif /* VMS */
986
987 #if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
988 /* Extend the stack space available.
989 Don't do that if dumping, since some systems (e.g. DJGPP)
990 might define a smaller stack limit at that time. */
991 if (1
992 #ifndef CANNOT_DUMP
993 && (!noninteractive || initialized)
994 #endif
995 && !getrlimit (RLIMIT_STACK, &rlim))
996 {
997 long newlim;
998 extern size_t re_max_failures;
999 /* Approximate the amount regex.c needs per unit of re_max_failures. */
1000 int ratio = 20 * sizeof (char *);
1001 /* Then add 33% to cover the size of the smaller stacks that regex.c
1002 successively allocates and discards, on its way to the maximum. */
1003 ratio += ratio / 3;
1004 /* Add in some extra to cover
1005 what we're likely to use for other reasons. */
1006 newlim = re_max_failures * ratio + 200000;
1007 #ifdef __NetBSD__
1008 /* NetBSD (at least NetBSD 1.2G and former) has a bug in its
1009 stack allocation routine for new process that the allocation
1010 fails if stack limit is not on page boundary. So, round up the
1011 new limit to page boundary. */
1012 newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize();
1013 #endif
1014 if (newlim > rlim.rlim_max)
1015 {
1016 newlim = rlim.rlim_max;
1017 /* Don't let regex.c overflow the stack we have. */
1018 re_max_failures = (newlim - 200000) / ratio;
1019 }
1020 if (rlim.rlim_cur < newlim)
1021 rlim.rlim_cur = newlim;
1022
1023 setrlimit (RLIMIT_STACK, &rlim);
1024 }
1025 #endif /* HAVE_SETRLIMIT and RLIMIT_STACK */
1026
1027 /* Record (approximately) where the stack begins. */
1028 stack_bottom = &stack_bottom_variable;
1029
1030 #ifdef USG_SHARED_LIBRARIES
1031 if (bss_end)
1032 brk ((void *)bss_end);
1033 #endif
1034
1035 clearerr (stdin);
1036
1037 #ifndef SYSTEM_MALLOC
1038 /* Arrange to get warning messages as memory fills up. */
1039 memory_warnings (0, malloc_warning);
1040
1041 /* Call malloc at least once, to run the initial __malloc_hook.
1042 Also call realloc and free for consistency. */
1043 free (realloc (malloc (4), 4));
1044
1045 # ifndef SYNC_INPUT
1046 /* Arrange to disable interrupt input inside malloc etc. */
1047 uninterrupt_malloc ();
1048 # endif /* not SYNC_INPUT */
1049 #endif /* not SYSTEM_MALLOC */
1050
1051 #ifdef HAVE_GTK_AND_PTHREAD
1052 main_thread = pthread_self ();
1053 #endif /* HAVE_GTK_AND_PTHREAD */
1054
1055 #if defined (MSDOS) || defined (WINDOWSNT)
1056 /* We do all file input/output as binary files. When we need to translate
1057 newlines, we do that manually. */
1058 _fmode = O_BINARY;
1059 #endif /* MSDOS || WINDOWSNT */
1060
1061 #ifdef MSDOS
1062 #if __DJGPP__ >= 2
1063 if (!isatty (fileno (stdin)))
1064 setmode (fileno (stdin), O_BINARY);
1065 if (!isatty (fileno (stdout)))
1066 {
1067 fflush (stdout);
1068 setmode (fileno (stdout), O_BINARY);
1069 }
1070 #else /* not __DJGPP__ >= 2 */
1071 (stdin)->_flag &= ~_IOTEXT;
1072 (stdout)->_flag &= ~_IOTEXT;
1073 (stderr)->_flag &= ~_IOTEXT;
1074 #endif /* not __DJGPP__ >= 2 */
1075 #endif /* MSDOS */
1076
1077 #ifdef SET_EMACS_PRIORITY
1078 if (emacs_priority)
1079 nice (emacs_priority);
1080 setuid (getuid ());
1081 #endif /* SET_EMACS_PRIORITY */
1082
1083 /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
1084 The build procedure uses this while dumping, to ensure that the
1085 dumped Emacs does not have its system locale tables initialized,
1086 as that might cause screwups when the dumped Emacs starts up. */
1087 {
1088 char *lc_all = getenv ("LC_ALL");
1089 do_initial_setlocale = ! lc_all || strcmp (lc_all, "C");
1090 }
1091
1092 /* Set locale now, so that initial error messages are localized properly.
1093 fixup_locale must wait until later, since it builds strings. */
1094 if (do_initial_setlocale)
1095 setlocale (LC_ALL, "");
1096
1097 #ifdef EXTRA_INITIALIZE
1098 EXTRA_INITIALIZE;
1099 #endif
1100
1101 inhibit_window_system = 0;
1102
1103 /* Handle the -t switch, which specifies filename to use as terminal. */
1104 while (1)
1105 {
1106 char *term;
1107 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
1108 {
1109 int result;
1110 emacs_close (0);
1111 emacs_close (1);
1112 result = emacs_open (term, O_RDWR, 0);
1113 if (result < 0)
1114 {
1115 char *errstring = strerror (errno);
1116 fprintf (stderr, "%s: %s: %s\n", argv[0], term, errstring);
1117 exit (1);
1118 }
1119 dup (0);
1120 if (! isatty (0))
1121 {
1122 fprintf (stderr, "%s: %s: not a tty\n", argv[0], term);
1123 exit (1);
1124 }
1125 fprintf (stderr, "Using %s\n", term);
1126 #ifdef HAVE_WINDOW_SYSTEM
1127 inhibit_window_system = 1; /* -t => -nw */
1128 #endif
1129 }
1130 else
1131 break;
1132 }
1133
1134 /* Command line option --no-windows is deprecated and thus not mentioned
1135 in the manual and usage informations. */
1136 if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args)
1137 || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
1138 inhibit_window_system = 1;
1139
1140 /* Handle the -batch switch, which means don't do interactive display. */
1141 noninteractive = 0;
1142 if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
1143 {
1144 noninteractive = 1;
1145 Vundo_outer_limit = Qnil;
1146 }
1147 if (argmatch (argv, argc, "-script", "--script", 3, &junk, &skip_args))
1148 {
1149 noninteractive = 1; /* Set batch mode. */
1150 /* Convert --script to --scriptload, un-skip it, and sort again
1151 so that it will be handled in proper sequence. */
1152 argv[skip_args - 1] = "-scriptload";
1153 skip_args -= 2;
1154 sort_args (argc, argv);
1155 }
1156
1157 /* Handle the --help option, which gives a usage message. */
1158 if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
1159 {
1160 printf (USAGE1, argv[0], USAGE2);
1161 printf (USAGE3);
1162 printf (USAGE4, bug_reporting_address ());
1163 exit (0);
1164 }
1165
1166 if (! noninteractive)
1167 {
1168 #ifdef BSD_PGRPS
1169 if (initialized)
1170 {
1171 inherited_pgroup = EMACS_GETPGRP (0);
1172 setpgrp (0, getpid ());
1173 }
1174 #else
1175 #if defined (USG5) && defined (INTERRUPT_INPUT)
1176 setpgrp ();
1177 #endif
1178 #endif
1179 }
1180
1181 init_signals ();
1182
1183 /* Don't catch SIGHUP if dumping. */
1184 if (1
1185 #ifndef CANNOT_DUMP
1186 && initialized
1187 #endif
1188 )
1189 {
1190 sigblock (sigmask (SIGHUP));
1191 /* In --batch mode, don't catch SIGHUP if already ignored.
1192 That makes nohup work. */
1193 if (! noninteractive
1194 || signal (SIGHUP, SIG_IGN) != SIG_IGN)
1195 signal (SIGHUP, fatal_error_signal);
1196 sigunblock (sigmask (SIGHUP));
1197 }
1198
1199 if (
1200 #ifndef CANNOT_DUMP
1201 ! noninteractive || initialized
1202 #else
1203 1
1204 #endif
1205 )
1206 {
1207 /* Don't catch these signals in batch mode if dumping.
1208 On some machines, this sets static data that would make
1209 signal fail to work right when the dumped Emacs is run. */
1210 signal (SIGQUIT, fatal_error_signal);
1211 signal (SIGILL, fatal_error_signal);
1212 signal (SIGTRAP, fatal_error_signal);
1213 #ifdef SIGUSR1
1214 signal (SIGUSR1, handle_user_signal);
1215 #endif
1216 #ifdef SIGUSR2
1217 signal (SIGUSR2, handle_user_signal);
1218 #endif
1219 #ifdef SIGABRT
1220 signal (SIGABRT, fatal_error_signal);
1221 #endif
1222 #ifdef SIGHWE
1223 signal (SIGHWE, fatal_error_signal);
1224 #endif
1225 #ifdef SIGPRE
1226 signal (SIGPRE, fatal_error_signal);
1227 #endif
1228 #ifdef SIGORE
1229 signal (SIGORE, fatal_error_signal);
1230 #endif
1231 #ifdef SIGUME
1232 signal (SIGUME, fatal_error_signal);
1233 #endif
1234 #ifdef SIGDLK
1235 signal (SIGDLK, fatal_error_signal);
1236 #endif
1237 #ifdef SIGCPULIM
1238 signal (SIGCPULIM, fatal_error_signal);
1239 #endif
1240 #ifdef SIGIOT
1241 /* This is missing on some systems - OS/2, for example. */
1242 signal (SIGIOT, fatal_error_signal);
1243 #endif
1244 #ifdef SIGEMT
1245 signal (SIGEMT, fatal_error_signal);
1246 #endif
1247 signal (SIGFPE, fatal_error_signal);
1248 #ifdef SIGBUS
1249 signal (SIGBUS, fatal_error_signal);
1250 #endif
1251 signal (SIGSEGV, fatal_error_signal);
1252 #ifdef SIGSYS
1253 signal (SIGSYS, fatal_error_signal);
1254 #endif
1255 signal (SIGTERM, fatal_error_signal);
1256 #ifdef SIGXCPU
1257 signal (SIGXCPU, fatal_error_signal);
1258 #endif
1259 #ifdef SIGXFSZ
1260 signal (SIGXFSZ, fatal_error_signal);
1261 #endif /* SIGXFSZ */
1262
1263 #ifdef SIGDANGER
1264 /* This just means available memory is getting low. */
1265 signal (SIGDANGER, memory_warning_signal);
1266 #endif
1267
1268 #ifdef AIX
1269 /* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
1270 signal (SIGXCPU, fatal_error_signal);
1271 #ifndef _I386
1272 signal (SIGIOINT, fatal_error_signal);
1273 #endif
1274 signal (SIGGRANT, fatal_error_signal);
1275 signal (SIGRETRACT, fatal_error_signal);
1276 signal (SIGSOUND, fatal_error_signal);
1277 signal (SIGMSG, fatal_error_signal);
1278 #endif /* AIX */
1279 }
1280
1281 noninteractive1 = noninteractive;
1282
1283 /* Perform basic initializations (not merely interning symbols). */
1284
1285 if (!initialized)
1286 {
1287 init_alloc_once ();
1288 init_obarray ();
1289 init_eval_once ();
1290 init_charset_once ();
1291 init_coding_once ();
1292 init_syntax_once (); /* Create standard syntax table. */
1293 init_category_once (); /* Create standard category table. */
1294 /* Must be done before init_buffer. */
1295 init_casetab_once ();
1296 init_buffer_once (); /* Create buffer table and some buffers. */
1297 init_minibuf_once (); /* Create list of minibuffers. */
1298 /* Must precede init_window_once. */
1299
1300 /* Call syms_of_xfaces before init_window_once because that
1301 function creates Vterminal_frame. Termcap frames now use
1302 faces, and the face implementation uses some symbols as
1303 face names. */
1304 syms_of_xfaces ();
1305 /* Call syms_of_keyboard before init_window_once because
1306 keyboard sets up symbols that include some face names that
1307 the X support will want to use. This can happen when
1308 CANNOT_DUMP is defined. */
1309 syms_of_keyboard ();
1310
1311 #ifdef MAC_OS8
1312 /* init_window_once calls make_terminal_frame which on Mac OS
1313 creates a full-fledge output_mac type frame. This does not
1314 work correctly before syms_of_textprop, syms_of_macfns,
1315 syms_of_ccl, syms_of_fontset, syms_of_xterm, syms_of_search,
1316 syms_of_frame, mac_term_init, and init_keyboard have already
1317 been called. */
1318 syms_of_textprop ();
1319 syms_of_macfns ();
1320 syms_of_ccl ();
1321 syms_of_fontset ();
1322 syms_of_macterm ();
1323 syms_of_macmenu ();
1324 syms_of_macselect ();
1325 syms_of_data ();
1326 syms_of_search ();
1327 syms_of_frame ();
1328
1329 init_atimer ();
1330 mac_term_init (build_string ("Mac"), NULL, NULL);
1331 init_keyboard ();
1332 #endif
1333
1334 init_window_once (); /* Init the window system. */
1335 init_fileio_once (); /* Must precede any path manipulation. */
1336 #ifdef HAVE_WINDOW_SYSTEM
1337 init_fringe_once (); /* Swap bitmaps if necessary. */
1338 #endif /* HAVE_WINDOW_SYSTEM */
1339 }
1340
1341 init_alloc ();
1342
1343 if (do_initial_setlocale)
1344 {
1345 fixup_locale ();
1346 Vsystem_messages_locale = Vprevious_system_messages_locale;
1347 Vsystem_time_locale = Vprevious_system_time_locale;
1348 }
1349
1350 init_eval ();
1351 init_data ();
1352 #ifdef CLASH_DETECTION
1353 init_filelock ();
1354 #endif
1355 #ifndef MAC_OS8
1356 init_atimer ();
1357 #endif
1358 running_asynch_code = 0;
1359
1360 /* Handle --unibyte and the EMACS_UNIBYTE envvar,
1361 but not while dumping. */
1362 if (1)
1363 {
1364 int inhibit_unibyte = 0;
1365
1366 /* --multibyte overrides EMACS_UNIBYTE. */
1367 if (argmatch (argv, argc, "-no-unibyte", "--no-unibyte", 4, NULL, &skip_args)
1368 || argmatch (argv, argc, "-multibyte", "--multibyte", 4, NULL, &skip_args)
1369 /* Ignore EMACS_UNIBYTE before dumping. */
1370 || (!initialized && noninteractive))
1371 inhibit_unibyte = 1;
1372
1373 /* --unibyte requests that we set up to do everything with single-byte
1374 buffers and strings. We need to handle this before calling
1375 init_lread, init_editfns and other places that generate Lisp strings
1376 from text in the environment. */
1377 /* Actually this shouldn't be needed as of 20.4 in a generally
1378 unibyte environment. As handa says, environment values
1379 aren't now decoded; also existing buffers are now made
1380 unibyte during startup if .emacs sets unibyte. Tested with
1381 8-bit data in environment variables and /etc/passwd, setting
1382 unibyte and Latin-1 in .emacs. -- Dave Love */
1383 if (argmatch (argv, argc, "-unibyte", "--unibyte", 4, NULL, &skip_args)
1384 || argmatch (argv, argc, "-no-multibyte", "--no-multibyte", 4, NULL, &skip_args)
1385 || (getenv ("EMACS_UNIBYTE") && !inhibit_unibyte))
1386 {
1387 Lisp_Object old_log_max;
1388 Lisp_Object symbol, tail;
1389
1390 symbol = intern ("default-enable-multibyte-characters");
1391 Fset (symbol, Qnil);
1392
1393 if (initialized)
1394 {
1395 /* Erase pre-dump messages in *Messages* now so no abort. */
1396 old_log_max = Vmessage_log_max;
1397 XSETFASTINT (Vmessage_log_max, 0);
1398 message_dolog ("", 0, 1, 0);
1399 Vmessage_log_max = old_log_max;
1400 }
1401
1402 for (tail = Vbuffer_alist; CONSP (tail);
1403 tail = XCDR (tail))
1404 {
1405 Lisp_Object buffer;
1406
1407 buffer = Fcdr (XCAR (tail));
1408 /* Verify that all buffers are empty now, as they
1409 ought to be. */
1410 if (BUF_Z (XBUFFER (buffer)) > BUF_BEG (XBUFFER (buffer)))
1411 abort ();
1412 /* It is safe to do this crudely in an empty buffer. */
1413 XBUFFER (buffer)->enable_multibyte_characters = Qnil;
1414 }
1415 }
1416 }
1417
1418 no_loadup
1419 = argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
1420
1421
1422 #ifdef HAVE_X_WINDOWS
1423 /* Stupid kludge to catch command-line display spec. We can't
1424 handle this argument entirely in window system dependent code
1425 because we don't even know which window system dependent code
1426 to run until we've recognized this argument. */
1427 {
1428 char *displayname = 0;
1429 int count_before = skip_args;
1430
1431 /* Skip any number of -d options, but only use the last one. */
1432 while (1)
1433 {
1434 int count_before_this = skip_args;
1435
1436 if (argmatch (argv, argc, "-d", "--display", 3, &displayname, &skip_args))
1437 display_arg = 1;
1438 else if (argmatch (argv, argc, "-display", 0, 3, &displayname, &skip_args))
1439 display_arg = 1;
1440 else
1441 break;
1442
1443 count_before = count_before_this;
1444 }
1445
1446 /* If we have the form --display=NAME,
1447 convert it into -d name.
1448 This requires inserting a new element into argv. */
1449 if (displayname != 0 && skip_args - count_before == 1)
1450 {
1451 char **new = (char **) xmalloc (sizeof (char *) * (argc + 2));
1452 int j;
1453
1454 for (j = 0; j < count_before + 1; j++)
1455 new[j] = argv[j];
1456 new[count_before + 1] = "-d";
1457 new[count_before + 2] = displayname;
1458 for (j = count_before + 2; j <argc; j++)
1459 new[j + 1] = argv[j];
1460 argv = new;
1461 argc++;
1462 }
1463 /* Change --display to -d, when its arg is separate. */
1464 else if (displayname != 0 && skip_args > count_before
1465 && argv[count_before + 1][1] == '-')
1466 argv[count_before + 1] = "-d";
1467
1468 /* Don't actually discard this arg. */
1469 skip_args = count_before;
1470 }
1471 #endif
1472
1473 /* argmatch must not be used after here,
1474 except when bulding temacs
1475 because the -d argument has not been skipped in skip_args. */
1476
1477 #ifdef MSDOS
1478 /* Call early 'cause init_environment needs it. */
1479 init_dosfns ();
1480 /* Set defaults for several environment variables. */
1481 if (initialized)
1482 init_environment (argc, argv, skip_args);
1483 else
1484 tzset ();
1485 #endif /* MSDOS */
1486
1487 #ifdef WINDOWSNT
1488 globals_of_w32 ();
1489 /* Initialize environment from registry settings. */
1490 init_environment (argv);
1491 init_ntproc (); /* must precede init_editfns. */
1492 #endif
1493
1494 #if defined (MAC_OSX) && defined (HAVE_CARBON)
1495 if (initialized)
1496 init_mac_osx_environment ();
1497 #endif
1498
1499 /* egetenv is a pretty low-level facility, which may get called in
1500 many circumstances; it seems flimsy to put off initializing it
1501 until calling init_callproc. */
1502 set_process_environment ();
1503 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
1504 if this is not done. Do it after set_process_environment so that we
1505 don't pollute Vprocess_environment. */
1506 /* Setting LANG here will defeat the startup locale processing... */
1507 #ifdef AIX3_2
1508 putenv ("LANG=C");
1509 #endif
1510
1511 init_buffer (); /* Init default directory of main buffer. */
1512
1513 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
1514 init_cmdargs (argc, argv, skip_args); /* Must precede init_lread. */
1515
1516 if (initialized)
1517 {
1518 /* Erase any pre-dump messages in the message log, to avoid confusion. */
1519 Lisp_Object old_log_max;
1520 old_log_max = Vmessage_log_max;
1521 XSETFASTINT (Vmessage_log_max, 0);
1522 message_dolog ("", 0, 1, 0);
1523 Vmessage_log_max = old_log_max;
1524 }
1525
1526 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
1527 init_lread ();
1528
1529 /* Intern the names of all standard functions and variables;
1530 define standard keys. */
1531
1532 if (!initialized)
1533 {
1534 /* The basic levels of Lisp must come first. */
1535 /* And data must come first of all
1536 for the sake of symbols like error-message. */
1537 #ifndef MAC_OS8
1538 /* Called before init_window_once for Mac OS Classic. */
1539 syms_of_data ();
1540 #endif
1541 syms_of_alloc ();
1542 syms_of_lread ();
1543 syms_of_print ();
1544 syms_of_eval ();
1545 syms_of_fns ();
1546 syms_of_floatfns ();
1547
1548 syms_of_abbrev ();
1549 syms_of_buffer ();
1550 syms_of_bytecode ();
1551 syms_of_callint ();
1552 syms_of_casefiddle ();
1553 syms_of_casetab ();
1554 syms_of_callproc ();
1555 syms_of_category ();
1556 #ifndef MAC_OS8
1557 /* Called before init_window_once for Mac OS Classic. */
1558 syms_of_ccl ();
1559 #endif
1560 syms_of_charset ();
1561 syms_of_cmds ();
1562 #ifndef NO_DIR_LIBRARY
1563 syms_of_dired ();
1564 #endif /* not NO_DIR_LIBRARY */
1565 syms_of_display ();
1566 syms_of_doc ();
1567 syms_of_editfns ();
1568 syms_of_emacs ();
1569 syms_of_fileio ();
1570 syms_of_coding (); /* This should be after syms_of_fileio. */
1571 #ifdef CLASH_DETECTION
1572 syms_of_filelock ();
1573 #endif /* CLASH_DETECTION */
1574 syms_of_indent ();
1575 syms_of_insdel ();
1576 syms_of_keymap ();
1577 syms_of_macros ();
1578 syms_of_marker ();
1579 syms_of_minibuf ();
1580 syms_of_process ();
1581 #ifndef MAC_OS8
1582 /* Called before init_window_once for Mac OS Classic. */
1583 syms_of_search ();
1584 syms_of_frame ();
1585 #endif
1586 syms_of_syntax ();
1587 syms_of_term ();
1588 syms_of_undo ();
1589 #ifdef HAVE_SOUND
1590 syms_of_sound ();
1591 #endif
1592 #ifndef MAC_OS8
1593 /* Called before init_window_once for Mac OS Classic. */
1594 syms_of_textprop ();
1595 #endif
1596 syms_of_composite ();
1597 #ifdef VMS
1598 syms_of_vmsproc ();
1599 #endif /* VMS */
1600 #ifdef WINDOWSNT
1601 syms_of_ntproc ();
1602 #endif /* WINDOWSNT */
1603 syms_of_window ();
1604 syms_of_xdisp ();
1605 #ifdef HAVE_WINDOW_SYSTEM
1606 syms_of_fringe ();
1607 syms_of_image ();
1608 #endif /* HAVE_WINDOW_SYSTEM */
1609 #ifdef HAVE_X_WINDOWS
1610 syms_of_xterm ();
1611 syms_of_xfns ();
1612 syms_of_fontset ();
1613 #ifdef HAVE_X_SM
1614 syms_of_xsmfns ();
1615 #endif
1616 #ifdef HAVE_X11
1617 syms_of_xselect ();
1618 #endif
1619 #endif /* HAVE_X_WINDOWS */
1620
1621 #ifndef HAVE_NTGUI
1622 #ifndef MAC_OS
1623 /* Called before init_window_once for Mac OS Classic. */
1624 syms_of_xmenu ();
1625 #endif
1626 #endif
1627
1628 #ifdef HAVE_NTGUI
1629 syms_of_w32term ();
1630 syms_of_w32fns ();
1631 syms_of_w32select ();
1632 syms_of_w32menu ();
1633 syms_of_fontset ();
1634 #endif /* HAVE_NTGUI */
1635
1636 #if defined (MAC_OSX) && defined (HAVE_CARBON)
1637 syms_of_macterm ();
1638 syms_of_macfns ();
1639 syms_of_macmenu ();
1640 syms_of_macselect ();
1641 syms_of_fontset ();
1642 #endif /* MAC_OSX && HAVE_CARBON */
1643
1644 #ifdef SYMS_SYSTEM
1645 SYMS_SYSTEM;
1646 #endif
1647
1648 #ifdef SYMS_MACHINE
1649 SYMS_MACHINE;
1650 #endif
1651
1652 keys_of_casefiddle ();
1653 keys_of_cmds ();
1654 keys_of_buffer ();
1655 keys_of_keyboard ();
1656 keys_of_keymap ();
1657 keys_of_minibuf ();
1658 keys_of_window ();
1659 }
1660 else
1661 {
1662 /* Initialization that must be done even if the global variable
1663 initialized is non zero. */
1664 #ifdef HAVE_NTGUI
1665 globals_of_w32fns ();
1666 globals_of_w32menu ();
1667 globals_of_w32select ();
1668 #endif /* HAVE_NTGUI */
1669 }
1670
1671 if (!noninteractive)
1672 {
1673 #ifdef VMS
1674 init_vms_input ();/* init_display calls get_frame_size, that needs this. */
1675 #endif /* VMS */
1676 init_display (); /* Determine terminal type. init_sys_modes uses results. */
1677 }
1678 #ifndef MAC_OS8
1679 /* Called before init_window_once for Mac OS Classic. */
1680 init_keyboard (); /* This too must precede init_sys_modes. */
1681 #endif
1682 #ifdef VMS
1683 init_vmsproc (); /* And this too. */
1684 #endif /* VMS */
1685 init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.). */
1686 init_fns ();
1687 init_xdisp ();
1688 #ifdef HAVE_WINDOW_SYSTEM
1689 init_fringe ();
1690 init_image ();
1691 #endif /* HAVE_WINDOW_SYSTEM */
1692 init_macros ();
1693 init_editfns ();
1694 init_floatfns ();
1695 #ifdef VMS
1696 init_vmsfns ();
1697 #endif /* VMS */
1698 init_process ();
1699 #ifdef HAVE_SOUND
1700 init_sound ();
1701 #endif
1702 init_window ();
1703
1704 if (!initialized)
1705 {
1706 char *file;
1707 /* Handle -l loadup, args passed by Makefile. */
1708 if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
1709 Vtop_level = Fcons (intern ("load"),
1710 Fcons (build_string (file), Qnil));
1711 /* Unless next switch is -nl, load "loadup.el" first thing. */
1712 if (! no_loadup)
1713 Vtop_level = Fcons (intern ("load"),
1714 Fcons (build_string ("loadup.el"), Qnil));
1715 }
1716
1717 if (initialized)
1718 {
1719 #ifdef HAVE_TZSET
1720 {
1721 /* If the execution TZ happens to be the same as the dump TZ,
1722 change it to some other value and then change it back,
1723 to force the underlying implementation to reload the TZ info.
1724 This is needed on implementations that load TZ info from files,
1725 since the TZ file contents may differ between dump and execution. */
1726 char *tz = getenv ("TZ");
1727 if (tz && !strcmp (tz, dump_tz))
1728 {
1729 ++*tz;
1730 tzset ();
1731 --*tz;
1732 }
1733 }
1734 #endif
1735 }
1736
1737 /* Set up for profiling. This is known to work on FreeBSD,
1738 GNU/Linux and MinGW. It might work on some other systems too.
1739 Give it a try and tell us if it works on your system. To compile
1740 for profiling use something like:
1741 `make CFLAGS="-pg -g -O -DPROFILING=1'. */
1742 #if defined (__FreeBSD__) || defined (GNU_LINUX) || defined(__MINGW32__)
1743 #ifdef PROFILING
1744 if (initialized)
1745 {
1746 extern void _mcleanup ();
1747 #ifdef __MINGW32__
1748 extern unsigned char etext asm ("etext");
1749 #else
1750 extern char etext;
1751 #endif
1752 extern void safe_bcopy ();
1753 extern void dump_opcode_frequencies ();
1754
1755 atexit (_mcleanup);
1756 /* This uses safe_bcopy because that function comes first in the
1757 Emacs executable. It might be better to use something that
1758 gives the start of the text segment, but start_of_text is not
1759 defined on all systems now. */
1760 monstartup (safe_bcopy, &etext);
1761 }
1762 else
1763 moncontrol (0);
1764 #endif
1765 #endif
1766
1767 initialized = 1;
1768
1769 #ifdef LOCALTIME_CACHE
1770 /* Some versions of localtime have a bug. They cache the value of the time
1771 zone rather than looking it up every time. Since localtime() is
1772 called to bolt the undumping time into the undumped emacs, this
1773 results in localtime ignoring the TZ environment variable.
1774 This flushes the new TZ value into localtime. */
1775 tzset ();
1776 #endif /* defined (LOCALTIME_CACHE) */
1777
1778 /* Enter editor command loop. This never returns. */
1779 Frecursive_edit ();
1780 /* NOTREACHED */
1781 return 0;
1782 }
1783 \f
1784 /* Sort the args so we can find the most important ones
1785 at the beginning of argv. */
1786
1787 /* First, here's a table of all the standard options. */
1788
1789 struct standard_args
1790 {
1791 char *name;
1792 char *longname;
1793 int priority;
1794 int nargs;
1795 };
1796
1797 struct standard_args standard_args[] =
1798 {
1799 { "-version", "--version", 150, 0 },
1800 #ifdef HAVE_SHM
1801 { "-nl", "--no-shared-memory", 140, 0 },
1802 #endif
1803 #ifdef VMS
1804 { "-map", "--map-data", 130, 0 },
1805 #endif
1806 { "-t", "--terminal", 120, 1 },
1807 { "-nw", "--no-window-system", 110, 0 },
1808 { "-nw", "--no-windows", 110, 0 },
1809 { "-batch", "--batch", 100, 0 },
1810 { "-script", "--script", 100, 1 },
1811 { "-help", "--help", 90, 0 },
1812 { "-no-unibyte", "--no-unibyte", 83, 0 },
1813 { "-multibyte", "--multibyte", 82, 0 },
1814 { "-unibyte", "--unibyte", 81, 0 },
1815 { "-no-multibyte", "--no-multibyte", 80, 0 },
1816 { "-nl", "--no-loadup", 70, 0 },
1817 /* -d must come last before the options handled in startup.el. */
1818 { "-d", "--display", 60, 1 },
1819 { "-display", 0, 60, 1 },
1820 /* Now for the options handled in startup.el. */
1821 { "-Q", "--quick", 55, 0 },
1822 { "-quick", 0, 55, 0 },
1823 { "-q", "--no-init-file", 50, 0 },
1824 { "-no-init-file", 0, 50, 0 },
1825 { "-no-site-file", "--no-site-file", 40, 0 },
1826 { "-no-splash", "--no-splash", 40, 0 },
1827 { "-u", "--user", 30, 1 },
1828 { "-user", 0, 30, 1 },
1829 { "-debug-init", "--debug-init", 20, 0 },
1830 { "-nbi", "--no-bitmap-icon", 15, 0 },
1831 { "-iconic", "--iconic", 15, 0 },
1832 { "-D", "--basic-display", 12, 0},
1833 { "-basic-display", 0, 12, 0},
1834 { "-bg", "--background-color", 10, 1 },
1835 { "-background", 0, 10, 1 },
1836 { "-fg", "--foreground-color", 10, 1 },
1837 { "-foreground", 0, 10, 1 },
1838 { "-bd", "--border-color", 10, 1 },
1839 { "-bw", "--border-width", 10, 1 },
1840 { "-ib", "--internal-border", 10, 1 },
1841 { "-ms", "--mouse-color", 10, 1 },
1842 { "-cr", "--cursor-color", 10, 1 },
1843 { "-nbc", "--no-blinking-cursor", 10, 0 },
1844 { "-fn", "--font", 10, 1 },
1845 { "-font", 0, 10, 1 },
1846 { "-fs", "--fullscreen", 10, 0 },
1847 { "-fw", "--fullwidth", 10, 0 },
1848 { "-fh", "--fullheight", 10, 0 },
1849 { "-g", "--geometry", 10, 1 },
1850 { "-geometry", 0, 10, 1 },
1851 { "-T", "--title", 10, 1 },
1852 { "-title", 0, 10, 1 },
1853 { "-name", "--name", 10, 1 },
1854 { "-xrm", "--xrm", 10, 1 },
1855 { "-r", "--reverse-video", 5, 0 },
1856 { "-rv", 0, 5, 0 },
1857 { "-reverse", 0, 5, 0 },
1858 { "-hb", "--horizontal-scroll-bars", 5, 0 },
1859 { "-vb", "--vertical-scroll-bars", 5, 0 },
1860 { "-color", "--color", 5, 0},
1861 /* These have the same priority as ordinary file name args,
1862 so they are not reordered with respect to those. */
1863 { "-L", "--directory", 0, 1 },
1864 { "-directory", 0, 0, 1 },
1865 { "-l", "--load", 0, 1 },
1866 { "-load", 0, 0, 1 },
1867 { "-scriptload", "--scriptload", 0, 1 },
1868 { "-f", "--funcall", 0, 1 },
1869 { "-funcall", 0, 0, 1 },
1870 { "-eval", "--eval", 0, 1 },
1871 { "-execute", "--execute", 0, 1 },
1872 { "-find-file", "--find-file", 0, 1 },
1873 { "-visit", "--visit", 0, 1 },
1874 { "-file", "--file", 0, 1 },
1875 { "-insert", "--insert", 0, 1 },
1876 /* This should be processed after ordinary file name args and the like. */
1877 { "-kill", "--kill", -10, 0 },
1878 };
1879
1880 /* Reorder the elements of ARGV (assumed to have ARGC elements)
1881 so that the highest priority ones come first.
1882 Do not change the order of elements of equal priority.
1883 If an option takes an argument, keep it and its argument together.
1884
1885 If an option that takes no argument appears more
1886 than once, eliminate all but one copy of it. */
1887
1888 static void
1889 sort_args (argc, argv)
1890 int argc;
1891 char **argv;
1892 {
1893 char **new = (char **) xmalloc (sizeof (char *) * argc);
1894 /* For each element of argv,
1895 the corresponding element of options is:
1896 0 for an option that takes no arguments,
1897 1 for an option that takes one argument, etc.
1898 -1 for an ordinary non-option argument. */
1899 int *options = (int *) xmalloc (sizeof (int) * argc);
1900 int *priority = (int *) xmalloc (sizeof (int) * argc);
1901 int to = 1;
1902 int incoming_used = 1;
1903 int from;
1904 int i;
1905
1906 /* Categorize all the options,
1907 and figure out which argv elts are option arguments. */
1908 for (from = 1; from < argc; from++)
1909 {
1910 options[from] = -1;
1911 priority[from] = 0;
1912 if (argv[from][0] == '-')
1913 {
1914 int match, thislen;
1915 char *equals;
1916
1917 /* If we have found "--", don't consider
1918 any more arguments as options. */
1919 if (argv[from][1] == '-' && argv[from][2] == 0)
1920 {
1921 /* Leave the "--", and everything following it, at the end. */
1922 for (; from < argc; from++)
1923 {
1924 priority[from] = -100;
1925 options[from] = -1;
1926 }
1927 break;
1928 }
1929
1930 /* Look for a match with a known old-fashioned option. */
1931 for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1932 if (!strcmp (argv[from], standard_args[i].name))
1933 {
1934 options[from] = standard_args[i].nargs;
1935 priority[from] = standard_args[i].priority;
1936 if (from + standard_args[i].nargs >= argc)
1937 fatal ("Option `%s' requires an argument\n", argv[from]);
1938 from += standard_args[i].nargs;
1939 goto done;
1940 }
1941
1942 /* Look for a match with a known long option.
1943 MATCH is -1 if no match so far, -2 if two or more matches so far,
1944 >= 0 (the table index of the match) if just one match so far. */
1945 if (argv[from][1] == '-')
1946 {
1947 match = -1;
1948 thislen = strlen (argv[from]);
1949 equals = index (argv[from], '=');
1950 if (equals != 0)
1951 thislen = equals - argv[from];
1952
1953 for (i = 0;
1954 i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1955 if (standard_args[i].longname
1956 && !strncmp (argv[from], standard_args[i].longname,
1957 thislen))
1958 {
1959 if (match == -1)
1960 match = i;
1961 else
1962 match = -2;
1963 }
1964
1965 /* If we found exactly one match, use that. */
1966 if (match >= 0)
1967 {
1968 options[from] = standard_args[match].nargs;
1969 priority[from] = standard_args[match].priority;
1970 /* If --OPTION=VALUE syntax is used,
1971 this option uses just one argv element. */
1972 if (equals != 0)
1973 options[from] = 0;
1974 if (from + options[from] >= argc)
1975 fatal ("Option `%s' requires an argument\n", argv[from]);
1976 from += options[from];
1977 }
1978 }
1979 done: ;
1980 }
1981 }
1982
1983 /* Copy the arguments, in order of decreasing priority, to NEW. */
1984 new[0] = argv[0];
1985 while (incoming_used < argc)
1986 {
1987 int best = -1;
1988 int best_priority = -9999;
1989
1990 /* Find the highest priority remaining option.
1991 If several have equal priority, take the first of them. */
1992 for (from = 1; from < argc; from++)
1993 {
1994 if (argv[from] != 0 && priority[from] > best_priority)
1995 {
1996 best_priority = priority[from];
1997 best = from;
1998 }
1999 /* Skip option arguments--they are tied to the options. */
2000 if (options[from] > 0)
2001 from += options[from];
2002 }
2003
2004 if (best < 0)
2005 abort ();
2006
2007 /* Copy the highest priority remaining option, with its args, to NEW.
2008 Unless it is a duplicate of the previous one. */
2009 if (! (options[best] == 0
2010 && ! strcmp (new[to - 1], argv[best])))
2011 {
2012 new[to++] = argv[best];
2013 for (i = 0; i < options[best]; i++)
2014 new[to++] = argv[best + i + 1];
2015 }
2016
2017 incoming_used += 1 + (options[best] > 0 ? options[best] : 0);
2018
2019 /* Clear out this option in ARGV. */
2020 argv[best] = 0;
2021 for (i = 0; i < options[best]; i++)
2022 argv[best + i + 1] = 0;
2023 }
2024
2025 /* If duplicate options were deleted, fill up extra space with null ptrs. */
2026 while (to < argc)
2027 new[to++] = 0;
2028
2029 bcopy (new, argv, sizeof (char *) * argc);
2030
2031 xfree (options);
2032 xfree (new);
2033 xfree (priority);
2034 }
2035 \f
2036 DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
2037 doc: /* Exit the Emacs job and kill it.
2038 If ARG is an integer, return ARG as the exit program code.
2039 If ARG is a string, stuff it as keyboard input.
2040
2041 The value of `kill-emacs-hook', if not void,
2042 is a list of functions (of no args),
2043 all of which are called before Emacs is actually killed. */)
2044 (arg)
2045 Lisp_Object arg;
2046 {
2047 struct gcpro gcpro1;
2048
2049 GCPRO1 (arg);
2050
2051 if (feof (stdin))
2052 arg = Qt;
2053
2054 if (!NILP (Vrun_hooks) && !noninteractive)
2055 call1 (Vrun_hooks, intern ("kill-emacs-hook"));
2056
2057 UNGCPRO;
2058
2059 /* Is it really necessary to do this deassign
2060 when we are going to exit anyway? */
2061 /* #ifdef VMS
2062 stop_vms_input ();
2063 #endif */
2064
2065 shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil);
2066
2067 /* If we have an auto-save list file,
2068 kill it because we are exiting Emacs deliberately (not crashing).
2069 Do it after shut_down_emacs, which does an auto-save. */
2070 if (STRINGP (Vauto_save_list_file_name))
2071 unlink (SDATA (Vauto_save_list_file_name));
2072
2073 exit (INTEGERP (arg) ? XINT (arg) : EXIT_SUCCESS);
2074 /* NOTREACHED */
2075 return Qnil;
2076 }
2077
2078
2079 /* Perform an orderly shutdown of Emacs. Autosave any modified
2080 buffers, kill any child processes, clean up the terminal modes (if
2081 we're in the foreground), and other stuff like that. Don't perform
2082 any redisplay; this may be called when Emacs is shutting down in
2083 the background, or after its X connection has died.
2084
2085 If SIG is a signal number, print a message for it.
2086
2087 This is called by fatal signal handlers, X protocol error handlers,
2088 and Fkill_emacs. */
2089
2090 void
2091 shut_down_emacs (sig, no_x, stuff)
2092 int sig, no_x;
2093 Lisp_Object stuff;
2094 {
2095 /* Prevent running of hooks from now on. */
2096 Vrun_hooks = Qnil;
2097
2098 /* Don't update display from now on. */
2099 Vinhibit_redisplay = Qt;
2100
2101 /* If we are controlling the terminal, reset terminal modes. */
2102 #ifdef EMACS_HAVE_TTY_PGRP
2103 {
2104 int pgrp = EMACS_GETPGRP (0);
2105
2106 int tpgrp;
2107 if (EMACS_GET_TTY_PGRP (0, &tpgrp) != -1
2108 && tpgrp == pgrp)
2109 {
2110 fflush (stdout);
2111 reset_sys_modes ();
2112 if (sig && sig != SIGTERM)
2113 fprintf (stderr, "Fatal error (%d)", sig);
2114 }
2115 }
2116 #else
2117 fflush (stdout);
2118 reset_sys_modes ();
2119 #endif
2120
2121 stuff_buffered_input (stuff);
2122
2123 #ifdef subprocesses
2124 inhibit_sentinels = 1;
2125 #endif
2126 kill_buffer_processes (Qnil);
2127 Fdo_auto_save (Qt, Qnil);
2128
2129 #ifdef CLASH_DETECTION
2130 unlock_all_files ();
2131 #endif
2132
2133 #ifdef VMS
2134 kill_vms_processes ();
2135 #endif
2136
2137 #if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
2138 #ifdef HAVE_X_WINDOWS
2139 /* It's not safe to call intern here. Maybe we are crashing. */
2140 if (!noninteractive && SYMBOLP (Vwindow_system)
2141 && SCHARS (SYMBOL_NAME (Vwindow_system)) == 1
2142 && SREF (SYMBOL_NAME (Vwindow_system), 0) == 'x'
2143 && ! no_x)
2144 Fx_close_current_connection ();
2145 #endif /* HAVE_X_WINDOWS */
2146 #endif
2147
2148 #ifdef SIGIO
2149 /* There is a tendency for a SIGIO signal to arrive within exit,
2150 and cause a SIGHUP because the input descriptor is already closed. */
2151 unrequest_sigio ();
2152 signal (SIGIO, SIG_IGN);
2153 #endif
2154
2155 #ifdef WINDOWSNT
2156 term_ntproc ();
2157 #endif
2158
2159 /* Do this only if terminating normally, we want glyph matrices
2160 etc. in a core dump. */
2161 if (sig == 0 || sig == SIGTERM)
2162 {
2163 check_glyph_memory ();
2164 check_message_stack ();
2165 }
2166
2167 #ifdef MSDOS
2168 dos_cleanup ();
2169 #endif
2170 }
2171
2172
2173 \f
2174 #ifndef CANNOT_DUMP
2175
2176 #ifdef HAVE_SHM
2177
2178 DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0,
2179 doc: /* Dump current state of Emacs into data file FILENAME.
2180 This function exists on systems that use HAVE_SHM. */)
2181 (filename)
2182 Lisp_Object filename;
2183 {
2184 extern char my_edata[];
2185 Lisp_Object tem;
2186
2187 check_pure_size ();
2188 CHECK_STRING (filename);
2189 filename = Fexpand_file_name (filename, Qnil);
2190
2191 tem = Vpurify_flag;
2192 Vpurify_flag = Qnil;
2193
2194 fflush (stdout);
2195 /* Tell malloc where start of impure now is. */
2196 /* Also arrange for warnings when nearly out of space. */
2197 #ifndef SYSTEM_MALLOC
2198 memory_warnings (my_edata, malloc_warning);
2199 #endif
2200 map_out_data (SDATA (filename));
2201
2202 Vpurify_flag = tem;
2203
2204 return Qnil;
2205 }
2206
2207 #else /* not HAVE_SHM */
2208
2209 DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
2210 doc: /* Dump current state of Emacs into executable file FILENAME.
2211 Take symbols from SYMFILE (presumably the file you executed to run Emacs).
2212 This is used in the file `loadup.el' when building Emacs.
2213
2214 You must run Emacs in batch mode in order to dump it. */)
2215 (filename, symfile)
2216 Lisp_Object filename, symfile;
2217 {
2218 extern char my_edata[];
2219 Lisp_Object tem;
2220 Lisp_Object symbol;
2221 int count = SPECPDL_INDEX ();
2222
2223 check_pure_size ();
2224
2225 if (! noninteractive)
2226 error ("Dumping Emacs works only in batch mode");
2227
2228 #ifdef GNU_LINUX
2229 if (heap_bss_diff > MAX_HEAP_BSS_DIFF)
2230 {
2231 fprintf (stderr, "**************************************************\n");
2232 fprintf (stderr, "Warning: Your system has a gap between BSS and the\n");
2233 fprintf (stderr, "heap (%lu byte). This usually means that exec-shield\n",
2234 heap_bss_diff);
2235 fprintf (stderr, "or something similar is in effect. The dump may\n");
2236 fprintf (stderr, "fail because of this. See the section about \n");
2237 fprintf (stderr, "exec-shield in etc/PROBLEMS for more information.\n");
2238 fprintf (stderr, "**************************************************\n");
2239 }
2240 #endif /* GNU_LINUX */
2241
2242 /* Bind `command-line-processed' to nil before dumping,
2243 so that the dumped Emacs will process its command line
2244 and set up to work with X windows if appropriate. */
2245 symbol = intern ("command-line-processed");
2246 specbind (symbol, Qnil);
2247
2248 CHECK_STRING (filename);
2249 filename = Fexpand_file_name (filename, Qnil);
2250 if (!NILP (symfile))
2251 {
2252 CHECK_STRING (symfile);
2253 if (SCHARS (symfile))
2254 symfile = Fexpand_file_name (symfile, Qnil);
2255 }
2256
2257 tem = Vpurify_flag;
2258 Vpurify_flag = Qnil;
2259
2260 #ifdef HAVE_TZSET
2261 set_time_zone_rule (dump_tz);
2262 #ifndef LOCALTIME_CACHE
2263 /* Force a tz reload, since set_time_zone_rule doesn't. */
2264 tzset ();
2265 #endif
2266 #endif
2267
2268 fflush (stdout);
2269 #ifdef VMS
2270 mapout_data (SDATA (filename));
2271 #else
2272 /* Tell malloc where start of impure now is. */
2273 /* Also arrange for warnings when nearly out of space. */
2274 #ifndef SYSTEM_MALLOC
2275 #ifndef WINDOWSNT
2276 /* On Windows, this was done before dumping, and that once suffices.
2277 Meanwhile, my_edata is not valid on Windows. */
2278 memory_warnings (my_edata, malloc_warning);
2279 #endif /* not WINDOWSNT */
2280 #endif
2281 #if !defined (SYSTEM_MALLOC) && defined (HAVE_GTK_AND_PTHREAD) && !defined SYNC_INPUT
2282 /* Pthread may call malloc before main, and then we will get an endless
2283 loop, because pthread_self (see alloc.c) calls malloc the first time
2284 it is called on some systems. */
2285 reset_malloc_hooks ();
2286 #endif
2287 #ifdef DOUG_LEA_MALLOC
2288 malloc_state_ptr = malloc_get_state ();
2289 #endif
2290
2291 #ifdef USE_MMAP_FOR_BUFFERS
2292 mmap_set_vars (0);
2293 #endif
2294 unexec (SDATA (filename),
2295 !NILP (symfile) ? SDATA (symfile) : 0, my_edata, 0, 0);
2296 #ifdef USE_MMAP_FOR_BUFFERS
2297 mmap_set_vars (1);
2298 #endif
2299 #ifdef DOUG_LEA_MALLOC
2300 free (malloc_state_ptr);
2301 #endif
2302 #endif /* not VMS */
2303
2304 Vpurify_flag = tem;
2305
2306 return unbind_to (count, Qnil);
2307 }
2308
2309 #endif /* not HAVE_SHM */
2310
2311 #endif /* not CANNOT_DUMP */
2312 \f
2313 #if HAVE_SETLOCALE
2314 /* Recover from setlocale (LC_ALL, ""). */
2315 void
2316 fixup_locale ()
2317 {
2318 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
2319 so that numbers are read and printed properly for Emacs Lisp. */
2320 setlocale (LC_NUMERIC, "C");
2321 }
2322
2323 /* Set system locale CATEGORY, with previous locale *PLOCALE, to
2324 DESIRED_LOCALE. */
2325 static void
2326 synchronize_locale (category, plocale, desired_locale)
2327 int category;
2328 Lisp_Object *plocale;
2329 Lisp_Object desired_locale;
2330 {
2331 if (! EQ (*plocale, desired_locale))
2332 {
2333 *plocale = desired_locale;
2334 setlocale (category, (STRINGP (desired_locale)
2335 ? (char *) SDATA (desired_locale)
2336 : ""));
2337 }
2338 }
2339
2340 /* Set system time locale to match Vsystem_time_locale, if possible. */
2341 void
2342 synchronize_system_time_locale ()
2343 {
2344 synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
2345 Vsystem_time_locale);
2346 }
2347
2348 /* Set system messages locale to match Vsystem_messages_locale, if
2349 possible. */
2350 void
2351 synchronize_system_messages_locale ()
2352 {
2353 #ifdef LC_MESSAGES
2354 synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
2355 Vsystem_messages_locale);
2356 #endif
2357 }
2358 #endif /* HAVE_SETLOCALE */
2359 \f
2360 #ifndef SEPCHAR
2361 #define SEPCHAR ':'
2362 #endif
2363
2364 Lisp_Object
2365 decode_env_path (evarname, defalt)
2366 char *evarname, *defalt;
2367 {
2368 register char *path, *p;
2369 Lisp_Object lpath, element, tem;
2370
2371 /* It's okay to use getenv here, because this function is only used
2372 to initialize variables when Emacs starts up, and isn't called
2373 after that. */
2374 if (evarname != 0)
2375 path = (char *) getenv (evarname);
2376 else
2377 path = 0;
2378 if (!path)
2379 path = defalt;
2380 #ifdef DOS_NT
2381 /* Ensure values from the environment use the proper directory separator. */
2382 if (path)
2383 {
2384 p = alloca (strlen (path) + 1);
2385 strcpy (p, path);
2386 path = p;
2387
2388 if ('/' == DIRECTORY_SEP)
2389 dostounix_filename (path);
2390 else
2391 unixtodos_filename (path);
2392 }
2393 #endif
2394 lpath = Qnil;
2395 while (1)
2396 {
2397 p = index (path, SEPCHAR);
2398 if (!p) p = path + strlen (path);
2399 element = (p - path ? make_string (path, p - path)
2400 : build_string ("."));
2401
2402 /* Add /: to the front of the name
2403 if it would otherwise be treated as magic. */
2404 tem = Ffind_file_name_handler (element, Qt);
2405
2406 /* However, if the handler says "I'm safe",
2407 don't bother adding /:. */
2408 if (SYMBOLP (tem))
2409 {
2410 Lisp_Object prop;
2411 prop = Fget (tem, intern ("safe-magic"));
2412 if (! NILP (prop))
2413 tem = Qnil;
2414 }
2415
2416 if (! NILP (tem))
2417 element = concat2 (build_string ("/:"), element);
2418
2419 lpath = Fcons (element, lpath);
2420 if (*p)
2421 path = p + 1;
2422 else
2423 break;
2424 }
2425 return Fnreverse (lpath);
2426 }
2427
2428 void
2429 syms_of_emacs ()
2430 {
2431 Qfile_name_handler_alist = intern ("file-name-handler-alist");
2432 staticpro (&Qfile_name_handler_alist);
2433
2434 #ifndef CANNOT_DUMP
2435 #ifdef HAVE_SHM
2436 defsubr (&Sdump_emacs_data);
2437 #else
2438 defsubr (&Sdump_emacs);
2439 #endif
2440 #endif
2441
2442 defsubr (&Skill_emacs);
2443
2444 defsubr (&Sinvocation_name);
2445 defsubr (&Sinvocation_directory);
2446
2447 DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
2448 doc: /* Args passed by shell to Emacs, as a list of strings.
2449 Many arguments are deleted from the list as they are processed. */);
2450
2451 DEFVAR_LISP ("system-type", &Vsystem_type,
2452 doc: /* Value is symbol indicating type of operating system you are using.
2453 Special values:
2454 `gnu/linux' compiled for a GNU/Linux system.
2455 `darwin' compiled for Darwin (GNU-Darwin, Mac OS X, ...).
2456 `macos' compiled for Mac OS 9.
2457 `ms-dos' compiled as an MS-DOS application.
2458 `windows-nt' compiled as a native W32 application.
2459 `cygwin' compiled using the Cygwin library.
2460 `vax-vms' or
2461 `axp-vms' compiled for a (Open)VMS system.
2462 Anything else indicates some sort of Unix system. */);
2463 Vsystem_type = intern (SYSTEM_TYPE);
2464
2465 DEFVAR_LISP ("system-configuration", &Vsystem_configuration,
2466 doc: /* Value is string indicating configuration Emacs was built for.
2467 On MS-Windows, the value reflects the OS flavor and version on which
2468 Emacs is running. */);
2469 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
2470
2471 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options,
2472 doc: /* String containing the configuration options Emacs was built with. */);
2473 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2474
2475 DEFVAR_BOOL ("noninteractive", &noninteractive1,
2476 doc: /* Non-nil means Emacs is running without interactive terminal. */);
2477
2478 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
2479 doc: /* Hook to be run when kill-emacs is called.
2480 Since `kill-emacs' may be invoked when the terminal is disconnected (or
2481 in other similar situations), functions placed on this hook should not
2482 expect to be able to interact with the user. To ask for confirmation,
2483 see `kill-emacs-query-functions' instead.
2484
2485 The hook is not run in batch mode, i.e., if `noninteractive' is non-nil. */);
2486 Vkill_emacs_hook = Qnil;
2487
2488 empty_string = build_string ("");
2489 staticpro (&empty_string);
2490
2491 DEFVAR_INT ("emacs-priority", &emacs_priority,
2492 doc: /* Priority for Emacs to run at.
2493 This value is effective only if set before Emacs is dumped,
2494 and only if the Emacs executable is installed with setuid to permit
2495 it to change priority. (Emacs sets its uid back to the real uid.)
2496 Currently, you need to define SET_EMACS_PRIORITY in `config.h'
2497 before you compile Emacs, to enable the code for this feature. */);
2498 emacs_priority = 0;
2499
2500 DEFVAR_LISP ("path-separator", &Vpath_separator,
2501 doc: /* The directory separator in search paths, as a string. */);
2502 {
2503 char c = SEPCHAR;
2504 Vpath_separator = make_string (&c, 1);
2505 }
2506
2507 DEFVAR_LISP ("invocation-name", &Vinvocation_name,
2508 doc: /* The program name that was used to run Emacs.
2509 Any directory names are omitted. */);
2510
2511 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory,
2512 doc: /* The directory in which the Emacs executable was found, to run it.
2513 The value is nil if that directory's name is not known. */);
2514
2515 DEFVAR_LISP ("installation-directory", &Vinstallation_directory,
2516 doc: /* A directory within which to look for the `lib-src' and `etc' directories.
2517 This is non-nil when we can't find those directories in their standard
2518 installed locations, but we can find them
2519 near where the Emacs executable was found. */);
2520 Vinstallation_directory = Qnil;
2521
2522 DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale,
2523 doc: /* System locale for messages. */);
2524 Vsystem_messages_locale = Qnil;
2525
2526 DEFVAR_LISP ("previous-system-messages-locale",
2527 &Vprevious_system_messages_locale,
2528 doc: /* Most recently used system locale for messages. */);
2529 Vprevious_system_messages_locale = Qnil;
2530
2531 DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale,
2532 doc: /* System locale for time. */);
2533 Vsystem_time_locale = Qnil;
2534
2535 DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale,
2536 doc: /* Most recently used system locale for time. */);
2537 Vprevious_system_time_locale = Qnil;
2538 }
2539
2540 /* arch-tag: 7bfd356a-c720-4612-8ab6-aa4222931c2e
2541 (do not change this comment) */