*** empty log message ***
[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, 2001,
3 2002, 2003, 2004, 2005 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., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, 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
116 /* Command line args from shell, as list of strings. */
117 Lisp_Object Vcommand_line_args;
118
119 /* The name under which Emacs was invoked, with any leading directory
120 names discarded. */
121 Lisp_Object Vinvocation_name;
122
123 /* The directory name from which Emacs was invoked. */
124 Lisp_Object Vinvocation_directory;
125
126 /* The directory name in which to find subdirs such as lisp and etc.
127 nil means get them only from PATH_LOADSEARCH. */
128 Lisp_Object Vinstallation_directory;
129
130 /* Hook run by `kill-emacs' before it does really anything. */
131 Lisp_Object Vkill_emacs_hook;
132
133 /* An empty lisp string. To avoid having to build any other. */
134 Lisp_Object empty_string;
135
136 /* Search path separator. */
137 Lisp_Object Vpath_separator;
138
139 /* Set nonzero after Emacs has started up the first time.
140 Prevents reinitialization of the Lisp world and keymaps
141 on subsequent starts. */
142 int initialized;
143
144 #ifdef DOUG_LEA_MALLOC
145 /* Preserves a pointer to the memory allocated that copies that
146 static data inside glibc's malloc. */
147 void *malloc_state_ptr;
148 /* From glibc, a routine that returns a copy of the malloc internal state. */
149 extern void *malloc_get_state ();
150 /* From glibc, a routine that overwrites the malloc internal state. */
151 extern void malloc_set_state ();
152 /* Non-zero if the MALLOC_CHECK_ enviroment variable was set while
153 dumping. Used to work around a bug in glibc's malloc. */
154 int malloc_using_checking;
155 #endif
156
157 /* Variable whose value is symbol giving operating system type. */
158 Lisp_Object Vsystem_type;
159
160 /* Variable whose value is string giving configuration built for. */
161 Lisp_Object Vsystem_configuration;
162
163 /* Variable whose value is string giving configuration options,
164 for use when reporting bugs. */
165 Lisp_Object Vsystem_configuration_options;
166
167 Lisp_Object Qfile_name_handler_alist;
168
169 /* Current and previous system locales for messages and time. */
170 Lisp_Object Vsystem_messages_locale;
171 Lisp_Object Vprevious_system_messages_locale;
172 Lisp_Object Vsystem_time_locale;
173 Lisp_Object Vprevious_system_time_locale;
174
175 /* If non-zero, emacs should not attempt to use a window-specific code,
176 but instead should use the virtual terminal under which it was started. */
177 int inhibit_window_system;
178
179 /* If nonzero, set Emacs to run at this priority. This is also used
180 in child_setup and sys_suspend to make sure subshells run at normal
181 priority; those functions have their own extern declaration. */
182 EMACS_INT emacs_priority;
183
184 /* If non-zero, a filter or a sentinel is running. Tested to save the match
185 data on the first attempt to change it inside asynchronous code. */
186 int running_asynch_code;
187
188 #ifdef BSD_PGRPS
189 /* See sysdep.c. */
190 extern int inherited_pgroup;
191 #endif
192
193 #ifdef HAVE_X_WINDOWS
194 /* If non-zero, -d was specified, meaning we're using some window system. */
195 int display_arg;
196 #endif
197
198 /* An address near the bottom of the stack.
199 Tells GC how to save a copy of the stack. */
200 char *stack_bottom;
201
202 /* The address where the heap starts (from the first sbrk (0) call). */
203 static void *my_heap_start;
204
205 /* The gap between BSS end and heap start as far as we can tell. */
206 static unsigned long heap_bss_diff;
207
208 /* If the gap between BSS end and heap start is larger than this we try to
209 work around it, and if that fails, output a warning in dump-emacs. */
210 #define MAX_HEAP_BSS_DIFF (1024*1024)
211
212
213 #ifdef HAVE_WINDOW_SYSTEM
214 extern Lisp_Object Vwindow_system;
215 #endif /* HAVE_WINDOW_SYSTEM */
216
217 extern Lisp_Object Vauto_save_list_file_name;
218
219 extern Lisp_Object Vinhibit_redisplay;
220
221 #ifdef USG_SHARED_LIBRARIES
222 /* If nonzero, this is the place to put the end of the writable segment
223 at startup. */
224
225 unsigned int bss_end = 0;
226 #endif
227
228 /* Nonzero means running Emacs without interactive terminal. */
229
230 int noninteractive;
231
232 /* Value of Lisp variable `noninteractive'.
233 Normally same as C variable `noninteractive'
234 but nothing terrible happens if user sets this one. */
235
236 int noninteractive1;
237
238 /* Save argv and argc. */
239 char **initial_argv;
240 int initial_argc;
241
242 static void sort_args ();
243 void syms_of_emacs ();
244
245 /* MSVC needs each string be shorter than 2048 bytes, so the usage
246 strings below are split to not overflow this limit. */
247 #define USAGE1 "\
248 Usage: %s [OPTION-OR-FILENAME]...\n\
249 \n\
250 Run Emacs, the extensible, customizable, self-documenting real-time\n\
251 display editor. The recommended way to start Emacs for normal editing\n\
252 is with no options at all.\n\
253 \n\
254 Run M-x info RET m emacs RET m emacs invocation RET inside Emacs to\n\
255 read the main documentation for these command-line arguments.\n\
256 \n\
257 Initialization options:\n\
258 \n\
259 --batch do not do interactive display; implies -q\n\
260 --debug-init enable Emacs Lisp debugger for init file\n\
261 --display, -d DISPLAY use X server DISPLAY\n\
262 --multibyte, --no-unibyte inhibit the effect of EMACS_UNIBYTE\n\
263 --no-desktop do not load a saved desktop\n\
264 --no-init-file, -q load neither ~/.emacs nor default.el\n\
265 --no-shared-memory, -nl do not use shared memory\n\
266 --no-site-file do not load site-start.el\n\
267 --no-splash do not display a splash screen on startup\n\
268 --no-window-system, -nw do not communicate with X, ignoring $DISPLAY\n\
269 --quick, -Q equivalent to -q --no-site-file\n\
270 --script FILE run FILE as an Emacs Lisp script\n\
271 --terminal, -t DEVICE use DEVICE for terminal I/O\n\
272 --unibyte, --no-multibyte run Emacs in unibyte mode\n\
273 --user, -u USER load ~USER/.emacs instead of your own\n\
274 \n%s"
275
276 #define USAGE2 "\
277 Action options:\n\
278 \n\
279 FILE visit FILE using find-file\n\
280 +LINE FILE visit FILE using find-file, then go to line LINE\n\
281 +LINE:COLUMN FILE visit FILE using find-file, then go to line LINE,\n\
282 column COLUMN\n\
283 --directory, -L DIR add DIR to variable load-path\n\
284 --eval EXPR evaluate Emacs Lisp expression EXPR\n\
285 --execute EXPR evaluate Emacs Lisp expression EXPR\n\
286 --file FILE visit FILE using find-file\n\
287 --find-file FILE visit FILE using find-file\n\
288 --funcall, -f FUNC call Emacs Lisp function FUNC with no arguments\n\
289 --insert FILE insert contents of FILE into current buffer\n\
290 --kill exit without asking for confirmation\n\
291 --load, -l FILE load Emacs Lisp FILE using the load function\n\
292 --visit FILE visit FILE using find-file\n\
293 \n"
294
295 #define USAGE3 "\
296 Display options:\n\
297 \n\
298 --background-color, -bg COLOR window background color\n\
299 --basic-display, -D disable many display features;\n\
300 used for debugging Emacs\n\
301 --border-color, -bd COLOR main border color\n\
302 --border-width, -bw WIDTH width of main border\n\
303 --color, --color=MODE color mode for character terminals;\n\
304 MODE defaults to `auto', and can also\n\
305 be `never', `auto', `always',\n\
306 or a mode name like `ansi8'\n\
307 --cursor-color, -cr COLOR color of the Emacs cursor indicating point\n\
308 --font, -fn FONT default font; must be fixed-width\n\
309 --foreground-color, -fg COLOR window foreground color\n\
310 --fullheight, -fh make the first frame high as the screen\n\
311 --fullscreen, -fs make first frame fullscreen\n\
312 --fullwidth, -fw make the first frame wide as the screen\n\
313 --geometry, -g GEOMETRY window geometry\n\
314 --icon-type, -i use picture of gnu for Emacs icon\n\
315 --iconic start Emacs in iconified state\n\
316 --internal-border, -ib WIDTH width between text and main border\n\
317 --line-spacing, -lsp PIXELS additional space to put between lines\n\
318 --mouse-color, -ms COLOR mouse cursor color in Emacs window\n\
319 --name NAME title for initial Emacs frame\n\
320 --no-blinking-cursor, -nbc disable blinking cursor\n\
321 --reverse-video, -r, -rv switch foreground and background\n\
322 --title, -T TITLE title for initial Emacs frame\n\
323 --vertical-scroll-bars, -vb enable vertical scroll bars\n\
324 --xrm XRESOURCES set additional X resources\n\
325 --help display this help and exit\n\
326 --version output version information and exit\n\
327 \n"
328
329 #define USAGE4 "\
330 You can generally also specify long option names with a single -; for\n\
331 example, -batch as well as --batch. You can use any unambiguous\n\
332 abbreviation for a --option.\n\
333 \n\
334 Various environment variables and window system resources also affect\n\
335 Emacs' operation. See the main documentation.\n\
336 \n\
337 Report bugs to %s. First, please see the Bugs\n\
338 section of the Emacs manual or the file BUGS.\n"
339
340 \f
341 /* Signal code for the fatal signal that was received. */
342 int fatal_error_code;
343
344 /* Nonzero if handling a fatal error already. */
345 int fatal_error_in_progress;
346
347 /* If non-null, call this function from fatal_error_signal before
348 committing suicide. */
349
350 void (*fatal_error_signal_hook) P_ ((void));
351
352 #ifdef HAVE_GTK_AND_PTHREAD
353 /* When compiled with GTK and running under Gnome, multiple threads meay be
354 created. Keep track of our main thread to make sure signals are delivered
355 to it (see syssignal.h). */
356
357 pthread_t main_thread;
358 #endif
359
360
361 #ifdef SIGUSR1
362 SIGTYPE
363 handle_USR1_signal (sig)
364 int sig;
365 {
366 struct input_event buf;
367
368 SIGNAL_THREAD_CHECK (sig);
369 bzero (&buf, sizeof buf);
370 buf.kind = USER_SIGNAL_EVENT;
371 buf.frame_or_window = selected_frame;
372
373 kbd_buffer_store_event (&buf);
374 }
375 #endif /* SIGUSR1 */
376
377 #ifdef SIGUSR2
378 SIGTYPE
379 handle_USR2_signal (sig)
380 int sig;
381 {
382 struct input_event buf;
383
384 SIGNAL_THREAD_CHECK (sig);
385 bzero (&buf, sizeof buf);
386 buf.kind = USER_SIGNAL_EVENT;
387 buf.code = 1;
388 buf.frame_or_window = selected_frame;
389
390 kbd_buffer_store_event (&buf);
391 }
392 #endif /* SIGUSR2 */
393
394 /* Handle bus errors, invalid instruction, etc. */
395 SIGTYPE
396 fatal_error_signal (sig)
397 int sig;
398 {
399 SIGNAL_THREAD_CHECK (sig);
400 fatal_error_code = sig;
401 signal (sig, SIG_DFL);
402
403 TOTALLY_UNBLOCK_INPUT;
404
405 /* If fatal error occurs in code below, avoid infinite recursion. */
406 if (! fatal_error_in_progress)
407 {
408 fatal_error_in_progress = 1;
409
410 shut_down_emacs (sig, 0, Qnil);
411 }
412
413 #ifdef VMS
414 LIB$STOP (SS$_ABORT);
415 #else
416 /* Signal the same code; this time it will really be fatal.
417 Remember that since we're in a signal handler, the signal we're
418 going to send is probably blocked, so we have to unblock it if we
419 want to really receive it. */
420 #ifndef MSDOS
421 sigunblock (sigmask (fatal_error_code));
422 #endif
423
424 if (fatal_error_signal_hook)
425 fatal_error_signal_hook ();
426
427 kill (getpid (), fatal_error_code);
428 #endif /* not VMS */
429 }
430
431 #ifdef SIGDANGER
432
433 /* Handler for SIGDANGER. */
434 SIGTYPE
435 memory_warning_signal (sig)
436 int sig;
437 {
438 signal (sig, memory_warning_signal);
439 SIGNAL_THREAD_CHECK (sig);
440
441 malloc_warning ("Operating system warns that virtual memory is running low.\n");
442
443 /* It might be unsafe to call do_auto_save now. */
444 force_auto_save_soon ();
445 }
446 #endif
447
448 /* We define abort, rather than using it from the library,
449 so that GDB can return from a breakpoint here.
450 MSDOS has its own definition in msdos.c. */
451
452 #if ! defined (DOS_NT) && ! defined (NO_ABORT)
453
454 #ifndef ABORT_RETURN_TYPE
455 #define ABORT_RETURN_TYPE void
456 #endif
457
458 ABORT_RETURN_TYPE
459 abort ()
460 {
461 kill (getpid (), SIGABRT);
462 /* This shouldn't be executed, but it prevents a warning. */
463 exit (1);
464 }
465 #endif
466
467 \f
468 /* Code for dealing with Lisp access to the Unix command line. */
469
470 static void
471 init_cmdargs (argc, argv, skip_args)
472 int argc;
473 char **argv;
474 int skip_args;
475 {
476 register int i;
477 Lisp_Object name, dir, tem;
478 int count = SPECPDL_INDEX ();
479 Lisp_Object raw_name;
480
481 initial_argv = argv;
482 initial_argc = argc;
483
484 raw_name = build_string (argv[0]);
485
486 /* Add /: to the front of the name
487 if it would otherwise be treated as magic. */
488 tem = Ffind_file_name_handler (raw_name, Qt);
489 if (! NILP (tem))
490 raw_name = concat2 (build_string ("/:"), raw_name);
491
492 Vinvocation_name = Ffile_name_nondirectory (raw_name);
493 Vinvocation_directory = Ffile_name_directory (raw_name);
494
495 /* If we got no directory in argv[0], search PATH to find where
496 Emacs actually came from. */
497 if (NILP (Vinvocation_directory))
498 {
499 Lisp_Object found;
500 int yes = openp (Vexec_path, Vinvocation_name,
501 Vexec_suffixes, &found, make_number (X_OK));
502 if (yes == 1)
503 {
504 /* Add /: to the front of the name
505 if it would otherwise be treated as magic. */
506 tem = Ffind_file_name_handler (found, Qt);
507 if (! NILP (tem))
508 found = concat2 (build_string ("/:"), found);
509 Vinvocation_directory = Ffile_name_directory (found);
510 }
511 }
512
513 if (!NILP (Vinvocation_directory)
514 && NILP (Ffile_name_absolute_p (Vinvocation_directory)))
515 /* Emacs was started with relative path, like ./emacs.
516 Make it absolute. */
517 Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, Qnil);
518
519 Vinstallation_directory = Qnil;
520
521 if (!NILP (Vinvocation_directory))
522 {
523 dir = Vinvocation_directory;
524 name = Fexpand_file_name (Vinvocation_name, dir);
525 while (1)
526 {
527 Lisp_Object tem, lib_src_exists;
528 Lisp_Object etc_exists, info_exists;
529
530 /* See if dir contains subdirs for use by Emacs.
531 Check for the ones that would exist in a build directory,
532 not including lisp and info. */
533 tem = Fexpand_file_name (build_string ("lib-src"), dir);
534 lib_src_exists = Ffile_exists_p (tem);
535
536 #ifdef MSDOS
537 /* MSDOS installations frequently remove lib-src, but we still
538 must set installation-directory, or else info won't find
539 its files (it uses the value of installation-directory). */
540 tem = Fexpand_file_name (build_string ("info"), dir);
541 info_exists = Ffile_exists_p (tem);
542 #else
543 info_exists = Qnil;
544 #endif
545
546 if (!NILP (lib_src_exists) || !NILP (info_exists))
547 {
548 tem = Fexpand_file_name (build_string ("etc"), dir);
549 etc_exists = Ffile_exists_p (tem);
550 if (!NILP (etc_exists))
551 {
552 Vinstallation_directory
553 = Ffile_name_as_directory (dir);
554 break;
555 }
556 }
557
558 /* See if dir's parent contains those subdirs. */
559 tem = Fexpand_file_name (build_string ("../lib-src"), dir);
560 lib_src_exists = Ffile_exists_p (tem);
561
562
563 #ifdef MSDOS
564 /* See the MSDOS commentary above. */
565 tem = Fexpand_file_name (build_string ("../info"), dir);
566 info_exists = Ffile_exists_p (tem);
567 #else
568 info_exists = Qnil;
569 #endif
570
571 if (!NILP (lib_src_exists) || !NILP (info_exists))
572 {
573 tem = Fexpand_file_name (build_string ("../etc"), dir);
574 etc_exists = Ffile_exists_p (tem);
575 if (!NILP (etc_exists))
576 {
577 tem = Fexpand_file_name (build_string (".."), dir);
578 Vinstallation_directory
579 = Ffile_name_as_directory (tem);
580 break;
581 }
582 }
583
584 /* If the Emacs executable is actually a link,
585 next try the dir that the link points into. */
586 tem = Ffile_symlink_p (name);
587 if (!NILP (tem))
588 {
589 name = Fexpand_file_name (tem, dir);
590 dir = Ffile_name_directory (name);
591 }
592 else
593 break;
594 }
595 }
596
597 Vcommand_line_args = Qnil;
598
599 for (i = argc - 1; i >= 0; i--)
600 {
601 if (i == 0 || i > skip_args)
602 /* For the moment, we keep arguments as is in unibyte strings.
603 They are decoded in the function command-line after we know
604 locale-coding-system. */
605 Vcommand_line_args
606 = Fcons (make_unibyte_string (argv[i], strlen (argv[i])),
607 Vcommand_line_args);
608 }
609
610 unbind_to (count, Qnil);
611 }
612
613 DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
614 doc: /* Return the program name that was used to run Emacs.
615 Any directory names are omitted. */)
616 ()
617 {
618 return Fcopy_sequence (Vinvocation_name);
619 }
620
621 DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
622 0, 0, 0,
623 doc: /* Return the directory name in which the Emacs executable was located. */)
624 ()
625 {
626 return Fcopy_sequence (Vinvocation_directory);
627 }
628
629 \f
630 #ifdef VMS
631 #ifdef LINK_CRTL_SHARE
632 #ifdef SHARABLE_LIB_BUG
633 extern noshare char **environ;
634 #endif /* SHARABLE_LIB_BUG */
635 #endif /* LINK_CRTL_SHARE */
636 #endif /* VMS */
637
638 #ifdef HAVE_TZSET
639 /* A valid but unlikely value for the TZ environment value.
640 It is OK (though a bit slower) if the user actually chooses this value. */
641 static char dump_tz[] = "UtC0";
642 #endif
643
644 #ifndef ORDINARY_LINK
645 /* We don't include crtbegin.o and crtend.o in the link,
646 so these functions and variables might be missed.
647 Provide dummy definitions to avoid error.
648 (We don't have any real constructors or destructors.) */
649 #ifdef __GNUC__
650 #ifndef GCC_CTORS_IN_LIBC
651 void __do_global_ctors ()
652 {}
653 void __do_global_ctors_aux ()
654 {}
655 void __do_global_dtors ()
656 {}
657 /* GNU/Linux has a bug in its library; avoid an error. */
658 #ifndef GNU_LINUX
659 char * __CTOR_LIST__[2] = { (char *) (-1), 0 };
660 #endif
661 char * __DTOR_LIST__[2] = { (char *) (-1), 0 };
662 #endif /* GCC_CTORS_IN_LIBC */
663 void __main ()
664 {}
665 #endif /* __GNUC__ */
666 #endif /* ORDINARY_LINK */
667
668 /* Test whether the next argument in ARGV matches SSTR or a prefix of
669 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
670 (the argument is supposed to have a value) store in *VALPTR either
671 the next argument or the portion of this one after the equal sign.
672 ARGV is read starting at position *SKIPPTR; this index is advanced
673 by the number of arguments used.
674
675 Too bad we can't just use getopt for all of this, but we don't have
676 enough information to do it right. */
677
678 static int
679 argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr)
680 char **argv;
681 int argc;
682 char *sstr;
683 char *lstr;
684 int minlen;
685 char **valptr;
686 int *skipptr;
687 {
688 char *p = NULL;
689 int arglen;
690 char *arg;
691
692 /* Don't access argv[argc]; give up in advance. */
693 if (argc <= *skipptr + 1)
694 return 0;
695
696 arg = argv[*skipptr+1];
697 if (arg == NULL)
698 return 0;
699 if (strcmp (arg, sstr) == 0)
700 {
701 if (valptr != NULL)
702 {
703 *valptr = argv[*skipptr+2];
704 *skipptr += 2;
705 }
706 else
707 *skipptr += 1;
708 return 1;
709 }
710 arglen = (valptr != NULL && (p = index (arg, '=')) != NULL
711 ? p - arg : strlen (arg));
712 if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
713 return 0;
714 else if (valptr == NULL)
715 {
716 *skipptr += 1;
717 return 1;
718 }
719 else if (p != NULL)
720 {
721 *valptr = p+1;
722 *skipptr += 1;
723 return 1;
724 }
725 else if (argv[*skipptr+2] != NULL)
726 {
727 *valptr = argv[*skipptr+2];
728 *skipptr += 2;
729 return 1;
730 }
731 else
732 {
733 return 0;
734 }
735 }
736
737 #ifdef DOUG_LEA_MALLOC
738
739 /* malloc can be invoked even before main (e.g. by the dynamic
740 linker), so the dumped malloc state must be restored as early as
741 possible using this special hook. */
742
743 static void
744 malloc_initialize_hook ()
745 {
746 #ifndef USE_CRT_DLL
747 extern char **environ;
748 #endif
749
750 if (initialized)
751 {
752 if (!malloc_using_checking)
753 /* Work around a bug in glibc's malloc. MALLOC_CHECK_ must be
754 ignored if the heap to be restored was constructed without
755 malloc checking. Can't use unsetenv, since that calls malloc. */
756 {
757 char **p;
758
759 for (p = environ; p && *p; p++)
760 if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0)
761 {
762 do
763 *p = p[1];
764 while (*++p);
765 break;
766 }
767 }
768
769 malloc_set_state (malloc_state_ptr);
770 #ifndef XMALLOC_OVERRUN_CHECK
771 free (malloc_state_ptr);
772 #endif
773 }
774 else
775 {
776 if (my_heap_start == 0)
777 my_heap_start = sbrk (0);
778 malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL;
779 }
780 }
781
782 void (*__malloc_initialize_hook) () = malloc_initialize_hook;
783
784 #endif /* DOUG_LEA_MALLOC */
785
786
787 #define REPORT_EMACS_BUG_ADDRESS "bug-gnu-emacs@gnu.org"
788 #define REPORT_EMACS_BUG_PRETEST_ADDRESS "emacs-pretest-bug@gnu.org"
789
790 /* This function is used to determine an address to which bug report should
791 be sent. */
792
793 char *
794 bug_reporting_address ()
795 {
796 int count = 0;
797 Lisp_Object temp;
798 char *string;
799
800 temp = Fsymbol_value (intern ("emacs-version"));
801
802 /* When `emacs-version' is invalid, use normal address. */
803 if (!STRINGP(temp))
804 return REPORT_EMACS_BUG_ADDRESS;
805
806 string = SDATA (temp);
807
808 /* Count dots in `emacs-version'. */
809 while (*string)
810 {
811 if (*string == '.')
812 count++;
813 string++;
814 }
815
816 /* When `emacs-version' has at least three dots, it is development or
817 pretest version of Emacs. */
818 return count >= 3 ? REPORT_EMACS_BUG_PRETEST_ADDRESS : REPORT_EMACS_BUG_ADDRESS;
819 }
820
821
822 /* ARGSUSED */
823 int
824 main (argc, argv
825 #ifdef VMS
826 , envp
827 #endif
828 )
829 int argc;
830 char **argv;
831 #ifdef VMS
832 char **envp;
833 #endif
834 {
835 #if GC_MARK_STACK
836 Lisp_Object dummy;
837 #endif
838 char stack_bottom_variable;
839 int do_initial_setlocale;
840 int skip_args = 0;
841 #ifndef USE_CRT_DLL
842 extern int errno;
843 #endif
844 #ifdef HAVE_SETRLIMIT
845 struct rlimit rlim;
846 #endif
847 int no_loadup = 0;
848 char *junk = 0;
849
850 #if GC_MARK_STACK
851 extern Lisp_Object *stack_base;
852 stack_base = &dummy;
853 #endif
854
855 if (!initialized)
856 {
857 extern char my_endbss[];
858 extern char *my_endbss_static;
859
860 if (my_heap_start == 0)
861 my_heap_start = sbrk (0);
862
863 heap_bss_diff = (char *)my_heap_start - max (my_endbss, my_endbss_static);
864 }
865
866 #ifdef LINUX_SBRK_BUG
867 __sbrk (1);
868 #endif
869
870 #ifdef RUN_TIME_REMAP
871 if (initialized)
872 run_time_remap (argv[0]);
873 #endif
874
875 #ifdef MAC_OSX
876 if (!initialized)
877 unexec_init_emacs_zone ();
878 #endif
879
880 sort_args (argc, argv);
881 argc = 0;
882 while (argv[argc]) argc++;
883
884 if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args)
885 /* We don't know the version number unless this is a dumped Emacs.
886 So ignore --version otherwise. */
887 && initialized)
888 {
889 Lisp_Object tem;
890 tem = Fsymbol_value (intern ("emacs-version"));
891 if (!STRINGP (tem))
892 {
893 fprintf (stderr, "Invalid value of `emacs-version'\n");
894 exit (1);
895 }
896 else
897 {
898 printf ("GNU Emacs %s\n", SDATA (tem));
899 printf ("Copyright (C) 2004 Free Software Foundation, Inc.\n");
900 printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
901 printf ("You may redistribute copies of Emacs\n");
902 printf ("under the terms of the GNU General Public License.\n");
903 printf ("For more information about these matters, ");
904 printf ("see the file named COPYING.\n");
905 exit (0);
906 }
907 }
908
909 #ifdef HAVE_PERSONALITY_LINUX32
910 /* See if there is a gap between the end of BSS and the heap.
911 In that case, set personality and exec ourself again. */
912 if (!initialized
913 && (strcmp (argv[argc-1], "dump") == 0
914 || strcmp (argv[argc-1], "bootstrap") == 0)
915 && heap_bss_diff > MAX_HEAP_BSS_DIFF)
916 {
917 if (! getenv ("EMACS_HEAP_EXEC"))
918 {
919 /* Set this so we only do this once. */
920 putenv("EMACS_HEAP_EXEC=true");
921 personality (PER_LINUX32);
922 execvp (argv[0], argv);
923
924 /* If the exec fails, try to dump anyway. */
925 perror ("execvp");
926 }
927 }
928 #endif /* HAVE_PERSONALITY_LINUX32 */
929
930
931 /* Map in shared memory, if we are using that. */
932 #ifdef HAVE_SHM
933 if (argmatch (argv, argc, "-nl", "--no-shared-memory", 6, NULL, &skip_args))
934 {
935 map_in_data (0);
936 /* The shared memory was just restored, which clobbered this. */
937 skip_args = 1;
938 }
939 else
940 {
941 map_in_data (1);
942 /* The shared memory was just restored, which clobbered this. */
943 skip_args = 0;
944 }
945 #endif
946
947 #ifdef NeXT
948 {
949 extern int malloc_cookie;
950 /* This helps out unexnext.c. */
951 if (initialized)
952 if (malloc_jumpstart (malloc_cookie) != 0)
953 printf ("malloc jumpstart failed!\n");
954 }
955 #endif /* NeXT */
956
957 #ifdef MAC_OSX
958 /* Skip process serial number passed in the form -psn_x_y as
959 command-line argument. */
960 if (argc > skip_args + 1 && strncmp (argv[skip_args+1], "-psn_", 5) == 0)
961 skip_args++;
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 int 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 -l, un-skip it, and sort again so that -l will be
1151 handled in proper sequence. */
1152 argv[skip_args - 1] = "-l";
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_USR1_signal);
1215 #ifdef SIGUSR2
1216 signal (SIGUSR2, handle_USR2_signal);
1217 #endif
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 #ifdef HAVE_MENUS
1622 #ifndef HAVE_NTGUI
1623 #ifndef MAC_OS
1624 /* Called before init_window_once for Mac OS Classic. */
1625 syms_of_xmenu ();
1626 #endif
1627 #endif
1628 #endif
1629
1630 #ifdef HAVE_NTGUI
1631 syms_of_w32term ();
1632 syms_of_w32fns ();
1633 syms_of_w32select ();
1634 syms_of_w32menu ();
1635 syms_of_fontset ();
1636 #endif /* HAVE_NTGUI */
1637
1638 #if defined (MAC_OSX) && defined (HAVE_CARBON)
1639 syms_of_macterm ();
1640 syms_of_macfns ();
1641 syms_of_macmenu ();
1642 syms_of_macselect ();
1643 syms_of_fontset ();
1644 #endif /* MAC_OSX && HAVE_CARBON */
1645
1646 #ifdef SYMS_SYSTEM
1647 SYMS_SYSTEM;
1648 #endif
1649
1650 #ifdef SYMS_MACHINE
1651 SYMS_MACHINE;
1652 #endif
1653
1654 keys_of_casefiddle ();
1655 keys_of_cmds ();
1656 keys_of_buffer ();
1657 keys_of_keyboard ();
1658 keys_of_keymap ();
1659 keys_of_minibuf ();
1660 keys_of_window ();
1661 }
1662 else
1663 {
1664 /* Initialization that must be done even if the global variable
1665 initialized is non zero. */
1666 #ifdef HAVE_NTGUI
1667 globals_of_w32fns ();
1668 globals_of_w32menu ();
1669 globals_of_w32select ();
1670 #endif /* HAVE_NTGUI */
1671 }
1672
1673 if (!noninteractive)
1674 {
1675 #ifdef VMS
1676 init_vms_input ();/* init_display calls get_frame_size, that needs this. */
1677 #endif /* VMS */
1678 init_display (); /* Determine terminal type. init_sys_modes uses results. */
1679 }
1680 #ifndef MAC_OS8
1681 /* Called before init_window_once for Mac OS Classic. */
1682 init_keyboard (); /* This too must precede init_sys_modes. */
1683 #endif
1684 #ifdef VMS
1685 init_vmsproc (); /* And this too. */
1686 #endif /* VMS */
1687 init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.). */
1688 init_fns ();
1689 init_xdisp ();
1690 #ifdef HAVE_WINDOW_SYSTEM
1691 init_fringe ();
1692 init_image ();
1693 #endif /* HAVE_WINDOW_SYSTEM */
1694 init_macros ();
1695 init_editfns ();
1696 init_floatfns ();
1697 #ifdef VMS
1698 init_vmsfns ();
1699 #endif /* VMS */
1700 init_process ();
1701 #ifdef HAVE_SOUND
1702 init_sound ();
1703 #endif
1704 init_window ();
1705
1706 if (!initialized)
1707 {
1708 char *file;
1709 /* Handle -l loadup, args passed by Makefile. */
1710 if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
1711 Vtop_level = Fcons (intern ("load"),
1712 Fcons (build_string (file), Qnil));
1713 /* Unless next switch is -nl, load "loadup.el" first thing. */
1714 if (! no_loadup)
1715 Vtop_level = Fcons (intern ("load"),
1716 Fcons (build_string ("loadup.el"), Qnil));
1717 }
1718
1719 if (initialized)
1720 {
1721 #ifdef HAVE_TZSET
1722 {
1723 /* If the execution TZ happens to be the same as the dump TZ,
1724 change it to some other value and then change it back,
1725 to force the underlying implementation to reload the TZ info.
1726 This is needed on implementations that load TZ info from files,
1727 since the TZ file contents may differ between dump and execution. */
1728 char *tz = getenv ("TZ");
1729 if (tz && !strcmp (tz, dump_tz))
1730 {
1731 ++*tz;
1732 tzset ();
1733 --*tz;
1734 }
1735 }
1736 #endif
1737 }
1738
1739 /* Set up for profiling. This is known to work on FreeBSD and
1740 GNU/Linux. It might work on some other systems too. Give it a
1741 try and tell us if it works on your system. To compile for
1742 profiling use something like `make CFLAGS="-pg -g -O -DPROFILING=1'. */
1743 #if defined (__FreeBSD__) || defined (__linux)
1744 #ifdef PROFILING
1745 if (initialized)
1746 {
1747 extern void _mcleanup ();
1748 extern char etext;
1749 extern void safe_bcopy ();
1750 extern void dump_opcode_frequencies ();
1751
1752 atexit (_mcleanup);
1753 /* This uses safe_bcopy because that function comes first in the
1754 Emacs executable. It might be better to use something that
1755 gives the start of the text segment, but start_of_text is not
1756 defined on all systems now. */
1757 monstartup (safe_bcopy, &etext);
1758 }
1759 else
1760 moncontrol (0);
1761 #endif
1762 #endif
1763
1764 initialized = 1;
1765
1766 #ifdef LOCALTIME_CACHE
1767 /* Some versions of localtime have a bug. They cache the value of the time
1768 zone rather than looking it up every time. Since localtime() is
1769 called to bolt the undumping time into the undumped emacs, this
1770 results in localtime ignoring the TZ environment variable.
1771 This flushes the new TZ value into localtime. */
1772 tzset ();
1773 #endif /* defined (LOCALTIME_CACHE) */
1774
1775 /* Enter editor command loop. This never returns. */
1776 Frecursive_edit ();
1777 /* NOTREACHED */
1778 return 0;
1779 }
1780 \f
1781 /* Sort the args so we can find the most important ones
1782 at the beginning of argv. */
1783
1784 /* First, here's a table of all the standard options. */
1785
1786 struct standard_args
1787 {
1788 char *name;
1789 char *longname;
1790 int priority;
1791 int nargs;
1792 };
1793
1794 struct standard_args standard_args[] =
1795 {
1796 { "-version", "--version", 150, 0 },
1797 #ifdef HAVE_SHM
1798 { "-nl", "--no-shared-memory", 140, 0 },
1799 #endif
1800 #ifdef VMS
1801 { "-map", "--map-data", 130, 0 },
1802 #endif
1803 { "-t", "--terminal", 120, 1 },
1804 { "-nw", "--no-window-system", 110, 0 },
1805 { "-nw", "--no-windows", 110, 0 },
1806 { "-batch", "--batch", 100, 0 },
1807 { "-script", "--script", 100, 1 },
1808 { "-help", "--help", 90, 0 },
1809 { "-no-unibyte", "--no-unibyte", 83, 0 },
1810 { "-multibyte", "--multibyte", 82, 0 },
1811 { "-unibyte", "--unibyte", 81, 0 },
1812 { "-no-multibyte", "--no-multibyte", 80, 0 },
1813 { "-nl", "--no-loadup", 70, 0 },
1814 /* -d must come last before the options handled in startup.el. */
1815 { "-d", "--display", 60, 1 },
1816 { "-display", 0, 60, 1 },
1817 /* Now for the options handled in startup.el. */
1818 { "-Q", "--quick", 55, 0 },
1819 { "-quick", 0, 55, 0 },
1820 { "-q", "--no-init-file", 50, 0 },
1821 { "-no-init-file", 0, 50, 0 },
1822 { "-no-site-file", "--no-site-file", 40, 0 },
1823 { "-no-splash", "--no-splash", 40, 0 },
1824 { "-u", "--user", 30, 1 },
1825 { "-user", 0, 30, 1 },
1826 { "-debug-init", "--debug-init", 20, 0 },
1827 { "-i", "--icon-type", 15, 0 },
1828 { "-itype", 0, 15, 0 },
1829 { "-iconic", "--iconic", 15, 0 },
1830 { "-D", "--basic-display", 12, 0},
1831 { "--basic-display", 0, 12, 0},
1832 { "-bg", "--background-color", 10, 1 },
1833 { "-background", 0, 10, 1 },
1834 { "-fg", "--foreground-color", 10, 1 },
1835 { "-foreground", 0, 10, 1 },
1836 { "-bd", "--border-color", 10, 1 },
1837 { "-bw", "--border-width", 10, 1 },
1838 { "-ib", "--internal-border", 10, 1 },
1839 { "-ms", "--mouse-color", 10, 1 },
1840 { "-cr", "--cursor-color", 10, 1 },
1841 { "-nbc", "--no-blinking-cursor", 10, 0 },
1842 { "-fn", "--font", 10, 1 },
1843 { "-font", 0, 10, 1 },
1844 { "-fs", "--fullscreen", 10, 0 },
1845 { "-fw", "--fullwidth", 10, 0 },
1846 { "-fh", "--fullheight", 10, 0 },
1847 { "-g", "--geometry", 10, 1 },
1848 { "-geometry", 0, 10, 1 },
1849 { "-T", "--title", 10, 1 },
1850 { "-title", 0, 10, 1 },
1851 { "-name", "--name", 10, 1 },
1852 { "-xrm", "--xrm", 10, 1 },
1853 { "-r", "--reverse-video", 5, 0 },
1854 { "-rv", 0, 5, 0 },
1855 { "-reverse", 0, 5, 0 },
1856 { "-hb", "--horizontal-scroll-bars", 5, 0 },
1857 { "-vb", "--vertical-scroll-bars", 5, 0 },
1858 { "-color", "--color", 5, 0},
1859 /* These have the same priority as ordinary file name args,
1860 so they are not reordered with respect to those. */
1861 { "-L", "--directory", 0, 1 },
1862 { "-directory", 0, 0, 1 },
1863 { "-l", "--load", 0, 1 },
1864 { "-load", 0, 0, 1 },
1865 { "-f", "--funcall", 0, 1 },
1866 { "-funcall", 0, 0, 1 },
1867 { "-eval", "--eval", 0, 1 },
1868 { "-execute", "--execute", 0, 1 },
1869 { "-find-file", "--find-file", 0, 1 },
1870 { "-visit", "--visit", 0, 1 },
1871 { "-file", "--file", 0, 1 },
1872 { "-insert", "--insert", 0, 1 },
1873 /* This should be processed after ordinary file name args and the like. */
1874 { "-kill", "--kill", -10, 0 },
1875 };
1876
1877 /* Reorder the elements of ARGV (assumed to have ARGC elements)
1878 so that the highest priority ones come first.
1879 Do not change the order of elements of equal priority.
1880 If an option takes an argument, keep it and its argument together.
1881
1882 If an option that takes no argument appears more
1883 than once, eliminate all but one copy of it. */
1884
1885 static void
1886 sort_args (argc, argv)
1887 int argc;
1888 char **argv;
1889 {
1890 char **new = (char **) xmalloc (sizeof (char *) * argc);
1891 /* For each element of argv,
1892 the corresponding element of options is:
1893 0 for an option that takes no arguments,
1894 1 for an option that takes one argument, etc.
1895 -1 for an ordinary non-option argument. */
1896 int *options = (int *) xmalloc (sizeof (int) * argc);
1897 int *priority = (int *) xmalloc (sizeof (int) * argc);
1898 int to = 1;
1899 int incoming_used = 1;
1900 int from;
1901 int i;
1902
1903 /* Categorize all the options,
1904 and figure out which argv elts are option arguments. */
1905 for (from = 1; from < argc; from++)
1906 {
1907 options[from] = -1;
1908 priority[from] = 0;
1909 if (argv[from][0] == '-')
1910 {
1911 int match, thislen;
1912 char *equals;
1913
1914 /* If we have found "--", don't consider
1915 any more arguments as options. */
1916 if (argv[from][1] == '-' && argv[from][2] == 0)
1917 {
1918 /* Leave the "--", and everything following it, at the end. */
1919 for (; from < argc; from++)
1920 {
1921 priority[from] = -100;
1922 options[from] = -1;
1923 }
1924 break;
1925 }
1926
1927 /* Look for a match with a known old-fashioned option. */
1928 for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1929 if (!strcmp (argv[from], standard_args[i].name))
1930 {
1931 options[from] = standard_args[i].nargs;
1932 priority[from] = standard_args[i].priority;
1933 if (from + standard_args[i].nargs >= argc)
1934 fatal ("Option `%s' requires an argument\n", argv[from]);
1935 from += standard_args[i].nargs;
1936 goto done;
1937 }
1938
1939 /* Look for a match with a known long option.
1940 MATCH is -1 if no match so far, -2 if two or more matches so far,
1941 >= 0 (the table index of the match) if just one match so far. */
1942 if (argv[from][1] == '-')
1943 {
1944 match = -1;
1945 thislen = strlen (argv[from]);
1946 equals = index (argv[from], '=');
1947 if (equals != 0)
1948 thislen = equals - argv[from];
1949
1950 for (i = 0;
1951 i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1952 if (standard_args[i].longname
1953 && !strncmp (argv[from], standard_args[i].longname,
1954 thislen))
1955 {
1956 if (match == -1)
1957 match = i;
1958 else
1959 match = -2;
1960 }
1961
1962 /* If we found exactly one match, use that. */
1963 if (match >= 0)
1964 {
1965 options[from] = standard_args[match].nargs;
1966 priority[from] = standard_args[match].priority;
1967 /* If --OPTION=VALUE syntax is used,
1968 this option uses just one argv element. */
1969 if (equals != 0)
1970 options[from] = 0;
1971 if (from + options[from] >= argc)
1972 fatal ("Option `%s' requires an argument\n", argv[from]);
1973 from += options[from];
1974 }
1975 }
1976 done: ;
1977 }
1978 }
1979
1980 /* Copy the arguments, in order of decreasing priority, to NEW. */
1981 new[0] = argv[0];
1982 while (incoming_used < argc)
1983 {
1984 int best = -1;
1985 int best_priority = -9999;
1986
1987 /* Find the highest priority remaining option.
1988 If several have equal priority, take the first of them. */
1989 for (from = 1; from < argc; from++)
1990 {
1991 if (argv[from] != 0 && priority[from] > best_priority)
1992 {
1993 best_priority = priority[from];
1994 best = from;
1995 }
1996 /* Skip option arguments--they are tied to the options. */
1997 if (options[from] > 0)
1998 from += options[from];
1999 }
2000
2001 if (best < 0)
2002 abort ();
2003
2004 /* Copy the highest priority remaining option, with its args, to NEW.
2005 Unless it is a duplicate of the previous one. */
2006 if (! (options[best] == 0
2007 && ! strcmp (new[to - 1], argv[best])))
2008 {
2009 new[to++] = argv[best];
2010 for (i = 0; i < options[best]; i++)
2011 new[to++] = argv[best + i + 1];
2012 }
2013
2014 incoming_used += 1 + (options[best] > 0 ? options[best] : 0);
2015
2016 /* Clear out this option in ARGV. */
2017 argv[best] = 0;
2018 for (i = 0; i < options[best]; i++)
2019 argv[best + i + 1] = 0;
2020 }
2021
2022 /* If duplicate options were deleted, fill up extra space with null ptrs. */
2023 while (to < argc)
2024 new[to++] = 0;
2025
2026 bcopy (new, argv, sizeof (char *) * argc);
2027
2028 xfree (options);
2029 xfree (new);
2030 xfree (priority);
2031 }
2032 \f
2033 DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
2034 doc: /* Exit the Emacs job and kill it.
2035 If ARG is an integer, return ARG as the exit program code.
2036 If ARG is a string, stuff it as keyboard input.
2037
2038 The value of `kill-emacs-hook', if not void,
2039 is a list of functions (of no args),
2040 all of which are called before Emacs is actually killed. */)
2041 (arg)
2042 Lisp_Object arg;
2043 {
2044 struct gcpro gcpro1;
2045
2046 GCPRO1 (arg);
2047
2048 if (feof (stdin))
2049 arg = Qt;
2050
2051 if (!NILP (Vrun_hooks) && !noninteractive)
2052 call1 (Vrun_hooks, intern ("kill-emacs-hook"));
2053
2054 UNGCPRO;
2055
2056 /* Is it really necessary to do this deassign
2057 when we are going to exit anyway? */
2058 /* #ifdef VMS
2059 stop_vms_input ();
2060 #endif */
2061
2062 shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil);
2063
2064 /* If we have an auto-save list file,
2065 kill it because we are exiting Emacs deliberately (not crashing).
2066 Do it after shut_down_emacs, which does an auto-save. */
2067 if (STRINGP (Vauto_save_list_file_name))
2068 unlink (SDATA (Vauto_save_list_file_name));
2069
2070 exit (INTEGERP (arg) ? XINT (arg) : EXIT_SUCCESS);
2071 /* NOTREACHED */
2072 return Qnil;
2073 }
2074
2075
2076 /* Perform an orderly shutdown of Emacs. Autosave any modified
2077 buffers, kill any child processes, clean up the terminal modes (if
2078 we're in the foreground), and other stuff like that. Don't perform
2079 any redisplay; this may be called when Emacs is shutting down in
2080 the background, or after its X connection has died.
2081
2082 If SIG is a signal number, print a message for it.
2083
2084 This is called by fatal signal handlers, X protocol error handlers,
2085 and Fkill_emacs. */
2086
2087 void
2088 shut_down_emacs (sig, no_x, stuff)
2089 int sig, no_x;
2090 Lisp_Object stuff;
2091 {
2092 /* Prevent running of hooks from now on. */
2093 Vrun_hooks = Qnil;
2094
2095 /* Don't update display from now on. */
2096 Vinhibit_redisplay = Qt;
2097
2098 /* If we are controlling the terminal, reset terminal modes. */
2099 #ifdef EMACS_HAVE_TTY_PGRP
2100 {
2101 int pgrp = EMACS_GETPGRP (0);
2102
2103 int tpgrp;
2104 if (EMACS_GET_TTY_PGRP (0, &tpgrp) != -1
2105 && tpgrp == pgrp)
2106 {
2107 fflush (stdout);
2108 reset_sys_modes ();
2109 if (sig && sig != SIGTERM)
2110 fprintf (stderr, "Fatal error (%d)", sig);
2111 }
2112 }
2113 #else
2114 fflush (stdout);
2115 reset_sys_modes ();
2116 #endif
2117
2118 stuff_buffered_input (stuff);
2119
2120 kill_buffer_processes (Qnil);
2121 Fdo_auto_save (Qt, Qnil);
2122
2123 #ifdef CLASH_DETECTION
2124 unlock_all_files ();
2125 #endif
2126
2127 #ifdef VMS
2128 kill_vms_processes ();
2129 #endif
2130
2131 #if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
2132 #ifdef HAVE_X_WINDOWS
2133 /* It's not safe to call intern here. Maybe we are crashing. */
2134 if (!noninteractive && SYMBOLP (Vwindow_system)
2135 && SCHARS (SYMBOL_NAME (Vwindow_system)) == 1
2136 && SREF (SYMBOL_NAME (Vwindow_system), 0) == 'x'
2137 && ! no_x)
2138 Fx_close_current_connection ();
2139 #endif /* HAVE_X_WINDOWS */
2140 #endif
2141
2142 #ifdef SIGIO
2143 /* There is a tendency for a SIGIO signal to arrive within exit,
2144 and cause a SIGHUP because the input descriptor is already closed. */
2145 unrequest_sigio ();
2146 signal (SIGIO, SIG_IGN);
2147 #endif
2148
2149 #ifdef WINDOWSNT
2150 term_ntproc ();
2151 #endif
2152
2153 /* Do this only if terminating normally, we want glyph matrices
2154 etc. in a core dump. */
2155 if (sig == 0 || sig == SIGTERM)
2156 {
2157 check_glyph_memory ();
2158 check_message_stack ();
2159 }
2160
2161 #ifdef MSDOS
2162 dos_cleanup ();
2163 #endif
2164 }
2165
2166
2167 \f
2168 #ifndef CANNOT_DUMP
2169
2170 #ifdef HAVE_SHM
2171
2172 DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0,
2173 doc: /* Dump current state of Emacs into data file FILENAME.
2174 This function exists on systems that use HAVE_SHM. */)
2175 (filename)
2176 Lisp_Object filename;
2177 {
2178 extern char my_edata[];
2179 Lisp_Object tem;
2180
2181 check_pure_size ();
2182 CHECK_STRING (filename);
2183 filename = Fexpand_file_name (filename, Qnil);
2184
2185 tem = Vpurify_flag;
2186 Vpurify_flag = Qnil;
2187
2188 fflush (stdout);
2189 /* Tell malloc where start of impure now is. */
2190 /* Also arrange for warnings when nearly out of space. */
2191 #ifndef SYSTEM_MALLOC
2192 memory_warnings (my_edata, malloc_warning);
2193 #endif
2194 map_out_data (SDATA (filename));
2195
2196 Vpurify_flag = tem;
2197
2198 return Qnil;
2199 }
2200
2201 #else /* not HAVE_SHM */
2202
2203 DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
2204 doc: /* Dump current state of Emacs into executable file FILENAME.
2205 Take symbols from SYMFILE (presumably the file you executed to run Emacs).
2206 This is used in the file `loadup.el' when building Emacs.
2207
2208 You must run Emacs in batch mode in order to dump it. */)
2209 (filename, symfile)
2210 Lisp_Object filename, symfile;
2211 {
2212 extern char my_edata[];
2213 Lisp_Object tem;
2214 Lisp_Object symbol;
2215 int count = SPECPDL_INDEX ();
2216
2217 check_pure_size ();
2218
2219 if (! noninteractive)
2220 error ("Dumping Emacs works only in batch mode");
2221
2222 #ifdef __linux__
2223 if (heap_bss_diff > MAX_HEAP_BSS_DIFF)
2224 {
2225 fprintf (stderr, "**************************************************\n");
2226 fprintf (stderr, "Warning: Your system has a gap between BSS and the\n");
2227 fprintf (stderr, "heap (%lu byte). This usually means that exec-shield\n",
2228 heap_bss_diff);
2229 fprintf (stderr, "or something similar is in effect. The dump may\n");
2230 fprintf (stderr, "fail because of this. See the section about \n");
2231 fprintf (stderr, "exec-shield in etc/PROBLEMS for more information.\n");
2232 fprintf (stderr, "**************************************************\n");
2233 }
2234 #endif /* __linux__ */
2235
2236 /* Bind `command-line-processed' to nil before dumping,
2237 so that the dumped Emacs will process its command line
2238 and set up to work with X windows if appropriate. */
2239 symbol = intern ("command-line-processed");
2240 specbind (symbol, Qnil);
2241
2242 CHECK_STRING (filename);
2243 filename = Fexpand_file_name (filename, Qnil);
2244 if (!NILP (symfile))
2245 {
2246 CHECK_STRING (symfile);
2247 if (SCHARS (symfile))
2248 symfile = Fexpand_file_name (symfile, Qnil);
2249 }
2250
2251 tem = Vpurify_flag;
2252 Vpurify_flag = Qnil;
2253
2254 #ifdef HAVE_TZSET
2255 set_time_zone_rule (dump_tz);
2256 #ifndef LOCALTIME_CACHE
2257 /* Force a tz reload, since set_time_zone_rule doesn't. */
2258 tzset ();
2259 #endif
2260 #endif
2261
2262 fflush (stdout);
2263 #ifdef VMS
2264 mapout_data (SDATA (filename));
2265 #else
2266 /* Tell malloc where start of impure now is. */
2267 /* Also arrange for warnings when nearly out of space. */
2268 #ifndef SYSTEM_MALLOC
2269 #ifndef WINDOWSNT
2270 /* On Windows, this was done before dumping, and that once suffices.
2271 Meanwhile, my_edata is not valid on Windows. */
2272 memory_warnings (my_edata, malloc_warning);
2273 #endif /* not WINDOWSNT */
2274 #endif
2275 #if !defined (SYSTEM_MALLOC) && defined (HAVE_GTK_AND_PTHREAD) && !defined SYNC_INPUT
2276 /* Pthread may call malloc before main, and then we will get an endless
2277 loop, because pthread_self (see alloc.c) calls malloc the first time
2278 it is called on some systems. */
2279 reset_malloc_hooks ();
2280 #endif
2281 #ifdef DOUG_LEA_MALLOC
2282 malloc_state_ptr = malloc_get_state ();
2283 #endif
2284
2285 #ifdef USE_MMAP_FOR_BUFFERS
2286 mmap_set_vars (0);
2287 #endif
2288 unexec (SDATA (filename),
2289 !NILP (symfile) ? SDATA (symfile) : 0, my_edata, 0, 0);
2290 #ifdef USE_MMAP_FOR_BUFFERS
2291 mmap_set_vars (1);
2292 #endif
2293 #ifdef DOUG_LEA_MALLOC
2294 free (malloc_state_ptr);
2295 #endif
2296 #endif /* not VMS */
2297
2298 Vpurify_flag = tem;
2299
2300 return unbind_to (count, Qnil);
2301 }
2302
2303 #endif /* not HAVE_SHM */
2304
2305 #endif /* not CANNOT_DUMP */
2306 \f
2307 #if HAVE_SETLOCALE
2308 /* Recover from setlocale (LC_ALL, ""). */
2309 void
2310 fixup_locale ()
2311 {
2312 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
2313 so that numbers are read and printed properly for Emacs Lisp. */
2314 setlocale (LC_NUMERIC, "C");
2315 }
2316
2317 /* Set system locale CATEGORY, with previous locale *PLOCALE, to
2318 DESIRED_LOCALE. */
2319 static void
2320 synchronize_locale (category, plocale, desired_locale)
2321 int category;
2322 Lisp_Object *plocale;
2323 Lisp_Object desired_locale;
2324 {
2325 if (! EQ (*plocale, desired_locale))
2326 {
2327 *plocale = desired_locale;
2328 setlocale (category, (STRINGP (desired_locale)
2329 ? (char *) SDATA (desired_locale)
2330 : ""));
2331 }
2332 }
2333
2334 /* Set system time locale to match Vsystem_time_locale, if possible. */
2335 void
2336 synchronize_system_time_locale ()
2337 {
2338 synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
2339 Vsystem_time_locale);
2340 }
2341
2342 /* Set system messages locale to match Vsystem_messages_locale, if
2343 possible. */
2344 void
2345 synchronize_system_messages_locale ()
2346 {
2347 #ifdef LC_MESSAGES
2348 synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
2349 Vsystem_messages_locale);
2350 #endif
2351 }
2352 #endif /* HAVE_SETLOCALE */
2353 \f
2354 #ifndef SEPCHAR
2355 #define SEPCHAR ':'
2356 #endif
2357
2358 Lisp_Object
2359 decode_env_path (evarname, defalt)
2360 char *evarname, *defalt;
2361 {
2362 register char *path, *p;
2363 Lisp_Object lpath, element, tem;
2364
2365 /* It's okay to use getenv here, because this function is only used
2366 to initialize variables when Emacs starts up, and isn't called
2367 after that. */
2368 if (evarname != 0)
2369 path = (char *) getenv (evarname);
2370 else
2371 path = 0;
2372 if (!path)
2373 path = defalt;
2374 #ifdef DOS_NT
2375 /* Ensure values from the environment use the proper directory separator. */
2376 if (path)
2377 {
2378 p = alloca (strlen (path) + 1);
2379 strcpy (p, path);
2380 path = p;
2381
2382 if ('/' == DIRECTORY_SEP)
2383 dostounix_filename (path);
2384 else
2385 unixtodos_filename (path);
2386 }
2387 #endif
2388 lpath = Qnil;
2389 while (1)
2390 {
2391 p = index (path, SEPCHAR);
2392 if (!p) p = path + strlen (path);
2393 element = (p - path ? make_string (path, p - path)
2394 : build_string ("."));
2395
2396 /* Add /: to the front of the name
2397 if it would otherwise be treated as magic. */
2398 tem = Ffind_file_name_handler (element, Qt);
2399
2400 /* However, if the handler says "I'm safe",
2401 don't bother adding /:. */
2402 if (SYMBOLP (tem))
2403 {
2404 Lisp_Object prop;
2405 prop = Fget (tem, intern ("safe-magic"));
2406 if (! NILP (prop))
2407 tem = Qnil;
2408 }
2409
2410 if (! NILP (tem))
2411 element = concat2 (build_string ("/:"), element);
2412
2413 lpath = Fcons (element, lpath);
2414 if (*p)
2415 path = p + 1;
2416 else
2417 break;
2418 }
2419 return Fnreverse (lpath);
2420 }
2421
2422 void
2423 syms_of_emacs ()
2424 {
2425 Qfile_name_handler_alist = intern ("file-name-handler-alist");
2426 staticpro (&Qfile_name_handler_alist);
2427
2428 #ifndef CANNOT_DUMP
2429 #ifdef HAVE_SHM
2430 defsubr (&Sdump_emacs_data);
2431 #else
2432 defsubr (&Sdump_emacs);
2433 #endif
2434 #endif
2435
2436 defsubr (&Skill_emacs);
2437
2438 defsubr (&Sinvocation_name);
2439 defsubr (&Sinvocation_directory);
2440
2441 DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
2442 doc: /* Args passed by shell to Emacs, as a list of strings.
2443 Many arguments are deleted from the list as they are processed. */);
2444
2445 DEFVAR_LISP ("system-type", &Vsystem_type,
2446 doc: /* Value is symbol indicating type of operating system you are using.
2447 Special values:
2448 `gnu/linux' compiled for a GNU/Linux system.
2449 `darwin' compiled for Darwin (GNU-Darwin, Mac OS X, ...).
2450 `macos' compiled for Mac OS 9.
2451 `ms-dos' compiled as an MS-DOS application.
2452 `windows-nt' compiled as a native W32 application.
2453 `cygwin' compiled using the Cygwin library.
2454 `vax-vms' or `axp-vms': compiled for a (Open)VMS system.
2455 Anything else indicates some sort of Unix system. */);
2456 Vsystem_type = intern (SYSTEM_TYPE);
2457
2458 DEFVAR_LISP ("system-configuration", &Vsystem_configuration,
2459 doc: /* Value is string indicating configuration Emacs was built for.
2460 On MS-Windows, the value reflects the OS flavor and version on which
2461 Emacs is running. */);
2462 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
2463
2464 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options,
2465 doc: /* String containing the configuration options Emacs was built with. */);
2466 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2467
2468 DEFVAR_BOOL ("noninteractive", &noninteractive1,
2469 doc: /* Non-nil means Emacs is running without interactive terminal. */);
2470
2471 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
2472 doc: /* Hook to be run when kill-emacs is called.
2473 Since `kill-emacs' may be invoked when the terminal is disconnected (or
2474 in other similar situations), functions placed on this hook should not
2475 expect to be able to interact with the user. To ask for confirmation,
2476 see `kill-emacs-query-functions' instead.
2477
2478 The hook is not run in batch mode, i.e., if `noninteractive' is non-nil. */);
2479 Vkill_emacs_hook = Qnil;
2480
2481 empty_string = build_string ("");
2482 staticpro (&empty_string);
2483
2484 DEFVAR_INT ("emacs-priority", &emacs_priority,
2485 doc: /* Priority for Emacs to run at.
2486 This value is effective only if set before Emacs is dumped,
2487 and only if the Emacs executable is installed with setuid to permit
2488 it to change priority. (Emacs sets its uid back to the real uid.)
2489 Currently, you need to define SET_EMACS_PRIORITY in `config.h'
2490 before you compile Emacs, to enable the code for this feature. */);
2491 emacs_priority = 0;
2492
2493 DEFVAR_LISP ("path-separator", &Vpath_separator,
2494 doc: /* The directory separator in search paths, as a string. */);
2495 {
2496 char c = SEPCHAR;
2497 Vpath_separator = make_string (&c, 1);
2498 }
2499
2500 DEFVAR_LISP ("invocation-name", &Vinvocation_name,
2501 doc: /* The program name that was used to run Emacs.
2502 Any directory names are omitted. */);
2503
2504 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory,
2505 doc: /* The directory in which the Emacs executable was found, to run it.
2506 The value is nil if that directory's name is not known. */);
2507
2508 DEFVAR_LISP ("installation-directory", &Vinstallation_directory,
2509 doc: /* A directory within which to look for the `lib-src' and `etc' directories.
2510 This is non-nil when we can't find those directories in their standard
2511 installed locations, but we can find them
2512 near where the Emacs executable was found. */);
2513 Vinstallation_directory = Qnil;
2514
2515 DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale,
2516 doc: /* System locale for messages. */);
2517 Vsystem_messages_locale = Qnil;
2518
2519 DEFVAR_LISP ("previous-system-messages-locale",
2520 &Vprevious_system_messages_locale,
2521 doc: /* Most recently used system locale for messages. */);
2522 Vprevious_system_messages_locale = Qnil;
2523
2524 DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale,
2525 doc: /* System locale for time. */);
2526 Vsystem_time_locale = Qnil;
2527
2528 DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale,
2529 doc: /* Most recently used system locale for time. */);
2530 Vprevious_system_time_locale = Qnil;
2531 }
2532
2533 /* arch-tag: 7bfd356a-c720-4612-8ab6-aa4222931c2e
2534 (do not change this comment) */