update.
[chise/xemacs-chise.git.1] / src / emacs.c
index 2659e88..4011db7 100644 (file)
@@ -2,7 +2,8 @@
    Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994
    Free Software Foundation, Inc.
    Copyright (C) 1995 Sun Microsystems, Inc.
    Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994
    Free Software Foundation, Inc.
    Copyright (C) 1995 Sun Microsystems, Inc.
-   Copyright (C) 2000 Ben Wing.
+   Copyright (C) 2000, 2002 Ben Wing.
+   Copyright (C) 2000,2002,2005,2006,2010 MORIOKA Tomohiko.
 
 This file is part of XEmacs.
 
 
 This file is part of XEmacs.
 
@@ -180,8 +181,11 @@ version 18.59 released October 31, 1992.
 #include "sysfile.h"
 #include "systime.h"
 
 #include "sysfile.h"
 #include "systime.h"
 
+#ifdef CYGWIN
+#include "syswindows.h"
+#endif
+
 #ifdef PDUMP
 #ifdef PDUMP
-#include "dump-id.h"
 #include "dumper.h"
 #endif
 
 #include "dumper.h"
 #endif
 
@@ -242,6 +246,10 @@ static void *malloc_state_ptr;
 void r_alloc_reinit (void);
 # endif
 
 void r_alloc_reinit (void);
 # endif
 
+#ifdef HAVE_GTK
+void console_type_create_select_gtk(void);
+#endif
+
 /* Variable whose value is symbol giving operating system type. */
 Lisp_Object Vsystem_type;
 
 /* Variable whose value is symbol giving operating system type. */
 Lisp_Object Vsystem_type;
 
@@ -284,6 +292,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 Vmule_lisp_directory, Vconfigure_mule_lisp_directory;
+Lisp_Object Vutf_2000_lisp_directory, Vconfigure_utf_2000_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 Vmodule_directory, Vconfigure_module_directory;
 Lisp_Object Vsite_module_directory, Vconfigure_site_module_directory;
 Lisp_Object Vconfigure_package_path;
@@ -336,7 +346,7 @@ uintptr_t bss_end = 0;
 #endif
 
 /* Number of bytes of writable memory we can expect to be able to get */
 #endif
 
 /* Number of bytes of writable memory we can expect to be able to get */
-unsigned int lim_data;
+unsigned long lim_data;
 
 /* WARNING!
 
 
 /* WARNING!
 
@@ -457,17 +467,115 @@ int fatal_error_in_progress;
    or do other non-essential stuff. */
 int preparing_for_armageddon;
 
    or do other non-essential stuff. */
 int preparing_for_armageddon;
 
+/* Nonzero means we're in an unstable situation and need to skip
+   i18n conversions and such during printing. */
+int inhibit_non_essential_printing_operations;
 
 static JMP_BUF run_temacs_catch;
 
 static int run_temacs_argc;
 static char **run_temacs_argv;
 static char *run_temacs_args;
 
 static JMP_BUF run_temacs_catch;
 
 static int run_temacs_argc;
 static char **run_temacs_argv;
 static char *run_temacs_args;
-static size_t run_temacs_argv_size;
-static size_t run_temacs_args_size;
+static EMACS_INT run_temacs_argv_size;
+static EMACS_INT run_temacs_args_size;
 
 static void shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save);
 
 
 static void shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save);
 
