Bugfix festival.
[bpt/emacs.git] / src / emacs.c
index 5212256..62b550a 100644 (file)
@@ -1,5 +1,6 @@
 /* Fully extensible Emacs, running on Unix, intended for GNU.
-   Copyright (C) 1985,86,87,93,94,95,97,98,1999 Free Software Foundation, Inc.
+   Copyright (C) 1985,86,87,93,94,95,97,98,1999,2001,02,2003
+      Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -39,10 +40,15 @@ Boston, MA 02111-1307, USA.  */
 #include <sys/ioctl.h>
 #endif
 
+#ifdef WINDOWSNT
+#include <fcntl.h>
+#endif
+
 #include "lisp.h"
 #include "commands.h"
 #include "intervals.h"
 #include "buffer.h"
+#include "window.h"
 
 #include "systty.h"
 #include "blockinput.h"
@@ -50,6 +56,7 @@ Boston, MA 02111-1307, USA.  */
 #include "process.h"
 #include "termhooks.h"
 #include "keyboard.h"
+#include "keymap.h"
 
 #ifdef HAVE_SETLOCALE
 #include <locale.h>
@@ -64,9 +71,18 @@ Boston, MA 02111-1307, USA.  */
 #define O_RDWR 2
 #endif
 
-extern void malloc_warning ();
-extern void set_time_zone_rule ();
-extern char *index ();
+#ifdef HAVE_SETPGID
+#if !defined (USG) || defined (BSD_PGRPS)
+#undef setpgrp
+#define setpgrp setpgid
+#endif
+#endif
+
+extern void malloc_warning P_ ((char *));
+extern void set_time_zone_rule P_ ((char *));
+#ifdef HAVE_INDEX
+extern char *index P_ ((const char *, int));
+#endif
 
 /* Make these values available in GDB, which doesn't see macros.  */
 
@@ -76,11 +92,11 @@ EMACS_INT gdb_emacs_intbits = sizeof (EMACS_INT) * BITS_PER_CHAR;
 #ifdef DATA_SEG_BITS
 EMACS_INT gdb_data_seg_bits = DATA_SEG_BITS;
 #else
-EMACS_INT  gdb_data_seg_bits = 0;
+EMACS_INT gdb_data_seg_bits = 0;
 #endif
 EMACS_INT PVEC_FLAG = PSEUDOVECTOR_FLAG;
 
-/* Command line args from shell, as list of strings */
+/* Command line args from shell, as list of strings */
 Lisp_Object Vcommand_line_args;
 
 /* The name under which Emacs was invoked, with any leading directory
@@ -97,12 +113,15 @@ Lisp_Object Vinstallation_directory;
 /* Hook run by `kill-emacs' before it does really anything.  */
 Lisp_Object Vkill_emacs_hook;
 
+/* An empty lisp string.  To avoid having to build any other.  */
+Lisp_Object empty_string;
+
 #ifdef SIGUSR1
-/* Hooks for signal USR1 and USR2 handing */
+/* Hooks for signal USR1 and USR2 handling.  */
 Lisp_Object Vsignal_USR1_hook;
 #ifdef SIGUSR2
 Lisp_Object Vsignal_USR2_hook;
-#endif 
+#endif
 #endif
 
 /* Search path separator.  */
@@ -144,17 +163,17 @@ Lisp_Object Vprevious_system_messages_locale;
 Lisp_Object Vsystem_time_locale;
 Lisp_Object Vprevious_system_time_locale;
 
-/* If non-zero, emacs should not attempt to use an window-specific code,
-   but instead should use the virtual terminal under which it was started */
+/* If non-zero, emacs should not attempt to use a window-specific code,
+   but instead should use the virtual terminal under which it was started */
 int inhibit_window_system;
 
 /* If nonzero, set Emacs to run at this priority.  This is also used
    in child_setup and sys_suspend to make sure subshells run at normal
-   priority; Those functions have their own extern declaration.  */
-int emacs_priority;
+   priority; those functions have their own extern declaration.  */
+EMACS_INT emacs_priority;
 
-/* If non-zero a filter or a sentinel is running.  Tested to save the match
-   data on the first attempt to change it inside asynchronous code. */
+/* If non-zero, a filter or a sentinel is running.  Tested to save the match
+   data on the first attempt to change it inside asynchronous code.  */
 int running_asynch_code;
 
 #ifdef BSD_PGRPS
@@ -163,7 +182,7 @@ extern int inherited_pgroup;
 #endif
 
 #ifdef HAVE_X_WINDOWS
-/* If non-zero, -d was specified, meaning we're using some window system. */
+/* If non-zero, -d was specified, meaning we're using some window system.  */
 int display_arg;
 #endif
 
@@ -200,13 +219,105 @@ int initial_argc;
 
 static void sort_args ();
 void syms_of_emacs ();
