#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
/* 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 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;
/* 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;
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;
#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");
/* 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;
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))
{
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
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
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_rangetab ();
syms_of_redisplay ();
syms_of_search ();
+ syms_of_select ();
syms_of_signal ();
syms_of_sound ();
syms_of_specifier ();
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 ();
#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 ();
#ifdef HAVE_MSW_C_DIRED
syms_of_dired_mswindows ();
#endif
+#ifdef WINDOWSNT
+ syms_of_ntproc ();
+#endif
#endif /* HAVE_MS_WINDOWS */
#ifdef MULE
syms_of_mule_charset ();
#endif
#ifdef FILE_CODING
- syms_of_mule_coding ();
+ syms_of_file_coding ();
#endif
#ifdef MULE
#ifdef HAVE_WNN
SYMS_MACHINE;
#endif
-#ifdef EMACS_BTL
- syms_of_btl ();
-#endif
-
/*
#if defined (GNU_MALLOC) && \
defined (ERROR_CHECK_MALLOC) && \
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
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
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 ();
#endif
-
+
/* Initialize processes implementation.
The functions may make exactly the following function/macro calls:
vars_of_bytecode ();
vars_of_callint ();
vars_of_callproc ();
+ vars_of_chartab ();
vars_of_cmdloop ();
vars_of_cmds ();
vars_of_console ();
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_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
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_scrollbar ();
#endif
vars_of_search ();
+ vars_of_select ();
vars_of_sound ();
vars_of_specifier ();
vars_of_symbols ();
#ifdef HAVE_TTY
vars_of_console_tty ();
- vars_of_event_tty ();
vars_of_frame_tty ();
vars_of_objects_tty ();
#endif
#ifdef HAVE_DIALOGS
vars_of_dialog_x ();
#endif
- vars_of_event_Xt ();
vars_of_frame_x ();
vars_of_glyphs_x ();
#ifdef HAVE_MENUBARS
#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 ();
#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
/* 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
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 ();
- /* 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
#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
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);
}
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
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,
}
}
- /* 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;
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;
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;
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;
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;
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 */
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 ();
}
#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
/* 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. */
/* 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);
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
+ clear_message ();
+
fflush (stderr);
fflush (stdout);
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 */
#ifdef QUANTIFY
DEFUN ("quantify-start-recording-data", Fquantify_start_recording_data,
- 0, 0, 0, /*
+ 0, 0, "", /*
Start recording Quantify data.
*/
())
}
DEFUN ("quantify-stop-recording-data", Fquantify_stop_recording_data,
- 0, 0, 0, /*
+ 0, 0, "", /*
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.
*/
())
*/ );
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
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,
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\".
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.
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.
* 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___()
{
}