Contents in 1999-06-04-13 of release-21-2.
[chise/xemacs-chise.git.1] / src / emacs.c
index edad0fc..c3fc9fc 100644 (file)
@@ -35,14 +35,18 @@ Boston, MA 02111-1307, USA.  */
 #include "commands.h"
 #include "console.h"
 #include "process.h"
 #include "commands.h"
 #include "console.h"
 #include "process.h"
+#include "redisplay.h"
 #include "sysdep.h"
 
 #include "sysdep.h"
 
-#include <setjmp.h>
 #include "syssignal.h" /* Always include before systty.h */
 #include "systty.h"
 #include "sysfile.h"
 #include "systime.h"
 
 #include "syssignal.h" /* Always include before systty.h */
 #include "systty.h"
 #include "sysfile.h"
 #include "systime.h"
 
+#ifdef QUANTIFY
+#include <quantify.h>
+#endif
+
 #ifdef HAVE_SHLIB
 #include "sysdll.h"
 #endif
 #ifdef HAVE_SHLIB
 #include "sysdll.h"
 #endif
@@ -69,6 +73,10 @@ Boston, MA 02111-1307, USA.  */
 /* For PATH_EXEC */
 #include <paths.h>
 
 /* For PATH_EXEC */
 #include <paths.h>
 
+#ifdef HEAP_IN_DATA
+void report_sheap_usage (int die_if_pure_storage_exceeded);
+#endif
+
 #if !defined SYSTEM_MALLOC && !defined DOUG_LEA_MALLOC
 extern void *(*__malloc_hook)(size_t);
 extern void *(*__realloc_hook)(void *, size_t);
 #if !defined SYSTEM_MALLOC && !defined DOUG_LEA_MALLOC
 extern void *(*__malloc_hook)(size_t);
 extern void *(*__realloc_hook)(void *, size_t);
@@ -107,6 +115,7 @@ Lisp_Object Vsystem_configuration_options;
 /* Version numbers and strings */
 Lisp_Object Vemacs_major_version;
 Lisp_Object Vemacs_minor_version;
 /* Version numbers and strings */
 Lisp_Object Vemacs_major_version;
 Lisp_Object Vemacs_minor_version;
+Lisp_Object Vemacs_patch_level;
 Lisp_Object Vemacs_beta_version;
 Lisp_Object Vxemacs_codename;
 #ifdef INFODOCK
 Lisp_Object Vemacs_beta_version;
 Lisp_Object Vxemacs_codename;
 #ifdef INFODOCK
@@ -135,6 +144,8 @@ Lisp_Object Vemacs_program_name, Vemacs_program_version;
 Lisp_Object Vexec_path;
 Lisp_Object Vexec_directory, Vconfigure_exec_directory;
 Lisp_Object Vlisp_directory, Vconfigure_lisp_directory;
 Lisp_Object Vexec_path;
 Lisp_Object Vexec_directory, Vconfigure_exec_directory;
 Lisp_Object Vlisp_directory, Vconfigure_lisp_directory;
+Lisp_Object Vmodule_directory, Vconfigure_module_directory;
+Lisp_Object Vsite_module_directory, Vconfigure_site_module_directory;
 Lisp_Object Vconfigure_package_path;
 Lisp_Object Vdata_directory, Vconfigure_data_directory;
 Lisp_Object Vdoc_directory, Vconfigure_doc_directory;
 Lisp_Object Vconfigure_package_path;
 Lisp_Object Vdata_directory, Vconfigure_data_directory;
 Lisp_Object Vdoc_directory, Vconfigure_doc_directory;
@@ -197,6 +208,9 @@ int noninteractive1;
 /* Nonzero means don't perform site-lisp searches at startup */
 int inhibit_site_lisp;
 
 /* Nonzero means don't perform site-lisp searches at startup */
 int inhibit_site_lisp;
 
+/* Nonzero means don't perform site-modules searches at startup */
+int inhibit_site_modules;
+
 /* Nonzero means don't respect early packages at startup */
 int inhibit_early_packages;
 
 /* Nonzero means don't respect early packages at startup */
 int inhibit_early_packages;
 
@@ -212,11 +226,11 @@ int initial_argc;
 
 static void sort_args (int argc, char **argv);
 
 
 static void sort_args (int argc, char **argv);
 
-extern int always_gc;           /* hack */
-
 Lisp_Object Qkill_emacs_hook;
 Lisp_Object Qsave_buffers_kill_emacs;
 
 Lisp_Object Qkill_emacs_hook;
 Lisp_Object Qsave_buffers_kill_emacs;
 
+extern Lisp_Object Vlisp_EXEC_SUFFIXES;
+
 \f
 /* Signal code for the fatal signal that was received */
 static int fatal_error_code;
 \f
 /* Signal code for the fatal signal that was received */
 static int fatal_error_code;
@@ -445,7 +459,7 @@ Return the directory name in which the Emacs executable was located.
 #endif
 
 #if defined (MULE) && defined (MSDOS) && defined (EMX)
 #endif
 
 #if defined (MULE) && defined (MSDOS) && defined (EMX)
-/* Setup all of files be input/output'ed with binary translation mdoe. */
+/* Setup all of files be input/output'ed with binary translation mode. */
 asm (" .text");
 asm ("L_setbinmode:");
 asm (" movl    $1, __fmode_bin");
 asm (" .text");
 asm ("L_setbinmode:");
 asm (" movl    $1, __fmode_bin");