+
+#define USAGE1 "\
+Usage: %s [OPTION-OR-FILENAME]...\n\
+\n\
+Run Emacs, the extensible, customizable, self-documenting real-time\n\
+display editor.  The recommended way to start Emacs for normal editing\n\
+is with no options at all.\n\
+\n\
+Run M-x info RET m emacs RET m command arguments RET inside Emacs to\n\
+read the main documentation for these command-line arguments.\n\
+\n\
+Initialization options:\n\
+\n\
+--batch                        do not do interactive display; implies -q\n\
+--script FILE           run FILE as an Emacs Lisp script.\n\
+--debug-init           enable Emacs Lisp debugger during init file\n\
+--help                 display this help message and exit\n\
+--multibyte, --no-unibyte   run Emacs in multibyte mode\n\
+--no-init-file, -q         load neither ~/.emacs nor default.el\n\
+--no-shared-memory, -nl            do not use shared memory\n\
+--no-site-file             do not load site-start.el\n\
+--no-splash                do not display a splash screen on startup\n\
+--no-window-system, -nw            don't communicate with X, ignoring $DISPLAY\n\
+--terminal, -t DEVICE      use DEVICE for terminal I/O\n\
+--unibyte, --no-multibyte   run Emacs in unibyte mode\n\
+--user, -u USER                load ~USER/.emacs instead of your own\n\
+--version              display version information and exit\n\
+\n\
+Action options:\n\
+\n\
+FILE                   visit FILE using find-file\n\
++LINE FILE             visit FILE using find-file, then go to line LINE\n\
++LINE:COLUMN FILE      visit FILE using find-file, then go to line LINE,\n\
+                           column COLUMN\n\
+--directory, -L DIR    add DIR to variable load-path\n\
+--eval EXPR            evaluate Emacs Lisp expression EXPR\n\
+--execute EXPR         evaluate Emacs Lisp expression EXPR\n\
+--find-file FILE       visit FILE\n\
+--funcall, -f FUNC     call Emacs function FUNC with no arguments\n\
+--insert FILE          insert contents of FILE into current buffer\n\
+--kill                 exit without asking for confirmation\n\
+--load, -l FILE                load FILE of Emacs Lisp code using the load function\n\
+--visit FILE           visit FILE\n\
+\n"
+
+#define USAGE2 "\
+Display options:\n\
+\n\
+--background-color, -bg COLOR  window background color\n\
+--border-color, -bd COLOR      main border color\n\
+--border-width, -bw WIDTH      width of main border\n\
+--color=MODE                   color mode for character terminals;\n\
+                               MODE defaults to `auto', and can also\n\
+                               be `never', `auto', `always',\n\
+                               or a mode name like `ansi8'\n\
+--cursor-color, -cr COLOR      color of the Emacs cursor indicating point\n\
+--display, -d DISPLAY          use X server DISPLAY\n\
+--font, -fn FONT               default font; must be fixed-width\n\
+--foreground-color, -fg COLOR  window foreground color\n\
+--fullscreen, -fs              make first frame fullscreen\n\
+--fullwidth, -fw               make the first frame wide as the screen\n\
+--fullheight, -fh              make the first frame high as the screen\n\
+--geometry, -g GEOMETRY                window geometry\n\
+--iconic                       start Emacs in iconified state\n\
+--icon-type, -i                        use picture of gnu for Emacs icon\n\
+--internal-border, -ib WIDTH   width between text and main border\n\
+--line-spacing, -lsp PIXELS    additional space to put between lines\n\
+--mouse-color, -ms COLOR       mouse cursor color in Emacs window\n\
+--name NAME                    title of main Emacs window\n\
+--reverse-video, -r, -rv       switch foreground and background\n\
+--title, -T, -wn TITLE         title for Emacs windows\n\
+--vertical-scroll-bars, -vb    enable vertical scroll bars\n\
+--xrm XRESOURCES               set additional X resources\n\
+\n\
+You can generally also specify long option names with a single -; for\n\
+example, -batch as well as --batch.  You can use any unambiguous\n\
+abbreviation for a --option.\n\
+\n\
+Various environment variables and window system resources also affect\n\
+Emacs' operation.  See the main documentation.\n\
+\n"
+
+#define USAGE3 "\
+Report bugs to %s.  First, please see the Bugs\n\
+section of the Emacs manual or the file BUGS.\n"
+
 \f
-/* Signal code for the fatal signal that was received */
+/* Signal code for the fatal signal that was received */
 int fatal_error_code;
 
-/* Nonzero if handling a fatal error already */
+/* Nonzero if handling a fatal error already */
 int fatal_error_in_progress;
 
+/* If non-null, call this function from fatal_error_signal before
+   committing suicide.  */
+
+void (*fatal_error_signal_hook) P_ ((void));
+
+
 #ifdef SIGUSR1
 SIGTYPE
 handle_USR1_signal (sig)
@@ -214,11 +325,9 @@ handle_USR1_signal (sig)
 {
   struct input_event buf;
 
-  buf.kind = user_signal;
-  buf.code = 0;
+  bzero (&buf, sizeof buf);
+  buf.kind = USER_SIGNAL_EVENT;
   buf.frame_or_window = selected_frame;
-  buf.modifiers = 0;
-  buf.timestamp = 0;
 
   kbd_buffer_store_event (&buf);
 }
@@ -231,17 +340,16 @@ handle_USR2_signal (sig)
 {
   struct input_event buf;
 
-  buf.kind = user_signal;
+  bzero (&buf, sizeof buf);
+  buf.kind = USER_SIGNAL_EVENT;
   buf.code = 1;
   buf.frame_or_window = selected_frame;
-  buf.modifiers = 0;
-  buf.timestamp = 0;
 
   kbd_buffer_store_event (&buf);
 }
 #endif /* SIGUSR2 */
 
-/* Handle bus errors, illegal instruction, etc. */
+/* Handle bus errors, invalid instruction, etc.  */
 SIGTYPE
 fatal_error_signal (sig)
      int sig;
@@ -269,6 +377,10 @@ fatal_error_signal (sig)
 #ifndef MSDOS
   sigunblock (sigmask (fatal_error_code));
 #endif
+
+  if (fatal_error_signal_hook)
+    fatal_error_signal_hook ();
+
   kill (getpid (), fatal_error_code);
 #endif /* not VMS */
 }
@@ -291,7 +403,7 @@ memory_warning_signal (sig)
 
 /* We define abort, rather than using it from the library,
    so that GDB can return from a breakpoint here.
-   MSDOS has its own definition on msdos.c  */
+   MSDOS has its own definition in msdos.c.  */
 
 #if ! defined (DOS_NT) && ! defined (NO_ABORT)
 
@@ -309,7 +421,7 @@ abort ()
 #endif
 
 \f
-/* Code for dealing with Lisp access to the Unix command line */
+/* Code for dealing with Lisp access to the Unix command line */
 
 static void
 init_cmdargs (argc, argv, skip_args)
@@ -319,7 +431,7 @@ init_cmdargs (argc, argv, skip_args)
 {
   register int i;
   Lisp_Object name, dir, tem;
-  int count = specpdl_ptr - specpdl;
+  int count = SPECPDL_INDEX ();
   Lisp_Object raw_name;
 
   initial_argv = argv;
@@ -342,7 +454,7 @@ init_cmdargs (argc, argv, skip_args)
     {
       Lisp_Object found;
       int yes = openp (Vexec_path, Vinvocation_name,
-                      EXEC_SUFFIXES, &found, 1);
+                      Vexec_suffixes, &found, make_number (X_OK));
       if (yes == 1)
        {
          /* Add /: to the front of the name
@@ -451,17 +563,17 @@ init_cmdargs (argc, argv, skip_args)
 }
 
 DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
-  "Return the program name that was used to run Emacs.\n\
-Any directory names are omitted.")
-  ()
+       doc: /* Return the program name that was used to run Emacs.
+Any directory names are omitted.  */)
+     ()
 {
   return Fcopy_sequence (Vinvocation_name);
 }
 
 DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
-  0, 0, 0,
-  "Return the directory name in which the Emacs executable was located")
-  ()
+       0, 0, 0,
+       doc: /* Return the directory name in which the Emacs executable was located.  */)
+     ()
 {
   return Fcopy_sequence (Vinvocation_directory);
 }