+/* ------------------------------- */
+/*  low-level debugging functions  */
+/* ------------------------------- */
+
+#if defined (WIN32_NATIVE) && defined (DEBUG_XEMACS)
+#define debugging_breakpoint() DebugBreak ()
+#else
+#define debugging_breakpoint()
+#endif
+
+void
+debug_break (void)
+{
+  debugging_breakpoint ();
+}
+
+#if defined (WIN32_NATIVE) || defined (CYGWIN)
+
+/* Return whether all bytes in the specified memory block can be read. */
+int
+debug_can_access_memory (void *ptr, Bytecount len)
+{
+  return !IsBadReadPtr (ptr, len);
+}
+
+#else /* !(defined (WIN32_NATIVE) || defined (CYGWIN)) */
+
+/* #### There must be a better way!!!! */
+
+static JMP_BUF memory_error_jump;
+
+static SIGTYPE
+debug_memory_error (int signum)
+{
+  EMACS_REESTABLISH_SIGNAL (signum, debug_memory_error);
+  EMACS_UNBLOCK_SIGNAL (signum);
+  LONGJMP (memory_error_jump, 1);
+}
+
+/* Return whether all bytes in the specified memory block can be read. */
+int
+debug_can_access_memory (void *ptr, Bytecount len)
+{
+  /* Use volatile to protect variables from being clobbered by longjmp. */
+  SIGTYPE (*volatile old_sigbus) (int);
+  SIGTYPE (*volatile old_sigsegv) (int);
+  volatile int old_errno = errno;
+  volatile int retval = 1;
+
+  if (!SETJMP (memory_error_jump))
+    {
+      old_sigbus =
+       (SIGTYPE (*) (int)) signal (SIGBUS, debug_memory_error);
+      old_sigsegv =
+       (SIGTYPE (*) (int)) signal (SIGSEGV, debug_memory_error);
+
+      if (len > 1)
+       /* If we can, try to avoid problems with super-optimizing compilers
+          that might decide that memcmp (ptr, ptr, len) can be optimized
+          away since its result is always 1. */
+       memcmp (ptr, (char *) ptr + 1, len - 1);
+      else
+       memcmp (ptr, ptr, len);
+    }
+  else
+    retval = 0;
+  signal (SIGBUS, old_sigbus);
+  signal (SIGSEGV, old_sigsegv);
+  errno = old_errno;
+
+  return retval;
+}
+
+#endif /* defined (WIN32_NATIVE) || defined (CYGWIN) */
+
+#ifdef DEBUG_XEMACS
+
+DEFUN ("force-debugging-signal", Fforce_debugging_signal, 0, 1, 0, /*
+Cause XEmacs to enter the debugger.
+On some systems, there may be no way to do this gracefully; if so,
+nothing happens unless ABORT is non-nil, in which case XEmacs will
+ABORT() -- a sure-fire way to immediately get back to the debugger,
+but also a sure-fire way to kill XEmacs (and dump core on Unix
+systems)!
+*/
+       (abort_))
+{
+  debugging_breakpoint ();
+  if (!NILP (abort_))
+    ABORT ();
+  return Qnil;
+}
+
+#endif /* DEBUG_XEMACS */
+
 static void
 ensure_no_quitting_from_now_on (void)
 {
 static void
 ensure_no_quitting_from_now_on (void)
 {
@@ -482,6 +590,7 @@ SIGTYPE
 fatal_error_signal (int sig)
 {
   fatal_error_in_progress++;
 fatal_error_signal (int sig)
 {
   fatal_error_in_progress++;
+  inhibit_non_essential_printing_operations = 1;
   preparing_for_armageddon = 1;
 
   ensure_no_quitting_from_now_on ();
   preparing_for_armageddon = 1;
 
   ensure_no_quitting_from_now_on ();
@@ -553,6 +662,7 @@ mswindows_handle_hardware_exceptions (DWORD code)
   __try
     {
       fatal_error_in_progress++;
   __try
     {
       fatal_error_in_progress++;
+      inhibit_non_essential_printing_operations = 1;
       preparing_for_armageddon = 1;
 
       ensure_no_quitting_from_now_on ();
       preparing_for_armageddon = 1;
 
       ensure_no_quitting_from_now_on ();
@@ -795,7 +905,7 @@ argmatch (char **argv, int argc, char *sstr, char *lstr,
       return 1;
     }
   arglen = (valptr != NULL && (p = strchr (arg, '=')) != NULL
       return 1;
     }
   arglen = (valptr != NULL && (p = strchr (arg, '=')) != NULL
-           ? p - arg : strlen (arg));
+           ? p - arg : (int) strlen (arg));
   if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
     return 0;
   else if (valptr == NULL)
   if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
     return 0;
   else if (valptr == NULL)
@@ -865,6 +975,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #endif /* not SYSTEM_MALLOC or HAVE_LIBMCHECK or DOUG_LEA_MALLOC */
 
   noninteractive = 0;
 #endif /* not SYSTEM_MALLOC or HAVE_LIBMCHECK or DOUG_LEA_MALLOC */
 
   noninteractive = 0;
+  inhibit_non_essential_printing_operations = 1;
 
 #ifdef NeXT
   /* 19-Jun-1995 -baw
 
 #ifdef NeXT
   /* 19-Jun-1995 -baw
@@ -1112,6 +1223,13 @@ main_1 (int argc, char **argv, char **envp, int restart)
        display_use = "x";
 
 #endif /* HAVE_X_WINDOWS */
        display_use = "x";
 
 #endif /* HAVE_X_WINDOWS */
+#ifdef HAVE_GTK
+      {
+       char *dpy = getenv ("DISPLAY");
+       if (dpy && dpy[0])
+         display_use = "gtk";
+      }
+#endif
 #ifdef HAVE_MS_WINDOWS
       if (strcmp(display_use, "x") != 0)
        display_use = "mswindows";
 #ifdef HAVE_MS_WINDOWS
       if (strcmp(display_use, "x") != 0)
        display_use = "mswindows";
@@ -1137,6 +1255,11 @@ main_1 (int argc, char **argv, char **envp, int restart)
                                       so we can be fairly accurate. */
   init_intl_very_early (); /* set up the locale and domain for gettext and
                              such. */
                                       so we can be fairly accurate. */
   init_intl_very_early (); /* set up the locale and domain for gettext and
                              such. */
+#ifdef HAVE_MS_WINDOWS
+  init_mswindows_very_early ();        /* Some things - like dde need to be
+                                  initialized early so that the
+                                  client doesn't give up waiting.  */
+#endif
 
   /* Now initialize the Lisp engine and the like.  Done only during
      dumping.  No dependence on anything that may be in the user's
 
   /* Now initialize the Lisp engine and the like.  Done only during
      dumping.  No dependence on anything that may be in the user's
@@ -1262,6 +1385,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #ifdef HAVE_X_WINDOWS
       syms_of_event_Xt ();
 #endif
 #ifdef HAVE_X_WINDOWS
       syms_of_event_Xt ();
 #endif
+#ifdef HAVE_GTK
+      syms_of_event_gtk ();
+#endif
 #ifdef HAVE_DRAGNDROP
       syms_of_dragdrop ();
 #endif
 #ifdef HAVE_DRAGNDROP
       syms_of_dragdrop ();
 #endif
@@ -1337,6 +1463,26 @@ main_1 (int argc, char **argv, char **envp, int restart)
       syms_of_objects_tty ();
 #endif
 
       syms_of_objects_tty ();
 #endif
 
+#ifdef HAVE_GTK
+      syms_of_device_gtk ();
+      syms_of_frame_gtk ();
+      syms_of_glyphs_gtk ();
+      syms_of_objects_gtk ();
+      syms_of_ui_gtk ();
+      syms_of_select_gtk ();
+#ifdef HAVE_DIALOGS
+      syms_of_dialog_gtk ();
+#endif
+#ifdef HAVE_MENUBARS
+      syms_of_menubar_gtk ();
+#endif
+      syms_of_select_gtk ();
+      
+#if defined (HAVE_MENUBARS) || defined(HAVE_SCROLLBARS) || defined(HAVE_DIALOGS) || defined(HAVE_TOOLBARS)
+      syms_of_gui_gtk ();
+#endif
+#endif /* HAVE_GTK */
+
 #ifdef HAVE_X_WINDOWS
 #ifdef HAVE_BALLOON_HELP
       syms_of_balloon_x ();
 #ifdef HAVE_X_WINDOWS
 #ifdef HAVE_BALLOON_HELP
       syms_of_balloon_x ();
@@ -1443,6 +1589,10 @@ main_1 (int argc, char **argv, char **envp, int restart)
       syms_of_postgresql ();
 #endif
 
       syms_of_postgresql ();
 #endif
 
+#ifdef HAVE_CONCORD
+      syms_of_concord ();
+#endif
+
       /* Now create the subtypes for the types that have them.
         We do this before the vars_*() because more symbols
         may get initialized here. */
       /* Now create the subtypes for the types that have them.
         We do this before the vars_*() because more symbols
         may get initialized here. */
@@ -1469,6 +1619,28 @@ main_1 (int argc, char **argv, char **envp, int restart)
       console_type_create_redisplay_tty ();
 #endif
 
       console_type_create_redisplay_tty ();
 #endif
 
+#ifdef HAVE_GTK
+      console_type_create_gtk ();
+      console_type_create_select_gtk ();
+      console_type_create_device_gtk ();
+      console_type_create_frame_gtk ();
+      console_type_create_objects_gtk ();
+      console_type_create_glyphs_gtk ();
+      console_type_create_redisplay_gtk ();
+#ifdef HAVE_MENUBARS
+      console_type_create_menubar_gtk ();
+#endif
+#ifdef HAVE_SCROLLBARS
+      console_type_create_scrollbar_gtk ();
+#endif
+#ifdef HAVE_TOOLBARS
+      console_type_create_toolbar_gtk ();
+#endif
+#ifdef HAVE_DIALOGS
+      console_type_create_dialog_gtk ();
+#endif
+#endif /* HAVE_GTK */
+
 #ifdef HAVE_X_WINDOWS
       console_type_create_x ();
       console_type_create_device_x ();
 #ifdef HAVE_X_WINDOWS
       console_type_create_x ();
       console_type_create_device_x ();
@@ -1547,6 +1719,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
       structure_type_create_faces ();
       structure_type_create_rangetab ();
       structure_type_create_hash_table ();
       structure_type_create_faces ();
       structure_type_create_rangetab ();
       structure_type_create_hash_table ();
+#ifdef HAVE_CONCORD
+      structure_type_create_concord ();
+#endif
 
       /* 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
@@ -1571,6 +1746,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #ifdef HAVE_MS_WINDOWS
       image_instantiator_format_create_glyphs_mswindows ();
 #endif /* HAVE_MSWINDOWS_WINDOWS */
 #ifdef HAVE_MS_WINDOWS
       image_instantiator_format_create_glyphs_mswindows ();
 #endif /* HAVE_MSWINDOWS_WINDOWS */
+#ifdef HAVE_GTK
+      image_instantiator_format_create_glyphs_gtk ();
+#endif
 
       /* Now initialize the lstream types and associated symbols.
         Other than the first function below, the functions may
 
       /* Now initialize the lstream types and associated symbols.
         Other than the first function below, the functions may
@@ -1773,6 +1951,28 @@ main_1 (int argc, char **argv, char **envp, int restart)
       vars_of_objects_tty ();
 #endif
 
       vars_of_objects_tty ();
 #endif
 
+#ifdef HAVE_GTK
+      vars_of_device_gtk ();
+#ifdef HAVE_DIALOGS
+      vars_of_dialog_gtk ();
+#endif
+      vars_of_event_gtk ();
+      vars_of_frame_gtk ();
+      vars_of_glyphs_gtk ();
+      vars_of_ui_gtk ();
+#ifdef HAVE_MENUBARS
+      vars_of_menubar_gtk ();
+#endif
+      vars_of_objects_gtk ();
+      vars_of_select_gtk ();
+#ifdef HAVE_SCROLLBARS
+      vars_of_scrollbar_gtk ();
+#endif
+#if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
+      vars_of_gui_gtk ();
+#endif
+#endif /* HAVE_GTK */
+
 #ifdef HAVE_X_WINDOWS
 #ifdef HAVE_BALLOON_HELP
       vars_of_balloon_x ();
 #ifdef HAVE_X_WINDOWS
 #ifdef HAVE_BALLOON_HELP
       vars_of_balloon_x ();
@@ -1796,6 +1996,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #endif
 #endif /* HAVE_X_WINDOWS */
 
 #endif
 #endif /* HAVE_X_WINDOWS */
 
+
 #ifdef HAVE_MS_WINDOWS
       vars_of_device_mswindows ();
       vars_of_console_mswindows ();
 #ifdef HAVE_MS_WINDOWS
       vars_of_device_mswindows ();
       vars_of_console_mswindows ();
@@ -1850,6 +2051,10 @@ main_1 (int argc, char **argv, char **envp, int restart)
       vars_of_postgresql();
 #endif
 
       vars_of_postgresql();
 #endif
 
+#ifdef HAVE_CONCORD
+      vars_of_concord ();
+#endif
+
 #ifdef HAVE_GPM
       vars_of_gpmevent ();
 #endif
 #ifdef HAVE_GPM
       vars_of_gpmevent ();
 #endif
@@ -1869,6 +2074,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
         */
 
       specifier_vars_of_glyphs ();
         */
 
       specifier_vars_of_glyphs ();
+      specifier_vars_of_glyphs_widget ();
       specifier_vars_of_gutter ();
 #ifdef HAVE_MENUBARS
       specifier_vars_of_menubar ();
       specifier_vars_of_gutter ();
 #ifdef HAVE_MENUBARS
       specifier_vars_of_menubar ();
@@ -1916,6 +2122,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
       /* These rely on the glyphs just created in the previous function,
         and call Fadd_spec_to_specifier(), which relies on various
         variables initialized above. */
       /* These rely on the glyphs just created in the previous function,
         and call Fadd_spec_to_specifier(), which relies on various
         variables initialized above. */
+#ifdef HAVE_GTK
+      complex_vars_of_glyphs_gtk ();
+#endif
 #ifdef HAVE_X_WINDOWS
       complex_vars_of_glyphs_x ();
 #endif
 #ifdef HAVE_X_WINDOWS
       complex_vars_of_glyphs_x ();
 #endif
@@ -1978,6 +2187,11 @@ main_1 (int argc, char **argv, char **envp, int restart)
       /* Calls make_lisp_hash_table() and creates a keymap */
       complex_vars_of_event_stream ();
 
       /* Calls make_lisp_hash_table() and creates a keymap */
       complex_vars_of_event_stream ();
 
+      /* This initializes data-sources of built-in genres */
+#ifdef HAVE_CONCORD
+      complex_vars_of_concord ();
+#endif
+
 #ifdef ERROR_CHECK_GC
       {
        extern int always_gc;
 #ifdef ERROR_CHECK_GC
       {
        extern int always_gc;
@@ -2002,6 +2216,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #ifdef HAVE_MS_WINDOWS
       reinit_console_type_create_mswindows ();
 #endif
 #ifdef HAVE_MS_WINDOWS
       reinit_console_type_create_mswindows ();
 #endif
+#ifdef HAVE_GTK
+      reinit_console_type_create_gtk ();
+#endif
 
       reinit_specifier_type_create ();
       reinit_specifier_type_create_image ();
 
       reinit_specifier_type_create ();
       reinit_specifier_type_create_image ();
@@ -2017,6 +2234,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
       structure_type_create_faces ();
       structure_type_create_rangetab ();
       structure_type_create_hash_table ();
       structure_type_create_faces ();
       structure_type_create_rangetab ();
       structure_type_create_hash_table ();
+#ifdef HAVE_CONCORD
+      structure_type_create_concord ();
+#endif
 
       lstream_type_create ();
 #ifdef FILE_CODING
 
       lstream_type_create ();
 #ifdef FILE_CODING
@@ -2042,6 +2262,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #ifdef HAVE_X_WINDOWS
       reinit_vars_of_event_Xt ();
 #endif
 #ifdef HAVE_X_WINDOWS
       reinit_vars_of_event_Xt ();
 #endif
+#ifdef HAVE_GTK
+      reinit_vars_of_event_gtk ();
+#endif
 #if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
       reinit_vars_of_event_tty ();
 #endif
 #if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
       reinit_vars_of_event_tty ();
 #endif
@@ -2072,6 +2295,10 @@ main_1 (int argc, char **argv, char **envp, int restart)
       reinit_vars_of_frame_mswindows ();
 #endif
 
       reinit_vars_of_frame_mswindows ();
 #endif
 
+#ifdef HAVE_GTK
+      reinit_vars_of_menubar_gtk ();
+#endif
+
 #ifdef HAVE_X_WINDOWS
       reinit_vars_of_device_x ();
 #ifdef HAVE_SCROLLBARS
 #ifdef HAVE_X_WINDOWS
       reinit_vars_of_device_x ();
 #ifdef HAVE_SCROLLBARS
@@ -2248,6 +2475,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #endif /* QUANTIFY */
 
   initialized = 1;
 #endif /* QUANTIFY */
 
   initialized = 1;
+  inhibit_non_essential_printing_operations = 0;
 
   /* This never returns.  */
   initial_command_loop (load_me);
 
   /* This never returns.  */
   initial_command_loop (load_me);
@@ -2449,7 +2677,7 @@ sort_args (int argc, char **argv)
        }
 
       if (best < 0)
        }
 
       if (best < 0)
-       abort ();
+       ABORT ();
 
       /* Copy the highest priority remaining option, with its args, to NEW_ARGV.  */
       new_argv[to++] = argv[best];
 
       /* Copy the highest priority remaining option, with its args, to NEW_ARGV.  */
       new_argv[to++] = argv[best];
@@ -2599,6 +2827,7 @@ main (int argc, char **argv, char **envp)
   quantify_clear_data ();
 #endif /* QUANTIFY */
 
   quantify_clear_data ();
 #endif /* QUANTIFY */
 
+  inhibit_non_essential_printing_operations = 1;
   suppress_early_error_handler_backtrace = 0;
   lim_data = 0; /* force reinitialization of this variable */
 
   suppress_early_error_handler_backtrace = 0;
   lim_data = 0; /* force reinitialization of this variable */
 
@@ -2612,7 +2841,8 @@ main (int argc, char **argv, char **envp)
   if (!initialized)
     {
 #ifdef DOUG_LEA_MALLOC
   if (!initialized)
     {
 #ifdef DOUG_LEA_MALLOC
-      mallopt (M_MMAP_MAX, 0);
+      if (mallopt (M_MMAP_MAX, 0) != 1)
+       ABORT();
 #endif
       run_temacs_argc = 0;
       if (! SETJMP (run_temacs_catch))
 #endif
       run_temacs_argc = 0;
       if (! SETJMP (run_temacs_catch))
@@ -2659,7 +2889,7 @@ main (int argc, char **argv, char **envp)
       if (rc != 0)
        {
          stderr_out ("malloc_set_state failed, rc = %d\n", rc);
       if (rc != 0)
        {
          stderr_out ("malloc_set_state failed, rc = %d\n", rc);
-         abort ();
+         ABORT ();
        }
 #if 0
       free (malloc_state_ptr);
        }
 #if 0
       free (malloc_state_ptr);
@@ -2669,7 +2899,8 @@ main (int argc, char **argv, char **envp)
     defined(_NO_MALLOC_WARNING_) || \
     (defined(__GLIBC__) && __GLIBC_MINOR__ < 1 && !defined(MULE)) || \
     defined(DEBUG_DOUG_LEA_MALLOC)
     defined(_NO_MALLOC_WARNING_) || \
     (defined(__GLIBC__) && __GLIBC_MINOR__ < 1 && !defined(MULE)) || \
     defined(DEBUG_DOUG_LEA_MALLOC)
-      mallopt (M_MMAP_MAX, 64);
+      if(mallopt (M_MMAP_MAX, 0) != 1)
+       ABORT();
 #endif
 #ifdef REL_ALLOC
       r_alloc_reinit ();
 #endif
 #ifdef REL_ALLOC
       r_alloc_reinit ();
@@ -2703,7 +2934,8 @@ voodoo_free_hook (void *mem)
   /* Disable all calls to free() when XEmacs is exiting and it doesn't */
   /* matter. */
   __free_hook =
   /* Disable all calls to free() when XEmacs is exiting and it doesn't */
   /* matter. */
   __free_hook =
-#ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */
+#if defined __GNUC__ || defined __INTEL_COMPILER
+/* prototype of __free_hook varies with glibc version */
     (__typeof__ (__free_hook))
 #endif
     voodoo_free_hook;
     (__typeof__ (__free_hook))
 #endif
     voodoo_free_hook;
@@ -2762,10 +2994,13 @@ all of which are called before XEmacs is actually killed.
 
 #ifdef HAVE_MS_WINDOWS
   /* If we displayed a message on the console, then we must allow the
 
 #ifdef HAVE_MS_WINDOWS
   /* If we displayed a message on the console, then we must allow the
-     user to see this message.  This may be unnecessary, but can't hurt,
-     and we can't necessarily check arg; e.g. xemacs --help kills with
-     argument 0. */
-  if (mswindows_message_outputted)
+     user to see this message.  This may be unnecessary, but can't
+     hurt, and we can't necessarily check arg; e.g. xemacs --help
+     kills with argument 0.
+
+     Don't do this in batch mode, it makes no sense and is more
+     annoying than useful. --andyp */
+  if (mswindows_message_outputted && !noninteractive)
     Fmswindows_message_box (build_string ("Messages outputted.  XEmacs is exiting."),
                            Qnil, Qnil);
 #endif
     Fmswindows_message_box (build_string ("Messages outputted.  XEmacs is exiting."),
                            Qnil, Qnil);
 #endif
@@ -2774,7 +3009,8 @@ all of which are called before XEmacs is actually killed.
 
 #if defined(GNU_MALLOC)
   __free_hook =
 
 #if defined(GNU_MALLOC)
   __free_hook =
-#ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */
+#if defined __GNUC__ || defined __INTEL_COMPILER
+/* prototype of __free_hook varies with glibc version */
     (__typeof__ (__free_hook))
 #endif
     voodoo_free_hook;
     (__typeof__ (__free_hook))
 #endif
     voodoo_free_hook;
@@ -2845,28 +3081,26 @@ shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save)
        ("Your files have been auto-saved.\n"
         "Use `M-x recover-session' to recover them.\n"
         "\n"
        ("Your files have been auto-saved.\n"
         "Use `M-x recover-session' to recover them.\n"
         "\n"
-         "If you have access to the PROBLEMS file that came with your\n"
-         "version of XEmacs, please check to see if your crash is described\n"
-         "there, as there may be a workaround available.\n"
+         "Your version of XEmacs was distributed with a PROBLEMS file that  may describe\n"
+        "your crash, and with luck a workaround.  Please check it first, but do report\n"
+        "the crash anyway.  "
 #ifdef INFODOCK
 #ifdef INFODOCK
-        "Otherwise, please report this bug by selecting `Report-Bug'\n"
-         "in the InfoDock menu.\n"
+        "\n\nPlease report this bug by selecting `Report-Bug' in the InfoDock menu.\n"
+        "*BE SURE* to include the XEmacs configuration from M-x describe-installation,\n"
+        "or the file Installation in the top directory of the build tree.\n"
 #else
 #else
-        "Otherwise, please report this bug by running the send-pr\n"
-         "script included with XEmacs, or selecting `Send Bug Report'\n"
-         "from the help menu.\n"
-        "As a last resort send ordinary email to `crashes@xemacs.org'.\n"
+        "Please report this bug by invoking M-x report-emacs-bug,\n"
+        "or by selecting `Send Bug Report' from the Help menu.  If necessary, send\n"
+        "ordinary email to `xemacs-beta@xemacs.org'.  *MAKE SURE* to include the XEmacs\n"
+        "configuration from M-x describe-installation, or equivalently the file\n"
+        "Installation in the top of the build tree.\n"
 #endif
 #endif
-        "*MAKE SURE* to include the information in the command\n"
-        "M-x describe-installation.\n"
 #ifndef _MSC_VER
         "\n"
 #ifndef _MSC_VER
         "\n"
-        "If at all possible, *please* try to obtain a C stack backtrace;\n"
-        "it will help us immensely in determining what went wrong.\n"
-        "To do this, locate the core file that was produced as a result\n"
-        "of this crash (it's usually called `core' and is located in the\n"
-        "directory in which you started the editor, or maybe in your home\n"
-        "directory), and type\n"
+        "*Please* try *hard* to obtain a C stack backtrace; without it, we are unlikely\n"
+        "to be able to analyze the problem.  Locate the core file produced as a result\n"
+        "of this crash (often called `core' or `core.<process-id>', and located in\n"
+        "the directory in which you started XEmacs or your home directory), and type\n"
         "\n"
         "  gdb "
 #endif
         "\n"
         "  gdb "
 #endif
@@ -2893,11 +3127,12 @@ shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save)
          stderr_out ("%s%s", dir, name);
       }
       stderr_out
          stderr_out ("%s%s", dir, name);
       }
       stderr_out
-       (" core\n\n"
-        "then type `where' when the debugger prompt comes up.\n"
-        "(If you don't have GDB on your system, you might have DBX,\n"
-        "or XDB, or SDB.  A similar procedure should work for all of\n"
-        "these.  Ask your system administrator if you need more help.)\n");
+       (" core\n"
+        "\n"
+        "then type `where' at the debugger prompt.  No GDB on your system?  You may\n"
+        "have DBX, or XDB, or SDB.  (Ask your system administrator if you need help.)\n"
+        "If no core file was produced, enable them (often with `ulimit -c unlimited'\n"
+        "in case of future recurrance of the crash.\n");
 #endif /* _MSC_VER */
     }
 
 #endif /* _MSC_VER */
     }
 
@@ -3094,7 +3329,7 @@ decode_env_path (const char *evarname, const char *default_)
 /* Ben thinks this function should not exist or be exported to Lisp.
    We use it to define split-path-string in subr.el (not!).  */
 
 /* Ben thinks this function should not exist or be exported to Lisp.
    We use it to define split-path-string in subr.el (not!).  */
 
-DEFUN ("split-string-by-char", Fsplit_string_by_char, 1, 2, 0, /*
+DEFUN ("split-string-by-char", Fsplit_string_by_char, 2, 2, 0, /*
 Split STRING into a list of substrings originally separated by SEPCHAR.
 */
        (string, sepchar))
 Split STRING into a list of substrings originally separated by SEPCHAR.
 */
        (string, sepchar))
@@ -3142,7 +3377,6 @@ Non-nil return value means XEmacs is running without interactive terminal.
    in one session without having to recompile. */
 /* #define ASSERTIONS_DONT_ABORT */
 
    in one session without having to recompile. */
 /* #define ASSERTIONS_DONT_ABORT */
 
-#ifdef USE_ASSERTIONS
 /* This highly dubious kludge ... shut up Jamie, I'm tired of your slagging. */
 
 static int in_assert_failed;
 /* This highly dubious kludge ... shut up Jamie, I'm tired of your slagging. */
 
 static int in_assert_failed;
@@ -3154,8 +3388,6 @@ static const char *assert_failed_expr;
 #undef fprintf
 #endif
 
 #undef fprintf
 #endif
 
-#undef abort   /* avoid infinite #define loop... */
-
 #if defined (WIN32_NATIVE) && defined (DEBUG_XEMACS)
 #define enter_debugger() DebugBreak ()
 #else
 #if defined (WIN32_NATIVE) && defined (DEBUG_XEMACS)
 #define enter_debugger() DebugBreak ()
 #else
@@ -3173,6 +3405,7 @@ assert_failed (const char *file, int line, const char *expr)
   /* We are extremely paranoid so we sensibly deal with recursive
      assertion failures. */
   in_assert_failed++;
   /* We are extremely paranoid so we sensibly deal with recursive
      assertion failures. */
   in_assert_failed++;
+  inhibit_non_essential_printing_operations = 1;
 
   if (in_assert_failed >= 4)
     _exit (-1);
 
   if (in_assert_failed >= 4)
     _exit (-1);
@@ -3211,11 +3444,11 @@ assert_failed (const char *file, int line, const char *expr)
 
   enter_debugger ();
 #if !defined (ASSERTIONS_DONT_ABORT)
 
   enter_debugger ();
 #if !defined (ASSERTIONS_DONT_ABORT)
-  abort ();
+  abort (); /* The real abort(), this time */
 #endif
 #endif
+  inhibit_non_essential_printing_operations = 0;
   in_assert_failed = 0;
 }
   in_assert_failed = 0;
 }