@@ -519,7 +533,10 @@ argmatch (char **argv, int argc, char *sstr, char *lstr,
 /* Make stack traces always identify version + configuration */
 #define main_1 STACK_TRACE_EYE_CATCHER
 
 /* Make stack traces always identify version + configuration */
 #define main_1 STACK_TRACE_EYE_CATCHER
 
-static DOESNT_RETURN
+/* This function is not static, so that the compiler is less likely to
+   inline it, which would make it not show up in stack traces.  */
+DECLARE_DOESNT_RETURN (main_1 (int, char **, char **, int));
+DOESNT_RETURN
 main_1 (int argc, char **argv, char **envp, int restart)
 {
   char stack_bottom_variable;
 main_1 (int argc, char **argv, char **envp, int restart)
 {
   char stack_bottom_variable;
@@ -700,6 +717,16 @@ main_1 (int argc, char **argv, char **envp, int restart)
       inhibit_early_packages = 1;
       skip_args--;
     }
       inhibit_early_packages = 1;
       skip_args--;
     }
+#ifdef HAVE_SHLIB
+  if (argmatch (argv, argc, "-no-site-modules", "--no-site-modules",
+               9, NULL, &skip_args))
+    {
+      inhibit_site_modules = 1;
+      skip_args--;
+    }
+#else
+  inhibit_site_modules = 1;
+#endif
   if (argmatch (argv, argc, "-vanilla", "--vanilla",
                7, NULL, &skip_args))
     {
   if (argmatch (argv, argc, "-vanilla", "--vanilla",
                7, NULL, &skip_args))
     {
@@ -886,14 +913,14 @@ main_1 (int argc, char **argv, char **envp, int restart)
       syms_of_dialog ();
 #endif
       syms_of_dired ();
       syms_of_dialog ();
 #endif
       syms_of_dired ();
-#ifdef HAVE_SHLIB
-      syms_of_dll ();
-#endif
       syms_of_doc ();
       syms_of_editfns ();
       syms_of_elhash ();
       syms_of_emacs ();
       syms_of_eval ();
       syms_of_doc ();
       syms_of_editfns ();
       syms_of_elhash ();
       syms_of_emacs ();
       syms_of_eval ();
+#ifdef HAVE_X_WINDOWS
+      syms_of_event_Xt ();
+#endif
 #ifdef HAVE_DRAGNDROP
       syms_of_dragdrop ();
 #endif
 #ifdef HAVE_DRAGNDROP
       syms_of_dragdrop ();
 #endif
@@ -912,6 +939,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       syms_of_general ();
       syms_of_glyphs ();
       syms_of_glyphs_eimage ();
       syms_of_general ();
       syms_of_glyphs ();
       syms_of_glyphs_eimage ();
+      syms_of_glyphs_widget ();
 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
       syms_of_gui ();
 #endif
 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
       syms_of_gui ();
 #endif
@@ -929,6 +957,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
       syms_of_menubar ();
 #endif
       syms_of_minibuf ();
       syms_of_menubar ();
 #endif
       syms_of_minibuf ();
+#ifdef HAVE_SHLIB
+      syms_of_module ();
+#endif
       syms_of_objects ();
       syms_of_print ();
 #if !defined (NO_SUBPROCESSES)
       syms_of_objects ();
       syms_of_print ();
 #if !defined (NO_SUBPROCESSES)
@@ -944,6 +975,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       syms_of_rangetab ();
       syms_of_redisplay ();
       syms_of_search ();
       syms_of_rangetab ();
       syms_of_redisplay ();
       syms_of_search ();
+      syms_of_select ();
       syms_of_signal ();
       syms_of_sound ();
       syms_of_specifier ();
       syms_of_signal ();
       syms_of_sound ();
       syms_of_specifier ();
@@ -964,12 +996,12 @@ main_1 (int argc, char **argv, char **envp, int restart)
       syms_of_device_tty ();
       syms_of_objects_tty ();
 #endif
       syms_of_device_tty ();
       syms_of_objects_tty ();
 #endif
+
 #ifdef HAVE_X_WINDOWS
       syms_of_device_x ();
 #ifdef HAVE_DIALOGS
       syms_of_dialog_x ();
 #endif
 #ifdef HAVE_X_WINDOWS
       syms_of_device_x ();
 #ifdef HAVE_DIALOGS
       syms_of_dialog_x ();
 #endif
-      syms_of_event_Xt ();
       syms_of_frame_x ();
       syms_of_glyphs_x ();
       syms_of_objects_x ();
       syms_of_frame_x ();
       syms_of_glyphs_x ();
       syms_of_objects_x ();
@@ -985,7 +1017,6 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #ifdef HAVE_MS_WINDOWS
       syms_of_console_mswindows ();
       syms_of_device_mswindows ();
 #ifdef HAVE_MS_WINDOWS
       syms_of_console_mswindows ();
       syms_of_device_mswindows ();
-      syms_of_event_mswindows ();
       syms_of_frame_mswindows ();
       syms_of_objects_mswindows ();
       syms_of_select_mswindows ();
       syms_of_frame_mswindows ();
       syms_of_objects_mswindows ();
       syms_of_select_mswindows ();
@@ -999,6 +1030,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #ifdef HAVE_MSW_C_DIRED
       syms_of_dired_mswindows ();
 #endif
 #ifdef HAVE_MSW_C_DIRED
       syms_of_dired_mswindows ();
 #endif
+#ifdef WINDOWSNT
+      syms_of_ntproc ();
+#endif
 #endif /* HAVE_MS_WINDOWS */
 
 #ifdef MULE
 #endif /* HAVE_MS_WINDOWS */
 
 #ifdef MULE
@@ -1007,7 +1041,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       syms_of_mule_charset ();
 #endif
 #ifdef FILE_CODING
       syms_of_mule_charset ();
 #endif
 #ifdef FILE_CODING
-      syms_of_mule_coding ();
+      syms_of_file_coding ();
 #endif
 #ifdef MULE
 #ifdef HAVE_WNN
 #endif
 #ifdef MULE
 #ifdef HAVE_WNN
@@ -1026,10 +1060,6 @@ main_1 (int argc, char **argv, char **envp, int restart)
       SYMS_MACHINE;
 #endif
 
       SYMS_MACHINE;
 #endif
 
-#ifdef EMACS_BTL
-      syms_of_btl ();
-#endif
-
       /*
 #if defined (GNU_MALLOC) && \
     defined (ERROR_CHECK_MALLOC) && \
       /*
 #if defined (GNU_MALLOC) && \
     defined (ERROR_CHECK_MALLOC) && \
@@ -1083,6 +1113,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       console_type_create_device_x ();
       console_type_create_frame_x ();
       console_type_create_glyphs_x ();
       console_type_create_device_x ();
       console_type_create_frame_x ();
       console_type_create_glyphs_x ();
+      console_type_create_select_x ();
 #ifdef HAVE_MENUBARS
       console_type_create_menubar_x ();
 #endif
 #ifdef HAVE_MENUBARS
       console_type_create_menubar_x ();
 #endif
@@ -1106,6 +1137,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       console_type_create_objects_mswindows ();
       console_type_create_redisplay_mswindows ();
       console_type_create_glyphs_mswindows ();
       console_type_create_objects_mswindows ();
       console_type_create_redisplay_mswindows ();
       console_type_create_glyphs_mswindows ();
+      console_type_create_select_mswindows ();
 # ifdef HAVE_SCROLLBARS
       console_type_create_scrollbar_mswindows ();
 # endif
 # ifdef HAVE_SCROLLBARS
       console_type_create_scrollbar_mswindows ();
 # endif
@@ -1152,7 +1184,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       structure_type_create_chartab ();
       structure_type_create_faces ();
       structure_type_create_rangetab ();
       structure_type_create_chartab ();
       structure_type_create_faces ();
       structure_type_create_rangetab ();
-      structure_type_create_hashtable ();
+      structure_type_create_hash_table ();
 
       /* Now initialize the image instantiator formats and associated symbols.
          Other than the first function below, the functions may
 
       /* Now initialize the image instantiator formats and associated symbols.
          Other than the first function below, the functions may
@@ -1167,6 +1199,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
 
       image_instantiator_format_create ();
       image_instantiator_format_create_glyphs_eimage ();
 
       image_instantiator_format_create ();
       image_instantiator_format_create_glyphs_eimage ();
+      image_instantiator_format_create_glyphs_widget ();
 #ifdef HAVE_X_WINDOWS
       image_instantiator_format_create_glyphs_x ();
 #endif /* HAVE_X_WINDOWS */
 #ifdef HAVE_X_WINDOWS
       image_instantiator_format_create_glyphs_x ();
 #endif /* HAVE_X_WINDOWS */
@@ -1184,12 +1217,12 @@ main_1 (int argc, char **argv, char **envp, int restart)
 
       lstream_type_create ();
 #ifdef FILE_CODING
 
       lstream_type_create ();
 #ifdef FILE_CODING
-      lstream_type_create_mule_coding ();
+      lstream_type_create_file_coding ();
 #endif
 #if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT)
       lstream_type_create_mswindows_selectable ();
 #endif
 #endif
 #if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT)
       lstream_type_create_mswindows_selectable ();
 #endif
-      
+
       /* Initialize processes implementation.
         The functions may make exactly the following function/macro calls:
 
       /* Initialize processes implementation.
         The functions may make exactly the following function/macro calls:
 
@@ -1255,6 +1288,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       vars_of_bytecode ();
       vars_of_callint ();
       vars_of_callproc ();
       vars_of_bytecode ();
       vars_of_callint ();
       vars_of_callproc ();
+      vars_of_chartab ();
       vars_of_cmdloop ();
       vars_of_cmds ();
       vars_of_console ();
       vars_of_cmdloop ();
       vars_of_cmds ();
       vars_of_console ();
@@ -1276,7 +1310,18 @@ main_1 (int argc, char **argv, char **envp, int restart)
       vars_of_elhash ();
       vars_of_emacs ();
       vars_of_eval ();
       vars_of_elhash ();
       vars_of_emacs ();
       vars_of_eval ();
+
+#ifdef HAVE_X_WINDOWS
+      vars_of_event_Xt ();
+#endif
+#if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
+      vars_of_event_tty ();
+#endif
+#ifdef HAVE_MS_WINDOWS
+      vars_of_event_mswindows ();
+#endif
       vars_of_event_stream ();
       vars_of_event_stream ();
+
       vars_of_events ();
       vars_of_extents ();
       vars_of_faces ();
       vars_of_events ();
       vars_of_extents ();
       vars_of_faces ();
@@ -1286,6 +1331,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       vars_of_frame ();
       vars_of_glyphs ();
       vars_of_glyphs_eimage ();
       vars_of_frame ();
       vars_of_glyphs ();
       vars_of_glyphs_eimage ();
+      vars_of_glyphs_widget ();
 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
       vars_of_gui ();
 #endif
 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
       vars_of_gui ();
 #endif
@@ -1311,6 +1357,12 @@ main_1 (int argc, char **argv, char **envp, int restart)
       vars_of_menubar ();
 #endif
       vars_of_minibuf ();
       vars_of_menubar ();
 #endif
       vars_of_minibuf ();
+#ifdef HAVE_SHLIB
+      vars_of_module ();
+#endif
+#ifdef WINDOWSNT
+      vars_of_ntproc ();
+#endif
       vars_of_objects ();
       vars_of_print ();
 
       vars_of_objects ();
       vars_of_print ();
 
@@ -1333,6 +1385,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       vars_of_scrollbar ();
 #endif
       vars_of_search ();
       vars_of_scrollbar ();
 #endif
       vars_of_search ();
+      vars_of_select ();
       vars_of_sound ();
       vars_of_specifier ();
       vars_of_symbols ();
       vars_of_sound ();
       vars_of_specifier ();
       vars_of_symbols ();
@@ -1345,7 +1398,6 @@ main_1 (int argc, char **argv, char **envp, int restart)
 
 #ifdef HAVE_TTY
       vars_of_console_tty ();
 
 #ifdef HAVE_TTY
       vars_of_console_tty ();
-      vars_of_event_tty ();
       vars_of_frame_tty ();
       vars_of_objects_tty ();
 #endif
       vars_of_frame_tty ();
       vars_of_objects_tty ();
 #endif
@@ -1355,7 +1407,6 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #ifdef HAVE_DIALOGS
       vars_of_dialog_x ();
 #endif
 #ifdef HAVE_DIALOGS
       vars_of_dialog_x ();
 #endif
-      vars_of_event_Xt ();
       vars_of_frame_x ();
       vars_of_glyphs_x ();
 #ifdef HAVE_MENUBARS
       vars_of_frame_x ();
       vars_of_glyphs_x ();
 #ifdef HAVE_MENUBARS
@@ -1374,7 +1425,6 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #ifdef HAVE_MS_WINDOWS
       vars_of_device_mswindows ();
       vars_of_console_mswindows ();
 #ifdef HAVE_MS_WINDOWS
       vars_of_device_mswindows ();
       vars_of_console_mswindows ();
-      vars_of_event_mswindows ();
       vars_of_frame_mswindows ();
       vars_of_objects_mswindows ();
       vars_of_select_mswindows ();
       vars_of_frame_mswindows ();
       vars_of_objects_mswindows ();
       vars_of_select_mswindows ();
@@ -1395,10 +1445,11 @@ main_1 (int argc, char **argv, char **envp, int restart)
 
 #ifdef MULE
       vars_of_mule ();
 
 #ifdef MULE
       vars_of_mule ();
+      vars_of_mule_ccl ();
       vars_of_mule_charset ();
 #endif
 #ifdef FILE_CODING
       vars_of_mule_charset ();
 #endif
 #ifdef FILE_CODING
-      vars_of_mule_coding ();
+      vars_of_file_coding ();
 #endif
 #ifdef MULE
 #ifdef HAVE_WNN
 #endif
 #ifdef MULE
 #ifdef HAVE_WNN
@@ -1458,19 +1509,19 @@ main_1 (int argc, char **argv, char **envp, int restart)
       /* Calls Fmake_range_table(). */
       complex_vars_of_search ();
 
       /* Calls Fmake_range_table(). */
       complex_vars_of_search ();
 
-      /* Calls make_lisp_hashtable(). */
+      /* Calls make_lisp_hash_table(). */
       complex_vars_of_extents ();
 
       complex_vars_of_extents ();
 
-      /* Depends on hashtables and specifiers. */
+      /* Depends on hash tables and specifiers. */
       complex_vars_of_faces ();
 
 #ifdef MULE
       complex_vars_of_faces ();
 
 #ifdef MULE
-      /* These two depend on hashtables and various variables declared
+      /* These two depend on hash tables and various variables declared
         earlier.  The second may also depend on the first. */
       complex_vars_of_mule_charset ();
 #endif
 #if defined(FILE_CODING)
         earlier.  The second may also depend on the first. */
       complex_vars_of_mule_charset ();
 #endif
 #if defined(FILE_CODING)
-      complex_vars_of_mule_coding ();
+      complex_vars_of_file_coding ();
 #endif
 
       /* This calls allocate_glyph(), which creates specifiers
 #endif
 
       /* This calls allocate_glyph(), which creates specifiers
@@ -1536,15 +1587,21 @@ main_1 (int argc, char **argv, char **envp, int restart)
       complex_vars_of_emacs ();
 
       /* This creates a couple of basic keymaps and depends on Lisp
       complex_vars_of_emacs ();
 
       /* This creates a couple of basic keymaps and depends on Lisp
-        hashtables and Ffset() (both of which depend on some variables
+        hash tables and Ffset() (both of which depend on some variables
         initialized in the vars_of_*() section) and possibly other
         stuff. */
       complex_vars_of_keymap ();
         initialized in the vars_of_*() section) and possibly other
         stuff. */
       complex_vars_of_keymap ();
-      /* Calls Fmake_hashtable() and creates a keymap */
+
+      /* Calls make_lisp_hash_table() and creates a keymap */
       complex_vars_of_event_stream ();
 
       complex_vars_of_event_stream ();
 
-      if (always_gc)                /* purification debugging hack */
-       garbage_collect_1 ();
+#ifdef ERROR_CHECK_GC
+      {
+       extern int always_gc;
+       if (always_gc)                /* purification debugging hack */
+         garbage_collect_1 ();
+      }
+#endif
     }
 
   /* CONGRATULATIONS!!!  We have successfully initialized the Lisp
     }
 
   /* CONGRATULATIONS!!!  We have successfully initialized the Lisp
@@ -1574,7 +1631,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #ifdef WINDOWSNT
   /*
    * For Win32, call init_environment() now, so that environment/registry
 #ifdef WINDOWSNT
   /*
    * For Win32, call init_environment() now, so that environment/registry
-   * variables will be properly entered into Vprocess_envonment.
+   * variables will be properly entered into Vprocess_environment.
    */
   init_environment();
 #endif
    */
   init_environment();
 #endif
@@ -1638,7 +1695,8 @@ main_1 (int argc, char **argv, char **envp, int restart)
     else
       {
        Vinvocation_path = decode_env_path ("PATH", NULL);
     else
       {
        Vinvocation_path = decode_env_path ("PATH", NULL);
-       locate_file (Vinvocation_path, Vinvocation_name, EXEC_SUFFIXES,
+       locate_file (Vinvocation_path, Vinvocation_name,
+                    Vlisp_EXEC_SUFFIXES,
                     &Vinvocation_directory, X_OK);
       }
 
                     &Vinvocation_directory, X_OK);
       }
 
@@ -1657,11 +1715,11 @@ main_1 (int argc, char **argv, char **envp, int restart)
     char *buf = (char *)alloca (XSTRING_LENGTH (Vinvocation_directory)
                                + XSTRING_LENGTH (Vinvocation_name)
                                + 2);
     char *buf = (char *)alloca (XSTRING_LENGTH (Vinvocation_directory)
                                + XSTRING_LENGTH (Vinvocation_name)
                                + 2);
-    sprintf (buf, "%s/%s", XSTRING_DATA(Vinvocation_directory),
-            XSTRING_DATA(Vinvocation_name));
+    sprintf (buf, "%s/%s", XSTRING_DATA (Vinvocation_directory),
+            XSTRING_DATA (Vinvocation_name));
 
     /* All we can do is cry if an error happens, so ignore it. */
 
     /* All we can do is cry if an error happens, so ignore it. */
-    (void)dll_init(buf);
+    (void) dll_init (buf);
   }
 #endif
 
   }
 #endif
 