@@ -494,8 +606,8 @@ void __do_global_ctors_aux ()
 {}
 void __do_global_dtors ()
 {}
-/* Linux has a bug in its library; avoid an error.  */
-#ifndef LINUX
+/* GNU/Linux has a bug in its library; avoid an error.  */
+#ifndef GNU_LINUX
 char * __CTOR_LIST__[2] = { (char *) (-1), 0 };
 #endif
 char * __DTOR_LIST__[2] = { (char *) (-1), 0 };
@@ -525,7 +637,7 @@ argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr)
      char **valptr;
      int *skipptr;
 {
-  char *p;
+  char *p = NULL;
   int arglen;
   char *arg;
 
@@ -583,7 +695,9 @@ argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr)
 static void
 malloc_initialize_hook ()
 {
+#ifndef USE_CRT_DLL
   extern char **environ;
+#endif
 
   if (initialized)
     {
@@ -594,7 +708,7 @@ malloc_initialize_hook ()
        {
          char **p;
 
-         for (p = environ; *p; p++)
+         for (p = environ; p && *p; p++)
            if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0)
              {
                do
@@ -615,22 +729,74 @@ void (*__malloc_initialize_hook) () = malloc_initialize_hook;
 
 #endif /* DOUG_LEA_MALLOC */
 
+
+#define REPORT_EMACS_BUG_ADDRESS "bug-gnu-emacs@gnu.org"
+#define REPORT_EMACS_BUG_PRETEST_ADDRESS "emacs-pretest-bug@gnu.org"
+
+/* This function is used to determine an address to which bug report should
+   be sent.  */
+
+char *
+bug_reporting_address ()
+{
+  int count = 0;
+  Lisp_Object temp;
+  char *string;
+
+  temp = Fsymbol_value (intern ("emacs-version"));
+
+  /* When `emacs-version' is invalid, use normal address.  */
+  if (!STRINGP(temp))
+    return REPORT_EMACS_BUG_ADDRESS;
+
+  string = SDATA (temp);
+
+  /* Count dots in `emacs-version'.  */
+  while (*string)
+    {
+      if (*string == '.')
+       count++;
+      string++;
+    }
+
+  /* When `emacs-version' has at least three dots, it is development or
+     pretest version of Emacs.  */
+  return count >= 3 ? REPORT_EMACS_BUG_PRETEST_ADDRESS : REPORT_EMACS_BUG_ADDRESS;
+}
+
+
 /* ARGSUSED */
 int
-main (argc, argv, envp)
+main (argc, argv
+#ifdef VMS
+, envp
+#endif
+)
      int argc;
      char **argv;
+#ifdef VMS
      char **envp;
+#endif
 {
+#if GC_MARK_STACK
+  Lisp_Object dummy;
+#endif
   char stack_bottom_variable;
   int do_initial_setlocale;
   int skip_args = 0;
+#ifndef USE_CRT_DLL
   extern int errno;
-  extern int sys_nerr;
+#endif
 #ifdef HAVE_SETRLIMIT
   struct rlimit rlim;
 #endif
   int no_loadup = 0;
+  char *junk = 0;
+
+#if GC_MARK_STACK
+  extern Lisp_Object *stack_base;
+  stack_base = &dummy;
+#endif
 
 #ifdef LINUX_SBRK_BUG
   __sbrk (1);
@@ -641,6 +807,11 @@ main (argc, argv, envp)
     run_time_remap (argv[0]);
 #endif
 
+#ifdef MAC_OSX
+  if (!initialized)
+    unexec_init_emacs_zone ();
+#endif
+
   sort_args (argc, argv);
   argc = 0;
   while (argv[argc]) argc++;
@@ -659,8 +830,8 @@ main (argc, argv, envp)
        }
       else
        {
-         printf ("GNU Emacs %s\n", XSTRING (tem)->data);
-         printf ("Copyright (C) 1999 Free Software Foundation, Inc.\n");
+         printf ("GNU Emacs %s\n", SDATA (tem));
+         printf ("Copyright (C) 2002 Free Software Foundation, Inc.\n");
          printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
          printf ("You may redistribute copies of Emacs\n");
          printf ("under the terms of the GNU General Public License.\n");
@@ -696,8 +867,15 @@ main (argc, argv, envp)
   }
 #endif /* NeXT */
 
+#ifdef MAC_OSX
+  /* Skip process serial number passed in the form -psn_x_y as
+     command-line argument.  */
+  if (argc > skip_args + 1 && strncmp (argv[skip_args+1], "-psn_", 5) == 0)
+    skip_args++;
+#endif /* MAC_OSX */
+
 #ifdef VMS
-  /* If -map specified, map the data file in */
+  /* If -map specified, map the data file in */
   {
     char *file;
     if (argmatch (argv, argc, "-map", "--map-data", 3, &mapin_file, &skip_args))
@@ -706,7 +884,7 @@ main (argc, argv, envp)
 
 #ifdef LINK_CRTL_SHARE
 #ifdef SHARABLE_LIB_BUG
-  /* Bletcherous shared libraries! */
+  /* Bletcherous shared libraries!  */
   if (!stdin)
     stdin = fdopen (0, "r");
   if (!stdout)
@@ -781,11 +959,13 @@ main (argc, argv, envp)
   uninterrupt_malloc ();
 #endif /* not SYSTEM_MALLOC */
 
-#ifdef MSDOS
+#if defined (MSDOS) || defined (WINDOWSNT)
   /* We do all file input/output as binary files.  When we need to translate
      newlines, we do that manually.  */
   _fmode = O_BINARY;
+#endif /* MSDOS || WINDOWSNT */
 
+#ifdef MSDOS
 #if __DJGPP__ >= 2
   if (!isatty (fileno (stdin)))
     setmode (fileno (stdin), O_BINARY);
@@ -827,7 +1007,7 @@ main (argc, argv, envp)
 
   inhibit_window_system = 0;
 
-  /* Handle the -t switch, which specifies filename to use as terminal */
+  /* Handle the -t switch, which specifies filename to use as terminal */
   while (1)
     {
       char *term;
@@ -840,13 +1020,13 @@ main (argc, argv, envp)
          if (result < 0)
            {
              char *errstring = strerror (errno);
-             fprintf (stderr, "emacs: %s: %s\n", term, errstring);
+             fprintf (stderr, "%s: %s: %s\n", argv[0], term, errstring);
              exit (1);
            }
          dup (0);
          if (! isatty (0))
            {
-             fprintf (stderr, "emacs: %s: not a tty\n", term);
+             fprintf (stderr, "%s: %s: not a tty\n", argv[0], term);
              exit (1);
            }
          fprintf (stderr, "Using %s\n", term);
@@ -858,27 +1038,32 @@ main (argc, argv, envp)
        break;
     }
 
-  if (argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
+  /* Command line option --no-windows is deprecated and thus not mentioned
+     in the manual and usage informations.  */
+  if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args)
+      || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
     inhibit_window_system = 1;
 
   /* Handle the -batch switch, which means don't do interactive display.  */
   noninteractive = 0;
   if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
     noninteractive = 1;
+  if (argmatch (argv, argc, "-script", "--script", 3, &junk, &skip_args))
+    {
+      noninteractive = 1;      /* Set batch mode.  */
+      /* Convert --script to -l, un-skip it, and sort again so that -l will be
+        handled in proper sequence.  */
+      argv[skip_args - 1] = "-l";
+      skip_args -= 2;
+      sort_args (argc, argv);
+    }
 
-  /* Handle the --help option, which gives a usage message..  */
+  /* Handle the --help option, which gives a usage message.  */
   if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
     {
-      printf ("\
-Usage: %s [--batch]  [-t term] [--terminal term]\n\
-      [-d display] [--display display]  [-nw] [--no-windows]\n\
-      [-q] [--no-init-file]  [-u user] [--user user]  [--debug-init]\n\
-      [--unibyte] [--multibyte] [--version] [--no-site-file]\n\
-      [-f func] [--funcall func]  [-l file] [--load file]  [--eval expr]\n\
-      [--execute expr] [--visit file] [--file file] [--insert file]\n\
-      [+linenum] file-to-visit  [--kill]\n\
-Report bugs to bug-gnu-emacs@gnu.org.  First, please see\n\
-the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
+      printf (USAGE1, argv[0]);
+      printf (USAGE2);
+      printf (USAGE3, bug_reporting_address ());
       exit (0);
     }
 
@@ -999,7 +1184,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
 
   noninteractive1 = noninteractive;
 
-/* Perform basic initializations (not merely interning symbols) */
+/* Perform basic initializations (not merely interning symbols) */
 
   if (!initialized)
     {
@@ -1010,21 +1195,45 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
       init_coding_once ();
       init_syntax_once ();     /* Create standard syntax table.  */
       init_category_once ();   /* Create standard category table.  */
-                     /* Must be done before init_buffer */
+                     /* Must be done before init_buffer */
       init_casetab_once ();
-      init_buffer_once ();     /* Create buffer table and some buffers */
-      init_minibuf_once ();    /* Create list of minibuffers */
-                               /* Must precede init_window_once */
-      
+      init_buffer_once ();     /* Create buffer table and some buffers */
+      init_minibuf_once ();    /* Create list of minibuffers */
+                               /* Must precede init_window_once */
+
       /* Call syms_of_xfaces before init_window_once because that
         function creates Vterminal_frame.  Termcap frames now use
         faces, and the face implementation uses some symbols as
         face names.  */
-#ifndef HAVE_NTGUI
       syms_of_xfaces ();
+      /* Call syms_of_keyboard before init_window_once because
+        keyboard sets up symbols that include some face names that
+        the X support will want to use.  This can happen when
+        CANNOT_DUMP is defined.  */
+      syms_of_keyboard ();
+
+#ifdef MAC_OS8
+      /* init_window_once calls make_terminal_frame which on Mac OS
+         creates a full-fledge output_mac type frame.  This does not
+         work correctly before syms_of_textprop, syms_of_macfns,
+         syms_of_ccl, syms_of_fontset, syms_of_xterm, syms_of_search,
+         syms_of_frame, mac_initialize, and init_keyboard have already
+         been called.  */
+      syms_of_textprop ();
+      syms_of_macfns ();
+      syms_of_ccl ();
+      syms_of_fontset ();
+      syms_of_macterm ();
+      syms_of_macmenu ();
+      syms_of_data ();
+      syms_of_search ();
+      syms_of_frame ();
+
+      mac_initialize ();
+      init_keyboard ();
 #endif
 
-      init_window_once ();     /* Init the window system */
+      init_window_once ();     /* Init the window system */
       init_fileio_once ();     /* Must precede any path manipulation.  */
     }
 
@@ -1038,28 +1247,24 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
     }
 
   init_eval ();
-  init_coding ();
   init_data ();
 #ifdef CLASH_DETECTION
-  init_filelock ();;
+  init_filelock ();
 #endif
+  init_atimer ();
   running_asynch_code = 0;
 
   /* Handle --unibyte and the EMACS_UNIBYTE envvar,
      but not while dumping.  */
-  if (
-#ifndef CANNOT_DUMP
-      ! noninteractive || initialized
-#else
-      1
-#endif
-      )
+  if (1)
     {
       int inhibit_unibyte = 0;
 
       /* --multibyte overrides EMACS_UNIBYTE.  */
       if (argmatch (argv, argc, "-no-unibyte", "--no-unibyte", 4, NULL, &skip_args)
-         || argmatch (argv, argc, "-multibyte", "--multibyte", 4, NULL, &skip_args))
+         || argmatch (argv, argc, "-multibyte", "--multibyte", 4, NULL, &skip_args)
+         /* Ignore EMACS_UNIBYTE before dumping.  */
+         || (!initialized && noninteractive))
        inhibit_unibyte = 1;
 
       /* --unibyte requests that we set up to do everything with single-byte
@@ -1071,7 +1276,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
         aren't now decoded; also existing buffers are now made
         unibyte during startup if .emacs sets unibyte.  Tested with
         8-bit data in environment variables and /etc/passwd, setting
-        unibyte and Latin-1 in .emacs. -- Dave Love */
+        unibyte and Latin-1 in .emacs. -- Dave Love  */
       if (argmatch (argv, argc, "-unibyte", "--unibyte", 4, NULL, &skip_args)
          || argmatch (argv, argc, "-no-multibyte", "--no-multibyte", 4, NULL, &skip_args)
          || (getenv ("EMACS_UNIBYTE") && !inhibit_unibyte))
@@ -1108,7 +1313,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
     }
 
   no_loadup
-    = !argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
+    = argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
 
 
 #ifdef HAVE_X_WINDOWS
@@ -1177,9 +1382,15 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
 #endif /* MSDOS */
 
 #ifdef WINDOWSNT
+  globals_of_w32 ();
   /* Initialize environment from registry settings.  */
   init_environment (argv);
-  init_ntproc ();      /* must precede init_editfns */
+  init_ntproc ();      /* must precede init_editfns.  */
+#endif
+
+#ifdef HAVE_CARBON
+  if (initialized)
+    init_mac_osx_environment ();
 #endif
 
   /* egetenv is a pretty low-level facility, which may get called in
@@ -1194,14 +1405,14 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
   putenv ("LANG=C");
 #endif
 
-  init_buffer ();      /* Init default directory of main buffer */
+  init_buffer ();      /* Init default directory of main buffer */
 
   init_callproc_1 ();  /* Must precede init_cmdargs and init_sys_modes.  */
   init_cmdargs (argc, argv, skip_args);        /* Must precede init_lread.  */
 
   if (initialized)
     {
-      /* Erase any pre-dump messages in the message log, to avoid confusion */
+      /* Erase any pre-dump messages in the message log, to avoid confusion */
       Lisp_Object old_log_max;
       old_log_max = Vmessage_log_max;
       XSETFASTINT (Vmessage_log_max, 0);
@@ -1217,10 +1428,13 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
 
   if (!initialized)
     {
-      /* The basic levels of Lisp must come first */
+      /* The basic levels of Lisp must come first */
       /* And data must come first of all
-        for the sake of symbols like error-message */
+        for the sake of symbols like error-message.  */
+#ifndef MAC_OS8
+      /* Called before init_window_once for Mac OS Classic.  */
       syms_of_data ();
+#endif
       syms_of_alloc ();
       syms_of_lread ();
       syms_of_print ();
@@ -1236,7 +1450,10 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
       syms_of_casetab ();
       syms_of_callproc ();
       syms_of_category ();
+#ifndef MAC_OS8
+      /* Called before init_window_once for Mac OS Classic.  */
       syms_of_ccl ();
+#endif
       syms_of_charset ();
       syms_of_cmds ();
 #ifndef NO_DIR_LIBRARY
@@ -1253,23 +1470,27 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
 #endif /* CLASH_DETECTION */
       syms_of_indent ();
       syms_of_insdel ();
-      syms_of_keyboard ();
       syms_of_keymap ();
       syms_of_macros ();
       syms_of_marker ();
       syms_of_minibuf ();
-      syms_of_mocklisp ();
       syms_of_process ();
+#ifndef MAC_OS8
+      /* Called before init_window_once for Mac OS Classic.  */
       syms_of_search ();
       syms_of_frame ();
+#endif
       syms_of_syntax ();
       syms_of_term ();
       syms_of_undo ();
 #ifdef HAVE_SOUND
       syms_of_sound ();
 #endif
-
+#ifndef MAC_OS8
+      /* Called before init_window_once for Mac OS Classic.  */
       syms_of_textprop ();
+#endif
+      syms_of_composite ();
 #ifdef VMS
       syms_of_vmsproc ();
 #endif /* VMS */
@@ -1282,24 +1503,36 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
       syms_of_xterm ();
       syms_of_xfns ();
       syms_of_fontset ();
+#ifdef HAVE_X_SM
+      syms_of_xsmfns ();
+#endif
 #ifdef HAVE_X11
       syms_of_xselect ();
 #endif
 #endif /* HAVE_X_WINDOWS */
 
 #ifndef HAVE_NTGUI
+#ifndef MAC_OS
+      /* Called before init_window_once for Mac OS Classic.  */
       syms_of_xmenu ();
 #endif
+#endif
 
 #ifdef HAVE_NTGUI
       syms_of_w32term ();
       syms_of_w32fns ();
-      syms_of_w32faces ();
       syms_of_w32select ();
       syms_of_w32menu ();
       syms_of_fontset ();
 #endif /* HAVE_NTGUI */
 
+#ifdef HAVE_CARBON
+      syms_of_macterm ();
+      syms_of_macfns ();
+      syms_of_macmenu ();
+      syms_of_fontset ();
+#endif /* HAVE_CARBON */
+
 #ifdef SYMS_SYSTEM
       SYMS_SYSTEM;
 #endif
@@ -1313,34 +1546,43 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
       keys_of_buffer ();
       keys_of_keyboard ();
       keys_of_keymap ();
-      keys_of_macros ();
       keys_of_minibuf ();
       keys_of_window ();
-      keys_of_frame ();
+    }
+       else
+    {
+      /*
+        Initialization that must be done even if the global variable
+        initialized is non zero
+      */
+#ifdef HAVE_NTGUI
+      globals_of_w32fns ();
+      globals_of_w32menu ();
+#endif  /* end #ifdef HAVE_NTGUI */
     }
 
+#ifndef MAC_OS8
+  /* Called before init_window_once for Mac OS Classic.  */
+  init_keyboard ();    /* This too must precede init_sys_modes.  */
+#endif
+#ifdef VMS
+  init_vmsproc ();     /* And this too.  */
+#endif /* VMS */
   if (!noninteractive)
     {
 #ifdef VMS
-      init_vms_input ();/* init_display calls get_frame_size, that needs this */
+      init_vms_input ();/* init_display calls get_tty_size, that needs this.  */
 #endif /* VMS */
-      init_display (); /* Determine terminal type.  init_sys_modes uses results */
+      init_display (); /* Determine terminal type.  Calls init_sys_modes.  */
     }
-  init_keyboard ();    /* This too must precede init_sys_modes */
-#ifdef VMS
-  init_vmsproc ();     /* And this too. */
-#endif /* VMS */
-  init_sys_modes ();   /* Init system terminal modes (RAW or CBREAK, etc.) */
-#ifdef HAVE_X_WINDOWS
+#if defined (HAVE_X_WINDOWS) || defined (WINDOWSNT)
   init_xfns ();
 #endif /* HAVE_X_WINDOWS */
   init_fns ();
   init_xdisp ();
   init_macros ();
   init_editfns ();
-#ifdef LISP_FLOAT_TYPE
   init_floatfns ();
-#endif
 #ifdef VMS
   init_vmsfns ();
 #endif /* VMS */
@@ -1348,20 +1590,19 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
 #ifdef HAVE_SOUND
   init_sound ();
 #endif
+  init_window ();
 
   if (!initialized)
     {
       char *file;
-      /* Handle -l loadup, args passed by Makefile. */
+      /* Handle -l loadup, args passed by Makefile.  */
       if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
        Vtop_level = Fcons (intern ("load"),
                            Fcons (build_string (file), Qnil));
-#ifdef CANNOT_DUMP
       /* Unless next switch is -nl, load "loadup.el" first thing.  */
       if (! no_loadup)
        Vtop_level = Fcons (intern ("load"),
                            Fcons (build_string ("loadup.el"), Qnil));
-#endif /* CANNOT_DUMP */
     }
 
   if (initialized)
@@ -1384,20 +1625,20 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
 #endif
     }
 
-  /* Gerd Moellmann <gerd@acm.org> says this makes profiling work on
-     FreeBSD.  It might work on some other systems too.
-     Give it a try and tell me if it works on your system.  */
+  /* Set up for profiling.  This is known to work on FreeBSD and
+     GNU/Linux.  It might work on some other systems too.  Give it a
+     try and tell us if it works on your system.  To compile for
+     profiling use something like `make CFLAGS="-pg -g -O -DPROFILING=1'.  */
 #if defined (__FreeBSD__) || defined (__linux)
 #ifdef PROFILING
   if (initialized)
     {
-      extern void _mcleanup ();       
+      extern void _mcleanup ();
       extern char etext;
       extern void safe_bcopy ();
       extern void dump_opcode_frequencies ();
 
       atexit (_mcleanup);
-      // atexit (dump_opcode_frequencies);
       /* This uses safe_bcopy because that function comes first in the
         Emacs executable.  It might be better to use something that
         gives the start of the text segment, but start_of_text is not
@@ -1416,13 +1657,14 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
      zone rather than looking it up every time.  Since localtime() is
      called to bolt the undumping time into the undumped emacs, this
      results in localtime ignoring the TZ environment variable.
-     This flushes the new TZ value into localtime. */
+     This flushes the new TZ value into localtime.  */
   tzset ();
 #endif /* defined (LOCALTIME_CACHE) */
 
   /* Enter editor command loop.  This never returns.  */
   Frecursive_edit ();
   /* NOTREACHED */
+  return 0;
 }
 \f
 /* Sort the args so we can find the most important ones
@@ -1448,16 +1690,16 @@ struct standard_args standard_args[] =
   { "-map", "--map-data", 130, 0 },
 #endif
   { "-t", "--terminal", 120, 1 },
+  { "-nw", "--no-window-system", 110, 0 },
   { "-nw", "--no-windows", 110, 0 },
   { "-batch", "--batch", 100, 0 },
+  { "-script", "--script", 100, 1 },
   { "-help", "--help", 90, 0 },
   { "-no-unibyte", "--no-unibyte", 83, 0 },
   { "-multibyte", "--multibyte", 82, 0 },
   { "-unibyte", "--unibyte", 81, 0 },
   { "-no-multibyte", "--no-multibyte", 80, 0 },
-#ifdef CANNOT_DUMP
   { "-nl", "--no-loadup", 70, 0 },
-#endif
   /* -d must come last before the options handled in startup.el.  */
   { "-d", "--display", 60, 1 },
   { "-display", 0, 60, 1 },
@@ -1465,6 +1707,7 @@ struct standard_args standard_args[] =
   { "-q", "--no-init-file", 50, 0 },
   { "-no-init-file", 0, 50, 0 },
   { "-no-site-file", "--no-site-file", 40, 0 },
+  { "-no-splash", "--no-splash", 40, 0 },
   { "-u", "--user", 30, 1 },
   { "-user", 0, 30, 1 },
   { "-debug-init", "--debug-init", 20, 0 },
@@ -1482,6 +1725,9 @@ struct standard_args standard_args[] =
   { "-cr", "--cursor-color", 10, 1 },
   { "-fn", "--font", 10, 1 },
   { "-font", 0, 10, 1 },
+  { "-fs", "--fullscreen", 10, 0 },
+  { "-fw", "--fullwidth", 10, 0 },
+  { "-fh", "--fullheight", 10, 0 },
   { "-g", "--geometry", 10, 1 },
   { "-geometry", 0, 10, 1 },
   { "-T", "--title", 10, 1 },
@@ -1493,6 +1739,7 @@ struct standard_args standard_args[] =
   { "-reverse", 0, 5, 0 },
   { "-hb", "--horizontal-scroll-bars", 5, 0 },
   { "-vb", "--vertical-scroll-bars", 5, 0 },
+  { "-color", "--color", 5, 0},
   /* These have the same priority as ordinary file name args,
      so they are not reordered with respect to those.  */
   { "-L", "--directory", 0, 1 },
@@ -1634,7 +1881,7 @@ sort_args (argc, argv)
          if (options[from] > 0)
            from += options[from];
        }
-           
+
       if (best < 0)
        abort ();
 
@@ -1662,19 +1909,20 @@ sort_args (argc, argv)
 
   bcopy (new, argv, sizeof (char *) * argc);
 
-  free (options);
-  free (new);
-  free (priority);
+  xfree (options);
+  xfree (new);
+  xfree (priority);
 }
 \f
 DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
-  "Exit the Emacs job and kill it.\n\
-If ARG is an integer, return ARG as the exit program code.\n\
-If ARG is a  string, stuff it as keyboard input.\n\n\
-The value of `kill-emacs-hook', if not void,\n\
-is a list of functions (of no args),\n\
-all of which are called before Emacs is actually killed.")
-  (arg)
+       doc: /* Exit the Emacs job and kill it.
+If ARG is an integer, return ARG as the exit program code.
+If ARG is a  string, stuff it as keyboard input.
+
+The value of `kill-emacs-hook', if not void,
+is a list of functions (of no args),
+all of which are called before Emacs is actually killed.  */)
+     (arg)
      Lisp_Object arg;
 {
   struct gcpro gcpro1;
@@ -1701,7 +1949,7 @@ all of which are called before Emacs is actually killed.")
      kill it because we are exiting Emacs deliberately (not crashing).
      Do it after shut_down_emacs, which does an auto-save.  */
   if (STRINGP (Vauto_save_list_file_name))
-    unlink (XSTRING (Vauto_save_list_file_name)->data);
+    unlink (SDATA (Vauto_save_list_file_name));
 
   exit (INTEGERP (arg) ? XINT (arg)
 #ifdef VMS
@@ -1733,7 +1981,7 @@ shut_down_emacs (sig, no_x, stuff)
   /* Prevent running of hooks from now on.  */
   Vrun_hooks = Qnil;
 
-  /* If we are controlling the terminal, reset terminal modes */
+  /* If we are controlling the terminal, reset terminal modes */
 #ifdef EMACS_HAVE_TTY_PGRP
   {
     int pgrp = EMACS_GETPGRP (0);
@@ -1743,14 +1991,14 @@ shut_down_emacs (sig, no_x, stuff)
        && tpgrp == pgrp)
       {
        fflush (stdout);
-       reset_sys_modes ();
+       reset_all_sys_modes ();
        if (sig && sig != SIGTERM)
-         fprintf (stderr, "Fatal error (%d).", sig);
+         fprintf (stderr, "Fatal error (%d)", sig);
       }
   }
 #else
   fflush (stdout);
-  reset_sys_modes ();
+  reset_all_sys_modes ();
 #endif
 
   stuff_buffered_input (stuff);
@@ -1770,8 +2018,8 @@ shut_down_emacs (sig, no_x, stuff)
 #ifdef HAVE_X_WINDOWS
   /* It's not safe to call intern here.  Maybe we are crashing.  */
   if (!noninteractive && SYMBOLP (Vwindow_system)
-      && XSYMBOL (Vwindow_system)->name->size == 1
-      && XSYMBOL (Vwindow_system)->name->data[0] == 'x'
+      && SCHARS (SYMBOL_NAME (Vwindow_system)) == 1
+      && SREF (SYMBOL_NAME (Vwindow_system), 0) == 'x'
       && ! no_x)
     Fx_close_current_connection ();
 #endif /* HAVE_X_WINDOWS */
@@ -1788,8 +2036,13 @@ shut_down_emacs (sig, no_x, stuff)
   term_ntproc ();
 #endif
 
-  check_glyph_memory ();
-  check_message_stack ();
+  /* Do this only if terminating normally, we want glyph matrices
+     etc. in a core dump.  */
+  if (sig == 0 || sig == SIGTERM)
+    {
+      check_glyph_memory ();
+      check_message_stack ();
+    }
 
 #ifdef MSDOS
   dos_cleanup ();
@@ -1803,27 +2056,28 @@ shut_down_emacs (sig, no_x, stuff)
 #ifdef HAVE_SHM
 
 DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0,
-  "Dump current state of Emacs into data file FILENAME.\n\
-This function exists on systems that use HAVE_SHM.")
-  (filename)
+       doc: /* Dump current state of Emacs into data file FILENAME.
+This function exists on systems that use HAVE_SHM.  */)
+     (filename)
      Lisp_Object filename;
 {
   extern char my_edata[];
   Lisp_Object tem;
 
-  CHECK_STRING (filename, 0);
+  check_pure_size ();
+  CHECK_STRING (filename);
   filename = Fexpand_file_name (filename, Qnil);
 
   tem = Vpurify_flag;
   Vpurify_flag = Qnil;
 
   fflush (stdout);
-  /* Tell malloc where start of impure now is */
+  /* Tell malloc where start of impure now is */
   /* Also arrange for warnings when nearly out of space.  */
 #ifndef SYSTEM_MALLOC
   memory_warnings (my_edata, malloc_warning);
 #endif
-  map_out_data (XSTRING (filename)->data);
+  map_out_data (SDATA (filename));
 
   Vpurify_flag = tem;
 
@@ -1833,18 +2087,20 @@ This function exists on systems that use HAVE_SHM.")
 #else /* not HAVE_SHM */
 
 DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
-  "Dump current state of Emacs into executable file FILENAME.\n\
-Take symbols from SYMFILE (presumably the file you executed to run Emacs).\n\
-This is used in the file `loadup.el' when building Emacs.\n\
-\n\
-You must run Emacs in batch mode in order to dump it.")
-  (filename, symfile)
+       doc: /* Dump current state of Emacs into executable file FILENAME.
+Take symbols from SYMFILE (presumably the file you executed to run Emacs).
+This is used in the file `loadup.el' when building Emacs.
+
+You must run Emacs in batch mode in order to dump it.  */)
+     (filename, symfile)
      Lisp_Object filename, symfile;
 {
   extern char my_edata[];
   Lisp_Object tem;
   Lisp_Object symbol;
-  int count = specpdl_ptr - specpdl;
+  int count = SPECPDL_INDEX ();
+
+  check_pure_size ();
 
   if (! noninteractive)
     error ("Dumping Emacs works only in batch mode");
@@ -1852,15 +2108,15 @@ You must run Emacs in batch mode in order to dump it.")
   /* Bind `command-line-processed' to nil before dumping,
      so that the dumped Emacs will process its command line
      and set up to work with X windows if appropriate.  */
-  symbol = intern ("command-line-process");
+  symbol = intern ("command-line-processed");
   specbind (symbol, Qnil);
 
-  CHECK_STRING (filename, 0);
+  CHECK_STRING (filename);
   filename = Fexpand_file_name (filename, Qnil);
   if (!NILP (symfile))
     {
-      CHECK_STRING (symfile, 0);
-      if (XSTRING (symfile)->size)
+      CHECK_STRING (symfile);
+      if (SCHARS (symfile))
        symfile = Fexpand_file_name (symfile, Qnil);
     }
 
@@ -1877,9 +2133,9 @@ You must run Emacs in batch mode in order to dump it.")
 
   fflush (stdout);
 #ifdef VMS
-  mapout_data (XSTRING (filename)->data);
+  mapout_data (SDATA (filename));
 #else
-  /* Tell malloc where start of impure now is */
+  /* Tell malloc where start of impure now is */
   /* Also arrange for warnings when nearly out of space.  */
 #ifndef SYSTEM_MALLOC
 #ifndef WINDOWSNT
@@ -1891,8 +2147,15 @@ You must run Emacs in batch mode in order to dump it.")
 #ifdef DOUG_LEA_MALLOC
   malloc_state_ptr = malloc_get_state ();
 #endif
-  unexec (XSTRING (filename)->data,
-         !NILP (symfile) ? XSTRING (symfile)->data : 0, my_edata, 0, 0);
+
+#ifdef USE_MMAP_FOR_BUFFERS
+  mmap_set_vars (0);
+#endif
+  unexec (SDATA (filename),
+         !NILP (symfile) ? SDATA (symfile) : 0, my_edata, 0, 0);
+#ifdef USE_MMAP_FOR_BUFFERS
+  mmap_set_vars (1);
+#endif
 #ifdef DOUG_LEA_MALLOC
   free (malloc_state_ptr);
 #endif
@@ -1929,7 +2192,7 @@ synchronize_locale (category, plocale, desired_locale)
     {
       *plocale = desired_locale;
       setlocale (category, (STRINGP (desired_locale)
-                           ? (char *)(XSTRING (desired_locale)->data)
+                           ? (char *)(SDATA (desired_locale))
                            : ""));
     }
 }
