#include "console.h"
#include "process.h"
#include "redisplay.h"
+#include "frame.h"
#include "sysdep.h"
#include "syssignal.h" /* Always include before systty.h */
/* For PATH_EXEC */
#include <paths.h>
-#if !defined SYSTEM_MALLOC && !defined DOUG_LEA_MALLOC
+#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);
extern void (*__free_hook)(void *);
/* 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 Vdoc_directory, Vconfigure_doc_directory;
Lisp_Object Vconfigure_lock_directory;
Lisp_Object Vdata_directory_list;
-Lisp_Object Vinfo_directory, Vconfigure_info_directory;
+Lisp_Object Vconfigure_info_directory;
Lisp_Object Vsite_directory, Vconfigure_site_directory;
Lisp_Object Vconfigure_info_path;
Lisp_Object Vinternal_error_checking;
+Lisp_Object Vmail_lock_methods, Vconfigure_mail_lock_method;
Lisp_Object Vpath_separator;
/* The default base directory XEmacs is installed under. */
int debug_paths;
/* Save argv and argc. */
-char **initial_argv;
-int initial_argc;
+static char **initial_argv;
+static int initial_argc;
static void sort_args (int argc, char **argv);
extern int malloc_cookie;
#endif
-#if !defined(SYSTEM_MALLOC) && !defined(HAVE_LIBMCHECK)
+#if (!defined (SYSTEM_MALLOC) && !defined (HAVE_LIBMCHECK) \
+ && !defined (DOUG_LEA_MALLOC))
/* Make sure that any libraries we link against haven't installed a
hook for a gmalloc of a potentially incompatible version. */
/* If we're using libmcheck, the hooks have already been initialized, */
__malloc_hook = NULL;
__realloc_hook = NULL;
__free_hook = NULL;
-#endif /* not SYSTEM_MALLOC */
+#endif /* not SYSTEM_MALLOC or HAVE_LIBMCHECK or DOUG_LEA_MALLOC */
noninteractive = 0;
We try to do things in an order that minimizes the non-obvious
dependencies between functions. */
+ /* purify_flag 1 is correct even if CANNOT_DUMP.
+ * loadup.el will set to nil at end. */
+
+ purify_flag = 0;
+#ifdef PDUMP
+ if (restart)
+ initialized = 1;
+ else {
+ initialized = pdump_load ();
+ purify_flag = !initialized;
+ }
+#else
+ if (!initialized)
+ purify_flag = 1;
+#endif
+
if (!initialized)
{
/* Initialize things so that new Lisp objects
#if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
syms_of_gui ();
#endif
+ syms_of_gutter ();
syms_of_indent ();
syms_of_intl ();
syms_of_keymap ();
syms_of_rangetab ();
syms_of_redisplay ();
syms_of_search ();
+ syms_of_select ();
syms_of_signal ();
syms_of_sound ();
syms_of_specifier ();
#if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
syms_of_gui_x ();
#endif
+#ifdef HAVE_XIM
+#ifdef XIM_XLIB
+ syms_of_input_method_xlib ();
+#endif
+#endif /* HAVE_XIM */
#endif /* HAVE_X_WINDOWS */
#ifdef HAVE_MS_WINDOWS
syms_of_mule_charset ();
#endif
#ifdef FILE_CODING
- syms_of_mule_coding ();
+ syms_of_file_coding ();
#endif
#ifdef MULE
#ifdef HAVE_WNN
syms_of_eldap ();
#endif
+#ifdef HAVE_GPM
+ syms_of_gpmevent ();
+#endif
+
/* Now create the subtypes for the types that have them.
We do this before the vars_*() because more symbols
may get initialized here. */
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
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
specifier_type_create ();
specifier_type_create_image ();
+ specifier_type_create_gutter ();
specifier_type_create_objects ();
#ifdef HAVE_TOOLBARS
specifier_type_create_toolbar ();
image_instantiator_format_create ();
image_instantiator_format_create_glyphs_eimage ();
image_instantiator_format_create_glyphs_widget ();
+#ifdef HAVE_TTY
+ image_instantiator_format_create_glyphs_tty ();
+#endif
#ifdef HAVE_X_WINDOWS
image_instantiator_format_create_glyphs_x ();
#endif /* HAVE_X_WINDOWS */
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 ();
staticpro()
Fprovide(symbol)
intern()
- pure_put()
+ Fput()
xmalloc()
defsymbol(), if it's absolutely necessary and you're sure that
the symbol isn't referenced anywhere else in the initialization
Any of the object-creating functions on alloc.c: e.g.
make_pure_*()
- Fpurecopy()
make_string()
build_string()
make_vector()
Fcons()
listN()
make_opaque_ptr()
- make_opaque_long()
perhaps a few others.
*/
/* Now allow Fprovide() statements to be made. */
init_provide_once ();
+ /* Do that before any specifier creation (esp. vars_of_glyphs()) */
+ vars_of_specifier ();
+
vars_of_abbrev ();
vars_of_alloc ();
#ifdef HAVE_X_WINDOWS
vars_of_bytecode ();
vars_of_callint ();
vars_of_callproc ();
+ vars_of_chartab ();
vars_of_cmdloop ();
vars_of_cmds ();
vars_of_console ();
#if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
vars_of_gui ();
#endif
+ vars_of_gutter ();
vars_of_indent ();
vars_of_insdel ();
vars_of_intl ();
#ifdef HAVE_SHLIB
vars_of_module ();
#endif
+#ifdef WINDOWSNT
+ vars_of_ntproc ();
+#endif
vars_of_objects ();
vars_of_print ();
vars_of_scrollbar ();
#endif
vars_of_search ();
+ vars_of_select ();
vars_of_sound ();
- vars_of_specifier ();
vars_of_symbols ();
vars_of_syntax ();
#ifdef HAVE_TOOLBARS
#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
vars_of_eldap ();
#endif
+#ifdef HAVE_GPM
+ vars_of_gpmevent ();
+#endif
+
/* Now initialize any specifier variables. We do this later
because it has some dependence on the vars initialized
above.
*/
specifier_vars_of_glyphs ();
+ specifier_vars_of_gutter ();
#ifdef HAVE_MENUBARS
specifier_vars_of_menubar ();
#endif
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
garbage_collect_1 ();
}
#endif
+#ifdef PDUMP
+ } else if (!restart) {
+ reinit_alloc_once_early ();
+ reinit_opaque_once_early ();
+
+ reinit_console_type_create_stream ();
+#ifdef HAVE_TTY
+ reinit_console_type_create_tty ();
+#endif
+#ifdef HAVE_X_WINDOWS
+ reinit_console_type_create_x ();
+ reinit_console_type_create_device_x ();
+#endif
+#ifdef HAVE_MS_WINDOWS
+ reinit_console_type_create_mswindows ();
+#endif
+
+ reinit_specifier_type_create ();
+ reinit_specifier_type_create_image ();
+ reinit_specifier_type_create_gutter ();
+ reinit_specifier_type_create_objects ();
+#ifdef HAVE_TOOLBARS
+ reinit_specifier_type_create_toolbar ();
+#endif
+
+ structure_type_create ();
+
+ structure_type_create_chartab ();
+ structure_type_create_faces ();
+ structure_type_create_rangetab ();
+ structure_type_create_hash_table ();
+
+ lstream_type_create ();
+#ifdef FILE_CODING
+ lstream_type_create_file_coding ();
+#endif
+#if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT)
+ lstream_type_create_mswindows_selectable ();
+#endif
+#ifdef HAVE_UNIX_PROCESSES
+ process_type_create_unix ();
+#endif
+#ifdef HAVE_WIN32_PROCESSES
+ process_type_create_nt ();
+#endif
+
+ reinit_vars_of_buffer ();
+ reinit_vars_of_console ();
+#ifdef DEBUG_XEMACS
+ reinit_vars_of_debug ();
+#endif
+ reinit_vars_of_device ();
+ reinit_vars_of_eval ();
+#ifdef HAVE_X_WINDOWS
+ reinit_vars_of_event_Xt ();
+#endif
+#if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
+ reinit_vars_of_event_tty ();
+#endif
+#ifdef HAVE_MS_WINDOWS
+ reinit_vars_of_event_mswindows ();
+#endif
+ reinit_vars_of_event_stream ();
+ reinit_vars_of_events ();
+ reinit_vars_of_extents ();
+ reinit_vars_of_font_lock ();
+ reinit_vars_of_glyphs ();
+ reinit_vars_of_glyphs_widget ();
+ reinit_vars_of_insdel ();
+ reinit_vars_of_lread ();
+ reinit_vars_of_lstream ();
+ reinit_vars_of_minibuf ();
+#ifdef HAVE_SHLIB
+ reinit_vars_of_module ();
+#endif
+ reinit_vars_of_objects ();
+ reinit_vars_of_print ();
+ reinit_vars_of_redisplay ();
+ reinit_vars_of_search ();
+ reinit_vars_of_scrollbar_x ();
+ reinit_vars_of_undo ();
+ reinit_vars_of_window ();
+
+#ifdef HAVE_MS_WINDOWS
+ reinit_vars_of_frame_mswindows ();
+#endif
+
+#ifdef HAVE_X_WINDOWS
+ reinit_vars_of_device_x ();
+#endif
+#ifdef HAVE_SCROLLBARS
+ reinit_vars_of_scrollbar_x ();
+#ifdef HAVE_MENUBARS
+ reinit_vars_of_menubar_x ();
+#endif
+ reinit_vars_of_xselect ();
+#if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
+ reinit_vars_of_gui_x ();
+#endif
+#endif
+
+#if defined(MULE) && defined(HAVE_WNN)
+ reinit_vars_of_mule_wnn ();
+#endif
+
+ reinit_complex_vars_of_buffer ();
+ reinit_complex_vars_of_console ();
+ reinit_complex_vars_of_minibuf ();
+#endif
}
+
/* CONGRATULATIONS!!! We have successfully initialized the Lisp
engine. */
init_redisplay (); /* Determine terminal type.
init_sys_modes uses results */
+ init_frame ();
init_event_stream (); /* Set up so we can get user input. */
init_macros (); /* set up so we can run macros. */
init_editfns (); /* Determine the name of the user we're running as */
unbind_to (0, Qnil); /* this closes loadup.el */
purify_flag = 0;
run_temacs_argc = nargs + 1;
+#ifdef HEAP_IN_DATA
+ report_sheap_usage (0);
+#endif
LONGJMP (run_temacs_catch, 1);
return Qnil; /* not reached; warning suppression */
}
{
/* Disable all calls to free() when XEmacs is exiting and it doesn't */
/* matter. */
- __free_hook = voodoo_free_hook;
-}
+ __free_hook =
+#ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */
+ (__typeof__ (__free_hook))
#endif
+ voodoo_free_hook;
+}
+#endif /* GNU_MALLOC */
DEFUN ("kill-emacs", Fkill_emacs, 0, 1, "P", /*
Exit the XEmacs job and kill it. Ask for confirmation, without argument.
UNGCPRO;
- shut_down_emacs (0, ((STRINGP (arg)) ? arg : Qnil));
+ shut_down_emacs (0, STRINGP (arg) ? arg : Qnil);
#if defined(GNU_MALLOC)
- __free_hook = voodoo_free_hook;
+ __free_hook =
+#ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */
+ (__typeof__ (__free_hook))
+#endif
+ voodoo_free_hook;
#endif
- exit ((INTP (arg)) ? XINT (arg) : 0);
+ exit (INTP (arg) ? XINT (arg) : 0);
/* NOTREACHED */
return Qnil; /* I'm sick of the compiler warning */
}
("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"
#ifdef INFODOCK
- "Please report this bug by selecting `Report-Bug' in the InfoDock\n"
- "menu.\n"
+ "Otherwise, please report this bug by selecting `Report-Bug'\n"
+ "in the InfoDock menu.\n"
#else
- "Please report this bug by running the send-pr script included\n"
- "with XEmacs, or selecting `Send Bug Report' from the help menu.\n"
+ "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"
#endif
"*MAKE SURE* to include the information in the command\n"
/* Now try to determine the actual path to the executable,
to try to make the backtrace-determination process as foolproof
as possible. */
- if (GC_STRINGP (Vinvocation_name))
+ if (STRINGP (Vinvocation_name))
name = (char *) XSTRING_DATA (Vinvocation_name);
else
name = "xemacs";
- if (GC_STRINGP (Vinvocation_directory))
+ if (STRINGP (Vinvocation_directory))
dir = (char *) XSTRING_DATA (Vinvocation_directory);
if (!dir || dir[0] != '/')
stderr_out ("`which %s`", name);
opurify = purify_flag;
purify_flag = 0;
+#ifdef HEAP_IN_DATA
+ report_sheap_usage (1);
+#endif
+
+ clear_message ();
+
fflush (stderr);
fflush (stdout);
symname_ext = 0;
garbage_collect_1 ();
+
+#ifdef PDUMP
+ pdump ();
+#else
+
#ifdef DOUG_LEA_MALLOC
malloc_state_ptr = malloc_get_state ();
#endif
#ifdef DOUG_LEA_MALLOC
free (malloc_state_ptr);
#endif
+#endif /* not PDUMP */
}
#endif /* not MSDOS and EMX */
DEFVAR_LISP ("system-configuration", &Vsystem_configuration /*
String naming the configuration XEmacs was built for.
*/ );
- Vsystem_configuration = Fpurecopy (build_string (EMACS_CONFIGURATION));
+ Vsystem_configuration = build_string (EMACS_CONFIGURATION);
#ifndef EMACS_CONFIG_OPTIONS
# define EMACS_CONFIG_OPTIONS "UNKNOWN"
DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options /*
String containing the configuration options XEmacs was built with.
*/ );
- Vsystem_configuration_options = Fpurecopy (build_string
- (EMACS_CONFIG_OPTIONS));
+ Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
DEFVAR_LISP ("emacs-major-version", &Vemacs_major_version /*
Major version number of this version of Emacs, as an integer.
*/ );
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
#ifndef XEMACS_CODENAME
#define XEMACS_CODENAME "Noname"
#endif
- Vxemacs_codename = Fpurecopy (build_string (XEMACS_CODENAME));
+ Vxemacs_codename = build_string (XEMACS_CODENAME);
DEFVAR_BOOL ("noninteractive", &noninteractive1 /*
Non-nil means XEmacs is running without interactive terminal.
Vinternal_error_checking = Fcons (intern ("bufpos"),
Vinternal_error_checking);
#endif
- Vinternal_error_checking = Fpurecopy (Vinternal_error_checking);
+
+ DEFVAR_CONST_LISP ("mail-lock-methods", &Vmail_lock_methods /*
+Mail spool locking methods supported by this instance of XEmacs.
+This is a list of symbols. Each of the symbols is one of the
+following: dot, lockf, flock, locking, mmdf.
+*/ );
+ {
+ Vmail_lock_methods = Qnil;
+ Vmail_lock_methods = Fcons (intern ("dot"), Vmail_lock_methods);
+#ifdef HAVE_LOCKF
+ Vmail_lock_methods = Fcons (intern ("lockf"), Vmail_lock_methods);
+#endif
+#ifdef HAVE_FLOCK
+ Vmail_lock_methods = Fcons (intern ("flock"), Vmail_lock_methods);
+#endif
+#ifdef HAVE_MMDF
+ Vmail_lock_methods = Fcons (intern ("mmdf"), Vmail_lock_methods);
+#endif
+#ifdef HAVE_LOCKING
+ Vmail_lock_methods = Fcons (intern ("locking"), Vmail_lock_methods);
+#endif
+ }
+
+ DEFVAR_CONST_LISP ("configure-mail-lock-method", &Vconfigure_mail_lock_method /*
+Mail spool locking method suggested by configure. This is one
+of the symbols in MAIL-LOCK-METHODS.
+*/ );
+ {
+#if defined(MAIL_LOCK_FLOCK) && defined(HAVE_FLOCK)
+ Vconfigure_mail_lock_method = intern("flock");
+#elif defined(MAIL_LOCK_LOCKF) && defined(HAVE_LOCKF)
+ Vconfigure_mail_lock_method = intern("lockf");
+#elif defined(MAIL_LOCK_MMDF) && defined(HAVE_MMDF)
+ Vconfigure_mail_lock_method = intern("mmdf");
+#elif defined(MAIL_LOCK_LOCKING) && defined(HAVE_LOCKING)
+ Vconfigure_mail_lock_method = intern("locking");
+#else
+ Vconfigure_mail_lock_method = intern("dot");
+#endif
+ }
DEFVAR_LISP ("path-separator", &Vpath_separator /*
The directory separator in search paths, as a string.
#endif
}
-#ifdef __sgi
+#if defined(__sgi) && !defined(PDUMP)
/* This is so tremendously ugly I'd puke. But then, it works.
* The target is to override the static constructor from the
* libiflPNG.so library which is maskerading as libz, and