@@ -1791,7 +1849,7 @@ static struct standard_args standard_args[] =
 static void
 sort_args (int argc, char **argv)
 {
 static void
 sort_args (int argc, char **argv)
 {
-  char **new = xnew_array (char *, argc);
+  char **new_argv = xnew_array (char *, argc);
   /* For each element of argv,
      the corresponding element of options is:
      0 for an option that takes no arguments,
   /* For each element of argv,
      the corresponding element of options is:
      0 for an option that takes no arguments,
@@ -1871,8 +1929,8 @@ sort_args (int argc, char **argv)
        }
     }
 
        }
     }
 
-  /* Copy the arguments, in order of decreasing priority, to NEW.  */
-  new[0] = argv[0];
+  /* Copy the arguments, in order of decreasing priority, to NEW_ARGV.  */
+  new_argv[0] = argv[0];
   while (to < argc)
     {
       int best = -1;
   while (to < argc)
     {
       int best = -1;
@@ -1895,10 +1953,10 @@ sort_args (int argc, char **argv)
       if (best < 0)
        abort ();
 
       if (best < 0)
        abort ();
 
-      /* Copy the highest priority remaining option, with its args, to NEW.  */
-      new[to++] = argv[best];
+      /* Copy the highest priority remaining option, with its args, to NEW_ARGV.  */
+      new_argv[to++] = argv[best];
       for (i = 0; i < options[best]; i++)
       for (i = 0; i < options[best]; i++)
-       new[to++] = argv[best + i + 1];
+       new_argv[to++] = argv[best + i + 1];
 
       /* Clear out this option in ARGV.  */
       argv[best] = 0;
 
       /* Clear out this option in ARGV.  */
       argv[best] = 0;
@@ -1906,7 +1964,10 @@ sort_args (int argc, char **argv)
        argv[best + i + 1] = 0;
     }
 
        argv[best + i + 1] = 0;
     }
 
-  memcpy (argv, new, sizeof (char *) * argc);
+  memcpy (argv, new_argv, sizeof (char *) * argc);
+  xfree (new_argv);
+  xfree (options);
+  xfree (priority);
 }
 
 static JMP_BUF run_temacs_catch;
 }
 
 static JMP_BUF run_temacs_catch;