@@ -1999,6 +2262,17 @@ decode_env_path (evarname, defalt)
       /* Add /: to the front of the name
         if it would otherwise be treated as magic.  */
       tem = Ffind_file_name_handler (element, Qt);
+
+      /* However, if the handler says "I'm safe",
+        don't bother adding /:.  */
+      if (SYMBOLP (tem))
+       {
+         Lisp_Object prop;
+         prop = Fget (tem, intern ("safe-magic"));
+         if (! NILP (prop))
+           tem = Qnil;
+       }
+
       if (! NILP (tem))
        element = concat2 (build_string ("/:"), element);
 
@@ -2031,88 +2305,99 @@ syms_of_emacs ()
   defsubr (&Sinvocation_directory);
 
   DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
-    "Args passed by shell to Emacs, as a list of strings.");
+              doc: /* Args passed by shell to Emacs, as a list of strings.
+Many arguments are deleted from the list as they are processed.  */);
 
   DEFVAR_LISP ("system-type", &Vsystem_type,
-    "Value is symbol indicating type of operating system you are using.");
+              doc: /* Value is symbol indicating type of operating system you are using.  */);
   Vsystem_type = intern (SYSTEM_TYPE);
 
   DEFVAR_LISP ("system-configuration", &Vsystem_configuration,
-    "Value is string indicating configuration Emacs was built for.");
+              doc: /* Value is string indicating configuration Emacs was built for.
+On MS-Windows, the value reflects the OS flavor and version on which
+Emacs is running.  */);
   Vsystem_configuration = build_string (EMACS_CONFIGURATION);
 
   DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options,
