Contents in 1999-06-04-13 of release-21-2.
[chise/xemacs-chise.git.1] / src / emacs.c
index 5114354..c3fc9fc 100644 (file)
@@ -35,14 +35,18 @@ Boston, MA 02111-1307, USA.  */
 #include "commands.h"
 #include "console.h"
 #include "process.h"
+#include "redisplay.h"
 #include "sysdep.h"
 
-#include <setjmp.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
@@ -69,6 +73,10 @@ Boston, MA 02111-1307, USA.  */
 /* 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);
@@ -107,6 +115,7 @@ Lisp_Object Vsystem_configuration_options;
 /* 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
@@ -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 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;
@@ -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-modules searches at startup */
+int inhibit_site_modules;
+
 /* 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);
 
-extern int always_gc;           /* hack */
-
 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;
@@ -445,7 +459,7 @@ Return the directory name in which the Emacs executable was located.
 #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");
@@ -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
 
-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;
@@ -612,6 +629,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #if defined (HAVE_MMAP) && defined (REL_ALLOC)
   /* ralloc can only be used if using the GNU memory allocator. */
   init_ralloc ();
+#elif defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
+  if (initialized)
+    init_ralloc();
 #endif
 
 #ifdef HAVE_SOCKS
@@ -697,6 +717,16 @@ main_1 (int argc, char **argv, char **envp, int restart)
       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))
     {
@@ -883,14 +913,14 @@ main_1 (int argc, char **argv, char **envp, int restart)
       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 ();
+#ifdef HAVE_X_WINDOWS
+      syms_of_event_Xt ();
+#endif
 #ifdef HAVE_DRAGNDROP
       syms_of_dragdrop ();
 #endif
@@ -909,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_glyphs_widget ();
 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
       syms_of_gui ();
 #endif
@@ -926,6 +957,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
       syms_of_menubar ();
 #endif
       syms_of_minibuf ();
+#ifdef HAVE_SHLIB
+      syms_of_module ();
+#endif
       syms_of_objects ();
       syms_of_print ();
 #if !defined (NO_SUBPROCESSES)
@@ -941,6 +975,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       syms_of_rangetab ();
       syms_of_redisplay ();
       syms_of_search ();
+      syms_of_select ();
       syms_of_signal ();
       syms_of_sound ();
       syms_of_specifier ();
@@ -961,12 +996,12 @@ main_1 (int argc, char **argv, char **envp, int restart)
       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
-      syms_of_event_Xt ();
       syms_of_frame_x ();
       syms_of_glyphs_x ();
       syms_of_objects_x ();
@@ -982,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 ();
-      syms_of_event_mswindows ();
       syms_of_frame_mswindows ();
       syms_of_objects_mswindows ();
       syms_of_select_mswindows ();
@@ -996,6 +1030,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #ifdef HAVE_MSW_C_DIRED
       syms_of_dired_mswindows ();
 #endif
+#ifdef WINDOWSNT
+      syms_of_ntproc ();
+#endif
 #endif /* HAVE_MS_WINDOWS */
 
 #ifdef MULE
@@ -1004,7 +1041,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       syms_of_mule_charset ();
 #endif
 #ifdef FILE_CODING
-      syms_of_mule_coding ();
+      syms_of_file_coding ();
 #endif
 #ifdef MULE
 #ifdef HAVE_WNN
@@ -1023,10 +1060,6 @@ main_1 (int argc, char **argv, char **envp, int restart)
       SYMS_MACHINE;
 #endif
 
-#ifdef EMACS_BTL
-      syms_of_btl ();
-#endif
-
       /*
 #if defined (GNU_MALLOC) && \
     defined (ERROR_CHECK_MALLOC) && \
@@ -1080,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_select_x ();
 #ifdef HAVE_MENUBARS
       console_type_create_menubar_x ();
 #endif
@@ -1103,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_select_mswindows ();
 # ifdef HAVE_SCROLLBARS
       console_type_create_scrollbar_mswindows ();
 # endif
@@ -1149,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_hashtable ();
+      structure_type_create_hash_table ();
 
       /* Now initialize the image instantiator formats and associated symbols.
          Other than the first function below, the functions may
@@ -1164,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_glyphs_widget ();
 #ifdef HAVE_X_WINDOWS
       image_instantiator_format_create_glyphs_x ();
 #endif /* HAVE_X_WINDOWS */
@@ -1181,12 +1217,12 @@ main_1 (int argc, char **argv, char **envp, int restart)
 
       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
-      
+
       /* Initialize processes implementation.
         The functions may make exactly the following function/macro calls:
 
@@ -1252,6 +1288,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       vars_of_bytecode ();
       vars_of_callint ();
       vars_of_callproc ();
+      vars_of_chartab ();
       vars_of_cmdloop ();
       vars_of_cmds ();
       vars_of_console ();
@@ -1273,19 +1310,28 @@ main_1 (int argc, char **argv, char **envp, int restart)
       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_events ();
       vars_of_extents ();
       vars_of_faces ();
       vars_of_fileio ();
-#ifdef CLASH_DETECTION
-      vars_of_filelock ();
-#endif
       vars_of_floatfns ();
       vars_of_font_lock ();
       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
@@ -1311,6 +1357,12 @@ main_1 (int argc, char **argv, char **envp, int restart)
       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 ();
 
@@ -1333,6 +1385,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
       vars_of_scrollbar ();
 #endif
       vars_of_search ();
+      vars_of_select ();
       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 ();
-      vars_of_event_tty ();
       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
-      vars_of_event_Xt ();
       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 ();
-      vars_of_event_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 ();
+      vars_of_mule_ccl ();
       vars_of_mule_charset ();
 #endif
 #ifdef FILE_CODING
-      vars_of_mule_coding ();
+      vars_of_file_coding ();
 #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 make_lisp_hashtable(). */
+      /* Calls make_lisp_hash_table(). */
       complex_vars_of_extents ();
 
-      /* Depends on hashtables and specifiers. */
+      /* Depends on hash tables and specifiers. */
       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)