@@ -1938,7 +1999,9 @@ Do not call this.  It will reinitialize your XEmacs.  You'll be sorry.
    a dumped version in case you want to rerun it.  This function is most
    useful when used as part of the `make all-elc' command. --ben]
    This will "restart" emacs with the specified command-line arguments.
    a dumped version in case you want to rerun it.  This function is most
    useful when used as part of the `make all-elc' command. --ben]
    This will "restart" emacs with the specified command-line arguments.
- */
+
+   Martin thinks this function is most useful when using debugging
+   tools like Purify or tcov that get confused by XEmacs' dumping.  */
      (int nargs, Lisp_Object *args))
 {
   int ac;
      (int nargs, Lisp_Object *args))
 {
   int ac;
@@ -1971,7 +2034,7 @@ Do not call this.  It will reinitialize your XEmacs.  You'll be sorry.
       total_len += wampum_all_len[ac];
     }
   DO_REALLOC (run_temacs_args, run_temacs_args_size, total_len, char);
       total_len += wampum_all_len[ac];
     }
   DO_REALLOC (run_temacs_args, run_temacs_args_size, total_len, char);
-  DO_REALLOC (run_temacs_argv, run_temacs_argv_size, nargs+1, char *);
+  DO_REALLOC (run_temacs_argv, run_temacs_argv_size, nargs+2, char *);
 
   memcpy (run_temacs_args, wampum, namesize);
   run_temacs_argv [0] = run_temacs_args;
 
   memcpy (run_temacs_args, wampum, namesize);
   run_temacs_argv [0] = run_temacs_args;