-    "String containing the configuration options Emacs was built with.");
+              doc: /* String containing the configuration options Emacs was built with.  */);
   Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
 
   DEFVAR_BOOL ("noninteractive", &noninteractive1,
-    "Non-nil means Emacs is running without interactive terminal.");
+              doc: /* Non-nil means Emacs is running without interactive terminal.  */);
 
   DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
-    "Hook to be run whenever kill-emacs is called.\n\
-Since kill-emacs may be invoked when the terminal is disconnected (or\n\
-in other similar situations), functions placed on this hook should not\n\
-expect to be able to interact with the user.  To ask for confirmation,\n\
-see `kill-emacs-query-functions' instead.");
+              doc: /* Hook to be run when kill-emacs is called.
+Since `kill-emacs' may be invoked when the terminal is disconnected (or
+in other similar situations), functions placed on this hook should not
+expect to be able to interact with the user.  To ask for confirmation,
+see `kill-emacs-query-functions' instead.
+
+The hook is not run in batch mode, i.e., if `noninteractive' is non-nil.  */);
   Vkill_emacs_hook = Qnil;
 
+  empty_string = build_string ("");
+  staticpro (&empty_string);
+
 #ifdef SIGUSR1
   DEFVAR_LISP ("signal-USR1-hook", &Vsignal_USR1_hook,
-    "Hook to be run whenever emacs receives a USR1 signal");
+              doc: /* Hook to be run whenever emacs receives a USR1 signal.  */);
   Vsignal_USR1_hook = Qnil;
 #ifdef SIGUSR2
   DEFVAR_LISP ("signal-USR2-hook", &Vsignal_USR2_hook,
-    "Hook to be run whenever emacs receives a USR2 signal");
+              doc: /* Hook to be run whenever emacs receives a USR2 signal.  */);
   Vsignal_USR2_hook = Qnil;
 #endif
 #endif
 
 
   DEFVAR_INT ("emacs-priority", &emacs_priority,
-    "Priority for Emacs to run at.\n\
-This value is effective only if set before Emacs is dumped,\n\
-and only if the Emacs executable is installed with setuid to permit\n\
-it to change priority.  (Emacs sets its uid back to the real uid.)\n\
-Currently, you need to define SET_EMACS_PRIORITY in `config.h'\n\
-before you compile Emacs, to enable the code for this feature.");
+             doc: /* Priority for Emacs to run at.
+This value is effective only if set before Emacs is dumped,
+and only if the Emacs executable is installed with setuid to permit
+it to change priority.  (Emacs sets its uid back to the real uid.)
+Currently, you need to define SET_EMACS_PRIORITY in `config.h'
+before you compile Emacs, to enable the code for this feature.  */);
   emacs_priority = 0;
 
   DEFVAR_LISP ("path-separator", &Vpath_separator,
-    "The directory separator in search paths, as a string.");
+              doc: /* The directory separator in search paths, as a string.  */);
   {
     char c = SEPCHAR;
     Vpath_separator = make_string (&c, 1);
   }
 
   DEFVAR_LISP ("invocation-name", &Vinvocation_name,
-    "The program name that was used to run Emacs.\n\
-Any directory names are omitted.");
+              doc: /* The program name that was used to run Emacs.
+Any directory names are omitted.  */);
 
   DEFVAR_LISP ("invocation-directory", &Vinvocation_directory,
-    "The directory in which the Emacs executable was found, to run it.\n\
-The value is nil if that directory's name is not known.");
+              doc: /* The directory in which the Emacs executable was found, to run it.
+The value is nil if that directory's name is not known.  */);
 
   DEFVAR_LISP ("installation-directory", &Vinstallation_directory,
-    "A directory within which to look for the `lib-src' and `etc' directories.\n\
-This is non-nil when we can't find those directories in their standard\n\
-installed locations, but we can find them\n\
-near where the Emacs executable was found.");
+              doc: /* A directory within which to look for the `lib-src' and `etc' directories.
+This is non-nil when we can't find those directories in their standard
+installed locations, but we can find them
+near where the Emacs executable was found.  */);
   Vinstallation_directory = Qnil;
 
   DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale,
-    "System locale for messages.");
+              doc: /* System locale for messages.  */);
   Vsystem_messages_locale = Qnil;
 
   DEFVAR_LISP ("previous-system-messages-locale",
-    &Vprevious_system_messages_locale,
-    "Most recently used system locale for messages.");
+              &Vprevious_system_messages_locale,
+              doc: /* Most recently used system locale for messages.  */);
   Vprevious_system_messages_locale = Qnil;
 
   DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale,
-    "System locale for time.");
+              doc: /* System locale for time.  */);
   Vsystem_time_locale = Qnil;
 
   DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale,
-    "Most recently used system locale for time.");
+              doc: /* Most recently used system locale for time.  */);
   Vprevious_system_time_locale = Qnil;
 }
+
+/* arch-tag: 7bfd356a-c720-4612-8ab6-aa4222931c2e
+   (do not change this comment) */