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