@@ -1988,10 +2051,8 @@ Do not call this.  It will reinitialize your XEmacs.  You'll be sorry.
   unbind_to (0, Qnil); /* this closes loadup.el */
   purify_flag = 0;
   run_temacs_argc = nargs + 1;
   unbind_to (0, Qnil); /* this closes loadup.el */
   purify_flag = 0;
   run_temacs_argc = nargs + 1;
-#ifdef REPORT_PURE_USAGE
-  report_pure_usage (1, 0);
-#else
-  report_pure_usage (0, 0);
+#ifdef HEAP_IN_DATA
+  report_sheap_usage (0);
 #endif
   LONGJMP (run_temacs_catch, 1);
   return Qnil; /* not reached; warning suppression */
 #endif
   LONGJMP (run_temacs_catch, 1);
   return Qnil; /* not reached; warning suppression */
@@ -2004,28 +2065,33 @@ main (int argc, char **argv, char **envp)
   int     volatile vol_argc = argc;
   char ** volatile vol_argv = argv;
   char ** volatile vol_envp = envp;
   int     volatile vol_argc = argc;
   char ** volatile vol_argv = argv;
   char ** volatile vol_envp = envp;
-  /* This is hairy.  We need to compute where the XEmacs binary was invoked */
-  /* from because temacs initialization requires it to find the lisp */
-  /* directories.  The code that recomputes the path is guarded by the */
-  /* restarted flag.  There are three possible paths I've found so far */
-  /* through this: */
-  /* temacs -- When running temacs for basic build stuff, the first main_1 */
-  /*  will be the only one invoked.  It must compute the path else there */
-  /*  will be a very ugly bomb in startup.el (can't find obvious location */
-  /*  for doc-directory data-directory, etc.).  */
-  /* temacs w/ run-temacs on the command line -- This is run to bytecompile */
-  /*  all the out of date dumped lisp.  It will execute both of the main_1 */
-  /*  calls and the second one must not touch the first computation because */
-  /*  argc/argv are hosed the second time through. */
-  /* xemacs -- Only the second main_1 is executed.  The invocation path must */
-  /*  computed but this only matters when running in place or when running */
-  /*  as a login shell. */
-  /* As a bonus for straightening this out, XEmacs can now be run in place */
-  /*  as a login shell.  This never used to work. */
-  /* As another bonus, we can now guarantee that */
-  /* (concat invocation-directory invocation-name) contains the filename */
-  /* of the XEmacs binary we are running.  This can now be used in a */
-  /* definite test for out of date dumped files.  -slb */
+  /* This is hairy.  We need to compute where the XEmacs binary was invoked
+     from because temacs initialization requires it to find the lisp
+     directories.  The code that recomputes the path is guarded by the
+     restarted flag.  There are three possible paths I've found so far
+     through this:
+
+     temacs -- When running temacs for basic build stuff, the first main_1
+      will be the only one invoked.  It must compute the path else there
+      will be a very ugly bomb in startup.el (can't find obvious location
+      for doc-directory data-directory, etc.).
+
+     temacs w/ run-temacs on the command line -- This is run to bytecompile
+      all the out of date dumped lisp.  It will execute both of the main_1
+      calls and the second one must not touch the first computation because
+      argc/argv are hosed the second time through.
+
+     xemacs -- Only the second main_1 is executed.  The invocation path must
+      computed but this only matters when running in place or when running
+      as a login shell.
+
+     As a bonus for straightening this out, XEmacs can now be run in place
+     as a login shell.  This never used to work.
+
+     As another bonus, we can now guarantee that
+     (concat invocation-directory invocation-name) contains the filename
+     of the XEmacs binary we are running.  This can now be used in a
+     definite test for out of date dumped files.  -slb */
   int restarted = 0;
 #ifdef QUANTIFY
   quantify_stop_recording_data ();
   int restarted = 0;
 #ifdef QUANTIFY
   quantify_stop_recording_data ();