-#endif /* USE_ASSERTIONS */
 
 #ifdef QUANTIFY
 DEFUN ("quantify-start-recording-data", Fquantify_start_recording_data,
 
 #ifdef QUANTIFY
 DEFUN ("quantify-start-recording-data", Fquantify_start_recording_data,
@@ -3262,6 +3495,10 @@ syms_of_emacs (void)
   DEFSUBR (Fkill_emacs);
   DEFSUBR (Fnoninteractive);
 
   DEFSUBR (Fkill_emacs);
   DEFSUBR (Fnoninteractive);
 
+#ifdef DEBUG_XEMACS
+  DEFSUBR (Fforce_debugging_signal);
+#endif
+
 #ifdef QUANTIFY
   DEFSUBR (Fquantify_start_recording_data);
   DEFSUBR (Fquantify_stop_recording_data);
 #ifdef QUANTIFY
   DEFSUBR (Fquantify_start_recording_data);
   DEFSUBR (Fquantify_stop_recording_data);
@@ -3397,7 +3634,34 @@ Codename of this version of Emacs (a string).
 #ifndef XEMACS_CODENAME
 #define XEMACS_CODENAME "Noname"
 #endif
 #ifndef XEMACS_CODENAME
 #define XEMACS_CODENAME "Noname"
 #endif
+#ifdef MULE
+  {
+    char dest[129];
+    char src[64] = XEMACS_CODENAME;
+    unsigned char* sp = (unsigned char*)src;
+    int i = 0, chr;
+
+    while ( (chr = *sp++) && (i < 128) )
+      {
+       if (chr <= 0x7F)
+         dest[i++] = chr;
+       else
+         {
+#ifdef UTF2000
+           dest[i++] = (chr >> 6) | 0xC0;
+           dest[i++] = (chr & 0x3F) | 0x80;
+#else
+           dest[i++] = LEADING_BYTE_LATIN_ISO8859_1;
+           dest[i++] = chr;
+#endif
+         }
+      }
+    dest[i] = 0;
+    Vxemacs_codename = build_string (dest);
+  }
+#else  
   Vxemacs_codename = build_string (XEMACS_CODENAME);
   Vxemacs_codename = build_string (XEMACS_CODENAME);
+#endif
 
   /* Lisp variables which contain command line flags.
 
 
   /* Lisp variables which contain command line flags.
 
@@ -3590,6 +3854,39 @@ configure's idea of what `lisp-directory' will be.
   Vconfigure_lisp_directory = Qnil;
 #endif
 
   Vconfigure_lisp_directory = Qnil;
 #endif
 
+  DEFVAR_LISP ("mule-lisp-directory", &Vmule_lisp_directory /*
+*Directory of Mule Lisp files that come with XEmacs.
+*/ );
+  Vmule_lisp_directory = Qnil;
+
+  DEFVAR_LISP ("configure-mule-lisp-directory", &Vconfigure_mule_lisp_directory /*
+For internal use by the build procedure only.
+configure's idea of what `mule-lisp-directory' will be.
+*/ );
+#ifdef PATH_MULELOADSEARCH
+  Vconfigure_mule_lisp_directory = Ffile_name_as_directory
+    (build_string ((char *) PATH_MULELOADSEARCH));
+#else
+  Vconfigure_mule_lisp_directory = Qnil;
+#endif
+
+  DEFVAR_LISP ("utf-2000-lisp-directory", &Vutf_2000_lisp_directory /*
+*Directory of UTF-2000 Lisp files that come with XEmacs.
+*/ );
+  Vutf_2000_lisp_directory = Qnil;
+
+  DEFVAR_LISP ("configure-utf-2000-lisp-directory",
+              &Vconfigure_utf_2000_lisp_directory /*
+For internal use by the build procedure only.
+configure's idea of what `utf-2000-lisp-directory' will be.
+*/ );
+#ifdef PATH_UTF2000LOADSEARCH
+  Vconfigure_utf_2000_lisp_directory = Ffile_name_as_directory
+    (build_string ((char *) PATH_UTF2000LOADSEARCH));
+#else
+  Vconfigure_utf_2000_lisp_directory = Qnil;
+#endif
+
   DEFVAR_LISP ("module-directory", &Vmodule_directory /*
 *Directory of core dynamic modules that come with XEmacs.
 */ );
   DEFVAR_LISP ("module-directory", &Vmodule_directory /*
 *Directory of core dynamic modules that come with XEmacs.
 */ );