-      complex_vars_of_mule_coding ();
+      complex_vars_of_file_coding ();
 #endif
 
       /* This calls allocate_glyph(), which creates specifiers
@@ -1535,20 +1586,22 @@ main_1 (int argc, char **argv, char **envp, int restart)
         might depend on all sorts of things; I'm not sure. */
       complex_vars_of_emacs ();
 
-#ifdef CLASH_DETECTION
-      complex_vars_of_filelock ();
-#endif /* CLASH_DETECTION */
-
       /* 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 ();
-      /* Calls Fmake_hashtable() and creates a keymap */
+
+      /* Calls make_lisp_hash_table() and creates a keymap */
       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
@@ -1578,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
-   * variables will be properly entered into Vprocess_envonment.
+   * variables will be properly entered into Vprocess_environment.
    */
   init_environment();
 #endif
@@ -1642,7 +1695,8 @@ main_1 (int argc, char **argv, char **envp, int restart)
     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);
       }
 
@@ -1661,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);
-    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. */
-    (void)dll_init(buf);
+    (void) dll_init (buf);
   }
 #endif
 
@@ -1795,7 +1849,7 @@ static struct standard_args standard_args[] =
 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,
@@ -1875,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;
@@ -1899,10 +1953,10 @@ sort_args (int argc, char **argv)
       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++)
-       new[to++] = argv[best + i + 1];
+       new_argv[to++] = argv[best + i + 1];
 
       /* Clear out this option in ARGV.  */
       argv[best] = 0;
@@ -1910,7 +1964,10 @@ sort_args (int argc, char **argv)
        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;
@@ -1942,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.
- */
+
+   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;
@@ -1975,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);
-  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;
@@ -1992,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;
-#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 */
@@ -2008,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;
-  /* 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 ();
@@ -2084,7 +2146,7 @@ main (int argc, char **argv, char **envp)
     }
 #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
@@ -2127,7 +2189,7 @@ main (int argc, char **argv, char **envp)
 /* 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. */
@@ -2385,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
-#if 1 /* martin */
-#endif
 
   CHECK_STRING (intoname);
   intoname = Fexpand_file_name (intoname, Qnil);
@@ -2402,10 +2462,8 @@ and announce itself normally when it is run.
   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);
@@ -2453,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
-     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
-  free (malloc_state_ptr);
+    free (malloc_state_ptr);
 #endif
   }
 #endif /* not MSDOS and EMX */
@@ -2517,7 +2575,7 @@ decode_path (CONST char *path)
 
   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
@@ -2609,7 +2667,7 @@ assert_failed (CONST char *file, int line, CONST char *expr)
 
 #ifdef QUANTIFY
 DEFUN ("quantify-start-recording-data", Fquantify_start_recording_data,
-       0, 0, 0, /*
+       0, 0, "", /*
 Start recording Quantify data.
 */
        ())
@@ -2619,7 +2677,7 @@ Start recording Quantify data.
 }
 
 DEFUN ("quantify-stop-recording-data", Fquantify_stop_recording_data,
-       0, 0, 0, /*
+       0, 0, "", /*
 Stop recording Quantify data.
 */
        ())
@@ -2628,7 +2686,7 @@ Stop recording Quantify data.
   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.
 */
        ())
@@ -2744,7 +2802,20 @@ Warning: this variable did not exist in Emacs versions earlier than:
 */ );
   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
@@ -2804,6 +2875,13 @@ Set to non-nil when the site-lisp should not be searched at startup.
   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,
@@ -2861,7 +2939,7 @@ void
 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\".
@@ -2915,6 +2993,22 @@ configure's idea of what LISP-DIRECTORY will be.
   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.
@@ -2979,6 +3073,22 @@ configure's idea of what SITE-DIRECTORY will be.
   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.
@@ -3048,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.
  */
+void __sti__iflPNGFile_c___(void);
 void __sti__iflPNGFile_c___()
 {
 }