@@ -2080,7 +2146,7 @@ main (int argc, char **argv, char **envp)
     }
 #ifdef RUN_TIME_REMAP
   else
     }
 #ifdef RUN_TIME_REMAP
   else
-    /* obviously no-one uses this because where it was before initalized was
+    /* obviously no-one uses this because where it was before initialized was
      *always* true */
     run_time_remap (argv[0]);
 #endif
      *always* true */
     run_time_remap (argv[0]);
 #endif
@@ -2123,7 +2189,7 @@ main (int argc, char **argv, char **envp)
 /* GCC >= 2.8.  -slb */
 #if defined(GNU_MALLOC)
 static void
 /* GCC >= 2.8.  -slb */
 #if defined(GNU_MALLOC)
 static void
-voodoo_free_hook(void *mem)
+voodoo_free_hook (void *mem)
 {
   /* Disable all calls to free() when XEmacs is exiting and it doesn't */
   /* matter. */
 {
   /* Disable all calls to free() when XEmacs is exiting and it doesn't */
   /* matter. */
@@ -2381,8 +2447,6 @@ and announce itself normally when it is run.
   /* When we're dumping, we can't use the debugging free() */
   disable_free_hook ();
 #endif
   /* When we're dumping, we can't use the debugging free() */
   disable_free_hook ();
 #endif
-#if 1 /* martin */
-#endif
 
   CHECK_STRING (intoname);
   intoname = Fexpand_file_name (intoname, Qnil);
 
   CHECK_STRING (intoname);
   intoname = Fexpand_file_name (intoname, Qnil);
@@ -2398,10 +2462,8 @@ and announce itself normally when it is run.
   opurify = purify_flag;
   purify_flag = 0;
 
   opurify = purify_flag;
   purify_flag = 0;
 
-#ifdef DEBUG_XEMACS
-  report_pure_usage (1, 1);
-#else
-  report_pure_usage (0, 1);
+#ifdef HEAP_IN_DATA
+  report_sheap_usage (1);
 #endif
 
   fflush (stderr);
 #endif
 
   fflush (stderr);
@@ -2449,10 +2511,10 @@ and announce itself normally when it is run.
      It's a whole lot easier to do the conversion here than to
      modify all the unexec routines to ensure that filename
      conversion is applied everywhere.  Don't worry about memory
      It's a whole lot easier to do the conversion here than to
      modify all the unexec routines to ensure that filename
      conversion is applied everywhere.  Don't worry about memory
-     leakage because this call only happens once. */ 
- unexec (intoname_ext, symname_ext, (uintptr_t) my_edata, 0, 0);
+     leakage because this call only happens once. */
+    unexec (intoname_ext, symname_ext, (uintptr_t) my_edata, 0, 0);
 #ifdef DOUG_LEA_MALLOC
 #ifdef DOUG_LEA_MALLOC
-  free (malloc_state_ptr);
+    free (malloc_state_ptr);
 #endif
   }
 #endif /* not MSDOS and EMX */
 #endif
   }
 #endif /* not MSDOS and EMX */
@@ -2513,7 +2575,7 @@ decode_path (CONST char *path)
 
   GET_C_CHARPTR_INT_FILENAME_DATA_ALLOCA (path, newpath);
 
 
   GET_C_CHARPTR_INT_FILENAME_DATA_ALLOCA (path, newpath);
 
-  len = strlen (newpath);
+  len = strlen ((const char *) newpath);
   /* #### Does this make sense?  It certainly does for
      decode_env_path(), but it looks dubious here.  Does any code
      depend on decode_path("") returning nil instead of an empty
   /* #### Does this make sense?  It certainly does for
      decode_env_path(), but it looks dubious here.  Does any code
      depend on decode_path("") returning nil instead of an empty
@@ -2605,7 +2667,7 @@ assert_failed (CONST char *file, int line, CONST char *expr)
 
 #ifdef QUANTIFY
 DEFUN ("quantify-start-recording-data", Fquantify_start_recording_data,
 
 #ifdef QUANTIFY
 DEFUN ("quantify-start-recording-data", Fquantify_start_recording_data,
-       0, 0, 0, /*
+       0, 0, "", /*
 Start recording Quantify data.
 */
        ())
 Start recording Quantify data.
 */
        ())
@@ -2615,7 +2677,7 @@ Start recording Quantify data.
 }
 
 DEFUN ("quantify-stop-recording-data", Fquantify_stop_recording_data,
 }
 
 DEFUN ("quantify-stop-recording-data", Fquantify_stop_recording_data,
-       0, 0, 0, /*
+       0, 0, "", /*
 Stop recording Quantify data.
 */
        ())
 Stop recording Quantify data.
 */
        ())
@@ -2624,7 +2686,7 @@ Stop recording Quantify data.
   return Qnil;
 }
 
   return Qnil;
 }
 
-DEFUN ("quantify-clear-data", Fquantify_clear_data, 0, 0, 0, /*
+DEFUN ("quantify-clear-data", Fquantify_clear_data, 0, 0, "", /*
 Clear all Quantify data.
 */
        ())
 Clear all Quantify data.
 */
        ())
@@ -2740,7 +2802,20 @@ Warning: this variable did not exist in Emacs versions earlier than:
 */ );
   Vemacs_minor_version = make_int (EMACS_MINOR_VERSION);
 
 */ );
   Vemacs_minor_version = make_int (EMACS_MINOR_VERSION);
 
-  DEFVAR_LISP ("emacs-beta-version", &Vemacs_beta_version /*
+  DEFVAR_LISP ("emacs-patch-level", &Vemacs_patch_level /*
+The patch level of this version of Emacs, as an integer.
+The value is non-nil if this version of XEmacs is part of a series of
+stable XEmacsen, but has bug fixes applied.
+Warning: this variable does not exist in FSF Emacs or in XEmacs versions
+earlier than 21.1.1
+*/ );
+#ifdef EMACS_PATCH_LEVEL
+  Vemacs_patch_level = make_int (EMACS_PATCH_LEVEL);
+#else
+  Vemacs_patch_level = Qnil;
+#endif
+
+    DEFVAR_LISP ("emacs-beta-version", &Vemacs_beta_version /*
 Beta number of this version of Emacs, as an integer.
 The value is nil if this is an officially released version of XEmacs.
 Warning: this variable does not exist in FSF Emacs or in XEmacs versions
 Beta number of this version of Emacs, as an integer.
 The value is nil if this is an officially released version of XEmacs.
 Warning: this variable does not exist in FSF Emacs or in XEmacs versions
@@ -2800,6 +2875,13 @@ Set to non-nil when the site-lisp should not be searched at startup.
   inhibit_site_lisp = 1;
 #endif
 
   inhibit_site_lisp = 1;
 #endif
 
+  DEFVAR_BOOL ("inhibit-site-modules", &inhibit_site_modules /*
+Set to non-nil when site-modules should not be searched at startup.
+*/ );
+#ifdef INHIBIT_SITE_MODULES
+  inhibit_site_modules = 1;
+#endif
+
   DEFVAR_INT ("emacs-priority", &emacs_priority /*
 Priority for XEmacs to run at.
 This value is effective only if set before XEmacs is dumped,
   DEFVAR_INT ("emacs-priority", &emacs_priority /*
 Priority for XEmacs to run at.
 This value is effective only if set before XEmacs is dumped,
@@ -2857,7 +2939,7 @@ void
 complex_vars_of_emacs (void)
 {
   /* This is all related to path searching. */
 complex_vars_of_emacs (void)
 {
   /* This is all related to path searching. */
-  
+
   DEFVAR_LISP ("emacs-program-name", &Vemacs_program_name /*
 *Name of the Emacs variant.
 For example, this may be \"xemacs\" or \"infodock\".
   DEFVAR_LISP ("emacs-program-name", &Vemacs_program_name /*
 *Name of the Emacs variant.
 For example, this may be \"xemacs\" or \"infodock\".
@@ -2911,6 +2993,22 @@ configure's idea of what LISP-DIRECTORY will be.
   Vconfigure_lisp_directory = Qnil;
 #endif
 
   Vconfigure_lisp_directory = Qnil;
 #endif
 
+  DEFVAR_LISP ("module-directory", &Vmodule_directory /*
+*Directory of core dynamic modules that come with XEmacs.
+*/ );
+  Vmodule_directory = Qnil;
+
+  DEFVAR_LISP ("configure-module-directory", &Vconfigure_module_directory /*
+For internal use by the build procedure only.
+configure's idea of what MODULE-DIRECTORY will be.
+*/ );
+#ifdef PATH_MODULESEARCH
+  Vconfigure_module_directory = Ffile_name_as_directory
+    (build_string ((char *) PATH_MODULESEARCH));
+#else
+  Vconfigure_module_directory = Qnil;
+#endif
+
   DEFVAR_LISP ("configure-package-path", &Vconfigure_package_path /*
 For internal use by the build procedure only.
 configure's idea of what the package path will be.
   DEFVAR_LISP ("configure-package-path", &Vconfigure_package_path /*
 For internal use by the build procedure only.
 configure's idea of what the package path will be.
@@ -2975,6 +3073,22 @@ configure's idea of what SITE-DIRECTORY will be.
   Vconfigure_site_directory = Qnil;
 #endif
 
   Vconfigure_site_directory = Qnil;
 #endif
 
+  DEFVAR_LISP ("site-module-directory", &Vsite_module_directory /*
+*Directory of site-specific loadable modules that come with XEmacs.
+*/ );
+  Vsite_module_directory = Qnil;
+
+  DEFVAR_LISP ("configure-site-module-directory", &Vconfigure_site_module_directory /*
+For internal use by the build procedure only.
+configure's idea of what SITE-DIRECTORY will be.
+*/ );
+#ifdef PATH_SITE_MODULES
+  Vconfigure_site_module_directory = Ffile_name_as_directory
+    (build_string ((char *) PATH_SITE_MODULES));
+#else
+  Vconfigure_site_module_directory = Qnil;
+#endif
+
   DEFVAR_LISP ("doc-directory", &Vdoc_directory /*
 *Directory containing the DOC file that comes with XEmacs.
 This is usually the same as exec-directory.
   DEFVAR_LISP ("doc-directory", &Vdoc_directory /*
 *Directory containing the DOC file that comes with XEmacs.
 This is usually the same as exec-directory.
@@ -3044,6 +3158,7 @@ The configured initial path for info documentation.
  * cores on us when re-started from the dumped executable.
  * This will have to go for 21.1  -- OG.
  */
  * cores on us when re-started from the dumped executable.
  * This will have to go for 21.1  -- OG.
  */
+void __sti__iflPNGFile_c___(void);
 void __sti__iflPNGFile_c___()
 {
 }
 void __sti__iflPNGFile_c___()
 {
 }