Mercurial > hg > xemacs-beta
diff src/emacs.c @ 412:697ef44129c6 r21-2-14
Import from CVS: tag r21-2-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:20:41 +0200 |
parents | de805c49cfc1 |
children | da8ed4261e83 |
line wrap: on
line diff
--- a/src/emacs.c Mon Aug 13 11:19:22 2007 +0200 +++ b/src/emacs.c Mon Aug 13 11:20:41 2007 +0200 @@ -2,7 +2,6 @@ Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994 Free Software Foundation, Inc. Copyright (C) 1995 Sun Microsystems, Inc. - Copyright (C) 2000 Ben Wing. This file is part of XEmacs. @@ -23,141 +22,6 @@ /* Synched up with: Mule 2.0, FSF 19.28. */ -/* Capsule summary of the various releases of Lucid Emacs/XEmacs and - FSF/GNU Emacs. Provided here for use in cross-referencing version - releases and dates in comments, esp. in the authorship comments at - the beginning of each file. More information about history can be - found in the beginning of the Internals Manual and in the About page. - - --- A time line for Lucid Emacs/XEmacs is - -version 19.0 shipped with Energize 1.0, April 1992. -version 19.1 released June 4, 1992. -version 19.2 released June 19, 1992. -version 19.3 released September 9, 1992. -version 19.4 released January 21, 1993. -version 19.5 was a repackaging of 19.4 with a few bug fixes and - shipped with Energize 2.0. Never released to the net. -version 19.6 released April 9, 1993. -version 19.7 was a repackaging of 19.6 with a few bug fixes and - shipped with Energize 2.1. Never released to the net. -version 19.8 released September 6, 1993. -version 19.9 released January 12, 1994. -version 19.10 released May 27, 1994. -version 19.11 (first XEmacs) released September 13, 1994. -version 19.12 released June 23, 1995. -version 19.13 released September 1, 1995. -version 19.14 released June 23, 1996. -version 20.0 released February 9, 1997. -version 19.15 released March 28, 1997. -version 20.1 (not released to the net) April 15, 1997. -version 20.2 released May 16, 1997. -version 19.16 released October 31, 1997. -version 20.3 (the first stable version of XEmacs 20.x) released - November 30, 1997. -version 20.4 released February 28, 1998. - - --- A time line for GNU Emacs version 19 is - -version 19.7 (beta) (first beta release) released ??????; prob. late May 1993. -version 19.8 (beta) released May 27, 1993. -version 19.9 (beta) released May 27, 1993. -version 19.10 (beta) released May 30, 1993. -version 19.11 (beta) released June 1, 1993. -version 19.12 (beta) released June 2, 1993. -version 19.13 (beta) released June 8, 1993. -version 19.14 (beta) released June 17, 1993. -version 19.15 (beta) released June 19, 1993. -version 19.16 (beta) released July 6, 1993. -version 19.17 (beta) released late July, 1993. -version 19.18 (beta) released August 9, 1993. -version 19.19 (beta) released August 15, 1993. -version 19.20 (beta) released November 17, 1993. -version 19.21 (beta) released November 17, 1993. -version 19.22 (beta) released November 28, 1993. -version 19.23 (beta) released May 17, 1994. -version 19.24 (beta) released May 16, 1994. -version 19.25 (beta) released June 3, 1994. -version 19.26 (beta) released September 11, 1994. -version 19.27 (beta) released September 14, 1994. -version 19.28 (first ``official'' release) released November 1, 1994. -version 19.29 released June 21, 1995. -version 19.30 released November 24, 1995. -version 19.31 released May 25, 1996. -version 19.32 released July 31, 1996. -version 19.33 released August 11, 1996. -version 19.34 released August 21, 1996. -version 19.34b released September 6, 1996. - - --- A time line for GNU Emacs version 20 is - -version 20.1 released September 17, 1997. -version 20.2 released September 20, 1997. -version 20.3 released August 19, 1998. - - --- A time line for GNU Emacs version 18 and older is - -GNU Emacs version 15 (15.34) was released sometime in 1984 or 1985 and - shared some code with a version of Emacs written by James Gosling (the - same James Gosling who later created the Java language). -GNU Emacs version 16 (first released version was 16.56) was released on - July 15, 1985. All Gosling code was removed due to potential copyright - problems with the code. -version 16.57: released on September 16, 1985. -versions 16.58, 16.59: released on September 17, 1985. -version 16.60: released on September 19, 1985. These later version 16's - incorporated patches from the net, esp. for getting Emacs to work under - System V. -version 17.36 (first official v17 release) released on December 20, 1985. - Included a TeX-able user manual. First official unpatched version that - worked on vanilla System V machines. -version 17.43 (second official v17 release) released on January 25, 1986. -version 17.45 released on January 30, 1986. -version 17.46 released on February 4, 1986. -version 17.48 released on February 10, 1986. -version 17.49 released on February 12, 1986. -version 17.55 released on March 18, 1986. -version 17.57 released on March 27, 1986. -version 17.58 released on April 4, 1986. -version 17.61 released on April 12, 1986. -version 17.63 released on May 7, 1986. -version 17.64 released on May 12, 1986. -version 18.24 (a beta version) released on October 2, 1986. -version 18.30 (a beta version) released on November 15, 1986. -version 18.31 (a beta version) released on November 23, 1986. -version 18.32 (a beta version) released on December 7, 1986. -version 18.33 (a beta version) released on December 12, 1986. -version 18.35 (a beta version) released on January 5, 1987. -version 18.36 (a beta version) released on January 21, 1987. -January 27, 1987: The Great Usenet Renaming. net.emacs is now comp.emacs. -version 18.37 (a beta version) released on February 12, 1987. -version 18.38 (a beta version) released on March 3, 1987. -version 18.39 (a beta version) released on March 14, 1987. -version 18.40 (a beta version) released on March 18, 1987. -version 18.41 (the first ``official'' release) released on March 22, 1987. -version 18.45 released on June 2, 1987. -version 18.46 released on June 9, 1987. -version 18.47 released on June 18, 1987. -version 18.48 released on September 3, 1987. -version 18.49 released on September 18, 1987. -version 18.50 released on February 13, 1988. -version 18.51 released on May 7, 1988. -version 18.52 released on September 1, 1988. -version 18.53 released on February 24, 1989. -version 18.54 released on April 26, 1989. -version 18.55 released on August 23, 1989. This is the earliest version - that is still available by FTP. -version 18.56 released on January 17, 1991. -version 18.57 released late January, 1991. -version 18.58 released ?????. -version 18.59 released October 31, 1992. - -*/ - /* Note: It is necessary to specify <config.h> and not "config.h" in order for the --srcdir type of compilation to work properly. Otherwise the config.h from the srcdir, rather than the one from @@ -172,7 +36,6 @@ #include "console.h" #include "process.h" #include "redisplay.h" -#include "frame.h" #include "sysdep.h" #include "syssignal.h" /* Always include before systty.h */ @@ -180,15 +43,6 @@ #include "sysfile.h" #include "systime.h" -#ifdef PDUMP -#include "dump-id.h" -#include "dumper.h" -#endif - -#ifndef SEPCHAR -#define SEPCHAR ':' -#endif - #ifdef QUANTIFY #include <quantify.h> #endif @@ -203,21 +57,23 @@ #endif #ifdef TOOLTALK -#include TT_C_H_FILE +#include TT_C_H_PATH #endif -#if defined (WIN32_NATIVE) -#include "nt.h" +#ifdef APOLLO +#ifndef APOLLO_SR10 +#include <default_acl.h> +#endif +#endif + +#if defined (WINDOWSNT) +#include <windows.h> #endif /* For PATH_EXEC */ #include <paths.h> -#if defined (HEAP_IN_DATA) && !defined(PDUMP) -void report_sheap_usage (int die_if_pure_storage_exceeded); -#endif - -#if !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC) +#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 *); @@ -255,7 +111,6 @@ /* 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 @@ -291,11 +146,10 @@ Lisp_Object Vdoc_directory, Vconfigure_doc_directory; Lisp_Object Vconfigure_lock_directory; Lisp_Object Vdata_directory_list; -Lisp_Object Vconfigure_info_directory; +Lisp_Object Vinfo_directory, 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. */ @@ -306,10 +160,8 @@ priority. */ int emacs_priority; -/* Some FSF junk with running_asynch_code, to preserve the match - data. Not necessary because we don't call process filters - asynchronously (i.e. from within QUIT). */ -/* #### Delete this when merging the rest of my code */ +/* If non-zero a filter or a sentinel is running. Tested to save the match + data on the first attempt to change it inside asynchronous code. */ int running_asynch_code; /* If non-zero, a window-system was specified on the command line. */ @@ -318,7 +170,7 @@ /* Type of display specified. We cannot use a Lisp symbol here because Lisp symbols may not initialized at the time that we set this variable. */ -const char *display_use; +CONST char *display_use; /* If non-zero, then the early error handler will only print the error message and exit. */ @@ -360,16 +212,12 @@ /* Nonzero means don't load package autoloads at startup */ int inhibit_autoloads; -/* Nonzero means don't load the dump file (ignored if not PDUMP) */ - -int nodumpfile; - /* Nonzero means print debug information about path searching */ int debug_paths; /* Save argv and argc. */ -static char **initial_argv; -static int initial_argc; +char **initial_argv; +int initial_argc; static void sort_args (int argc, char **argv); @@ -379,126 +227,35 @@ extern Lisp_Object Vlisp_EXEC_SUFFIXES; - -/* Ben's capsule summary about expected and unexpected exits from XEmacs. - - Expected exits occur when the user directs XEmacs to exit, for example - by pressing the close button on the only frame in XEmacs, or by typing - C-x C-c. This runs `save-buffers-kill-emacs', which saves any necessary - buffers, and then exits using the primitive `kill-emacs'. - - However, unexpected exits occur in a few different ways: - - -- a memory access violation or other hardware-generated exception - occurs. This is the worst possible problem to deal with, because - the fault can occur while XEmacs is in any state whatsoever, even - quite unstable ones. As a result, we need to be *extremely* careful - what we do. - -- we are using one X display (or if we've used more, we've closed the - others already), and some hardware or other problem happens and - suddenly we've lost our connection to the display. In this situation, - things are not so dire as in the last one; our code itself isn't - trashed, so we can continue execution as normal, after having set - things up so that we can exit at the appropriate time. Our exit - still needs to be of the emergency nature; we have no displays, so - any attempts to use them will fail. We simply want to auto-save - (the single most important thing to do during shut-down), do minimal - cleanup of stuff that has an independent existence outside of XEmacs, - and exit. - - Currently, both unexpected exit scenarios described above set - preparing_for_armageddon to indicate that nonessential and possibly - dangerous things should not be done, specifically: - - -- no garbage collection. - -- no hooks are run. - -- no messages of any sort from autosaving. - -- autosaving tries harder, ignoring certain failures. - -- existing frames are not deleted. - - (Also, all places that set preparing_for_armageddon also - set dont_check_for_quit. This happens separately because it's - also necessary to set other variables to make absolutely sure - no quitting happens.) - - In the first scenario above (the access violation), we also set - fatal_error_in_progress. This causes more things to not happen: - - -- assertion failures do not abort. - -- printing code does not do code conversion or gettext when - printing to stdout/stderr. -*/ - -/* Nonzero if handling a fatal error already. */ -int fatal_error_in_progress; - -/* Non-nil means we're going down, so we better not run any hooks - or do other non-essential stuff. */ -int preparing_for_armageddon; - - -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 void shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save); - -static void -ensure_no_quitting_from_now_on (void) -{ - /* make sure no quitting from now on!! */ - dont_check_for_quit = 1; - Vinhibit_quit = Qt; - Vquit_flag = Qnil; -} +/* Signal code for the fatal signal that was received */ +static int fatal_error_code; + +/* Nonzero if handling a fatal error already */ +static int fatal_error_in_progress; + +static void shut_down_emacs (int sig, Lisp_Object stuff); /* Handle bus errors, illegal instruction, etc. */ SIGTYPE fatal_error_signal (int sig) { - fatal_error_in_progress++; - preparing_for_armageddon = 1; - - ensure_no_quitting_from_now_on (); - + fatal_error_code = sig; + signal (sig, SIG_DFL); /* Unblock the signal so that if the same signal gets sent in the code below, we avoid a deadlock. */ - EMACS_UNBLOCK_SIGNAL (sig); - - /* Only try auto-saving first time through. If we crash in auto-saving, - don't do it again. */ - if (fatal_error_in_progress == 1) + EMACS_UNBLOCK_SIGNAL (fatal_error_code); + + /* If fatal error occurs in code below, avoid infinite recursion. */ + if (! fatal_error_in_progress) { - Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */ - /* Do this so that the variable has the same value of 2 regardless of - whether we made it through auto-saving correctly. */ - fatal_error_in_progress++; - } - else if (fatal_error_in_progress == 2) - stderr_out ("WARNING: Unable to auto-save your files properly.\n" - "Some or all may in fact have been auto-saved.\n" - "\n"); - - /* Now, reset our signal handler, so the next time, we just die. - Don't do this before auto-saving. */ - signal (sig, SIG_DFL); - - /* Keep in mind that there's more than one signal that we can crash - on. */ - /* If fatal error occurs in code below, avoid infinite recursion. */ - if (fatal_error_in_progress <= 2) - { - shut_down_emacs (sig, Qnil, 1); + fatal_error_in_progress = dont_check_for_quit = 1; + shut_down_emacs (sig, Qnil); stderr_out ("\nLisp backtrace follows:\n\n"); Fbacktrace (Qexternal_debugging_output, Qt); # if 0 /* This is evil, rarely useful, and causes grief in some cases. */ /* Check for Sun-style stack printing via /proc */ { - const char *pstack = "/usr/proc/bin/pstack"; + CONST char *pstack = "/usr/proc/bin/pstack"; if (access (pstack, X_OK) == 0) { char buf[100]; @@ -511,96 +268,65 @@ # endif } /* Signal the same code; this time it will really be fatal. */ - kill (getpid (), sig); + kill (getpid (), fatal_error_code); SIGRETURN; } - -#ifdef _MSC_VER - -static DWORD -mswindows_handle_hardware_exceptions (DWORD code) + + +DOESNT_RETURN +fatal (CONST char *fmt, ...) { - if (code != STATUS_ACCESS_VIOLATION && code != STATUS_ILLEGAL_INSTRUCTION - && code != STATUS_PRIVILEGED_INSTRUCTION - && code != STATUS_DATATYPE_MISALIGNMENT) - return EXCEPTION_CONTINUE_SEARCH; - - /* I don't know if this filter is still wrapped in the outer __try, but - it doesn't hurt to have another one. --ben - And it lets us control more exactly what we really want to do in such - a situation. */ - __try - { - fatal_error_in_progress++; - preparing_for_armageddon = 1; - - ensure_no_quitting_from_now_on (); - - /* Only try auto-saving first time through. If we crash in auto-saving, - don't do it again. */ - if (fatal_error_in_progress == 1) - { - Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */ - /* Do this so that the variable has the same value of 2 regardless of - whether we made it through auto-saving correctly. */ - fatal_error_in_progress++; - } - else if (fatal_error_in_progress == 2) - stderr_out ("WARNING: Unable to auto-save your files properly.\n" - "Some or all may in fact have been auto-saved.\n" - "\n"); - - /* If fatal error occurs in code below, avoid infinite recursion. */ - if (fatal_error_in_progress <= 2) - { - shut_down_emacs (-1, Qnil, 1); - stderr_out ("\nLisp backtrace follows:\n\n"); - Fbacktrace (Qexternal_debugging_output, Qt); - } - } - /* VC++ documentation says that - GetExceptionCode() cannot be called inside the filter itself. */ - - /* __except (mswindows_handle_hardware_exceptions (GetExceptionCode ())) {} - - The line above is original. Unfortunately, when an error is tripped - inside of the handler (e.g. during Fbacktrace()), and the handler for - the handler is invoked, it correctly notices that something is amiss - and it should just return -- but it returns EXCEPTION_CONTINUE_SEARCH, - which causes the debugger to be invoked debugging the handler code in - this function -- and WITH THE STACK UNWOUND so that you see main() - calling mswindows_handle_hardware_exceptions(), calling Fbacktrace(), - and a crash a couple of frames in -- AND NO SIGN OF THE ORIGINAL CRASH! - - There's some real weirdness going on in the stack handling -- unlike - in Unix, where further crashes just keep adding to the stack, it seems - that under the structured-exception-handling, the stack can actually - bounce back and forth between the full stack at the location of the - exception and the unwound stack at the place where the __try clause was - established. I don't completely understand it. What I do know is that - returning EXCEPTION_EXECUTE_HANDLER on nested crash has the effect of - aborting execution of the handler and going back to the outer filter - function, which returns EXCEPTION_CONTINUE_SEARCH and everything is - hunky-dorey -- your debugger sees a crash at the right location with - the right stack. - - I'm leaving in the trickier Unix-like code in the handler; someone who - understands better than me how the stack works in these handlers could - fix it up more. As it is, it works pretty well, so I'm not likely to - touch it more. --ben - */ - - __except (EXCEPTION_EXECUTE_HANDLER) {} - - - /* pretend we didn't handle this, so that the debugger is invoked and/or - the normal GPF box appears. */ - return EXCEPTION_CONTINUE_SEARCH; + va_list args; + va_start (args, fmt); + + fprintf (stderr, "\nXEmacs: "); + vfprintf (stderr, GETTEXT (fmt), args); + fprintf (stderr, "\n"); + + va_end (args); + fflush (stderr); + exit (1); } -#endif /* _MSC_VER */ - - +/* #### The following two functions should be replaced with + calls to emacs_doprnt_*() functions, with STREAM set to send out + to stdout or stderr. This is the only way to ensure that + I18N3 works properly (many implementations of the *printf() + functions, including the ones included in glibc, do not implement + the %###$ argument-positioning syntax). */ + +/* exactly equivalent to fprintf (stderr, fmt, ...) except that it calls + GETTEXT on the format string. */ + +int +stderr_out (CONST char *fmt, ...) +{ + int retval; + va_list args; + va_start (args, fmt); + + retval = vfprintf (stderr, GETTEXT (fmt), args); + + va_end (args); + /* fflush (stderr); */ + return retval; +} + +/* exactly equivalent to fprintf (stdout, fmt, ...) except that it calls + GETTEXT on the format string. */ + +int +stdout_out (CONST char *fmt, ...) +{ + int retval; + va_list args; + va_start (args, fmt); + + retval = vfprintf (stdout, GETTEXT (fmt), args); + + va_end (args); + return retval; +} #ifdef SIGDANGER @@ -632,13 +358,13 @@ { if (i == 0 || i > skip_args) { -#ifdef WIN32_NATIVE +#ifdef WINDOWSNT if (i == 0) { /* Do not trust to what crt0 has stuffed into argv[0] */ char full_exe_path [MAX_PATH]; GetModuleFileName (NULL, full_exe_path, MAX_PATH); - result = Fcons (build_ext_string (full_exe_path, Qfile_name), + result = Fcons (build_ext_string (full_exe_path, FORMAT_FILENAME), result); #if defined(HAVE_SHLIB) (void)dll_init(full_exe_path); @@ -646,8 +372,7 @@ } else #endif - result = Fcons (build_ext_string (argv [i], Qfile_name), - result); + result = Fcons (build_ext_string (argv [i], FORMAT_FILENAME), result); } } return result; @@ -671,12 +396,10 @@ for (i = 0, next = argv_list; i < n; i++, next = XCDR (next)) { - const char *temp; + CONST char *temp; CHECK_STRING (XCAR (next)); - TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (next), - C_STRING_ALLOCA, temp, - Qnative); + GET_C_STRING_EXT_DATA_ALLOCA (XCAR (next), FORMAT_OS, temp); (*argv) [i] = xstrdup (temp); } (*argv) [n] = 0; @@ -730,6 +453,15 @@ # undef RUN_TIME_REMAP #endif +#if defined (MULE) && defined (MSDOS) && defined (EMX) +/* Setup all of files be input/output'ed with binary translation mode. */ +asm (" .text"); +asm ("L_setbinmode:"); +asm (" movl $1, __fmode_bin"); +asm (" ret"); +asm (" .stabs \"___CTOR_LIST__\", 23, 0, 0, L_setbinmode"); +#endif + /* Test whether the next argument in ARGV matches SSTR or a prefix of LSTR (at least MINLEN characters). If so, then if VALPTR is non-null (the argument is supposed to have a value) store in *VALPTR either @@ -810,8 +542,7 @@ extern int malloc_cookie; #endif -#if (!defined (SYSTEM_MALLOC) && !defined (HAVE_LIBMCHECK) \ - && !defined (DOUG_LEA_MALLOC)) +#if !defined(SYSTEM_MALLOC) && !defined(HAVE_LIBMCHECK) /* 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, */ @@ -819,7 +550,7 @@ __malloc_hook = NULL; __realloc_hook = NULL; __free_hook = NULL; -#endif /* not SYSTEM_MALLOC or HAVE_LIBMCHECK or DOUG_LEA_MALLOC */ +#endif /* not SYSTEM_MALLOC */ noninteractive = 0; @@ -833,7 +564,7 @@ * But hey, it solves all NS related memory problems, so who's * complaining? */ if (initialized && malloc_jumpstart (malloc_cookie) != 0) - stderr_out ("malloc jumpstart failed!\n"); + fprintf (stderr, "malloc jumpstart failed!\n"); #endif /* NeXT */ /* @@ -851,7 +582,23 @@ sort_args (argc, argv); -#if defined (WIN32_NATIVE) || defined (_SCO_DS) + /* Map in shared memory, if we are using that. */ +#ifdef HAVE_SHM + if (argmatch (argv, argc, "-nl", "--no-shared-memory", 6, NULL, &skip_args)) + { + map_in_data (0); + /* The shared memory was just restored, which clobbered this. */ + skip_args = 1; + } + else + { + map_in_data (1); + /* The shared memory was just restored, which clobbered this. */ + skip_args = 0; + } +#endif /* HAVE_SHM */ + +#if (defined (MSDOS) && defined (EMX)) || defined (WIN32) || defined (_SCO_DS) environ = envp; #endif @@ -865,6 +612,15 @@ clearerr (stdin); +#ifdef APOLLO +#ifndef APOLLO_SR10 + /* If USE_DOMAIN_ACLS environment variable exists, + use ACLs rather than UNIX modes. */ + if (egetenv ("USE_DOMAIN_ACLS")) + default_acl (USE_DEFACL); +#endif +#endif /* APOLLO */ + #if defined (HAVE_MMAP) && defined (REL_ALLOC) /* ralloc can only be used if using the GNU memory allocator. */ init_ralloc (); @@ -884,6 +640,15 @@ memory_warnings (0, malloc_warning); #endif /* not SYSTEM_MALLOC */ +#ifdef MSDOS + /* We do all file input/output as binary files. When we need to translate + newlines, we do that manually. */ + _fmode = O_BINARY; + (stdin) ->_flag &= ~_IOTEXT; + (stdout)->_flag &= ~_IOTEXT; + (stderr)->_flag &= ~_IOTEXT; +#endif /* MSDOS */ + #ifdef SET_EMACS_PRIORITY if (emacs_priority != 0) nice (-emacs_priority); @@ -900,17 +665,6 @@ inhibit_window_system = 1; #endif - /* Handle the -sd/--show-dump-id switch, which means show the hex dump_id and quit */ - if (argmatch (argv, argc, "-sd", "--show-dump-id", 9, NULL, &skip_args)) - { -#ifdef PDUMP - printf ("%08x\n", dump_id); -#else - printf ("*ERROR**\n"); -#endif - exit (0); - } - /* Handle the -t switch, which specifies filename to use as terminal */ { char *term; @@ -932,12 +686,6 @@ } } - /* Handle the --no-dump-file/-nd switch, which means don't load the dump file (ignored when not using pdump) */ - if (argmatch (argv, argc, "-nd", "--no-dump-file", 7, NULL, &skip_args)) - { - nodumpfile = 1; - } - /* Handle -nw switch */ if (argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args)) inhibit_window_system = 1; @@ -1102,28 +850,6 @@ 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 if (nodumpfile) { - initialized = 0; - purify_flag = 1; - } else { - initialized = pdump_load (argv[0]); - if (initialized) - run_temacs_argc = -1; - else - purify_flag = 1; - } -#else - if (!initialized) - purify_flag = 1; -#endif - if (!initialized) { /* Initialize things so that new Lisp objects @@ -1135,7 +861,7 @@ /* Initialize Qnil, Qt, Qunbound, and the obarray. After this, symbols can be - interned. This depends on init_alloc_once_early(). */ + interned. This depends on init_alloc_once(). */ init_symbols_once_early (); /* Declare the basic symbols pertaining to errors, @@ -1150,7 +876,6 @@ The *only* thing that the syms_of_*() functions are allowed to do is call one of the following three functions: - INIT_LRECORD_IMPLEMENTATION() defsymbol() defsubr() (i.e. DEFSUBR) deferror() @@ -1161,6 +886,9 @@ syms_of_abbrev (); syms_of_alloc (); +#ifdef HAVE_X_WINDOWS + syms_of_balloon_x (); +#endif syms_of_buffer (); syms_of_bytecode (); syms_of_callint (); @@ -1174,7 +902,6 @@ syms_of_data (); #ifdef DEBUG_XEMACS syms_of_debug (); - syms_of_tests (); #endif /* DEBUG_XEMACS */ syms_of_device (); #ifdef HAVE_DIALOGS @@ -1208,8 +935,9 @@ 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 (); - syms_of_gutter (); +#endif syms_of_indent (); syms_of_intl (); syms_of_keymap (); @@ -1242,7 +970,6 @@ syms_of_rangetab (); syms_of_redisplay (); syms_of_search (); - syms_of_select (); syms_of_signal (); syms_of_sound (); syms_of_specifier (); @@ -1265,7 +992,6 @@ #endif #ifdef HAVE_X_WINDOWS - syms_of_balloon_x (); syms_of_device_x (); #ifdef HAVE_DIALOGS syms_of_dialog_x (); @@ -1276,15 +1002,10 @@ #ifdef HAVE_MENUBARS syms_of_menubar_x (); #endif - syms_of_select_x (); + syms_of_xselect (); #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 @@ -1294,7 +1015,6 @@ syms_of_objects_mswindows (); syms_of_select_mswindows (); syms_of_glyphs_mswindows (); - syms_of_gui_mswindows (); #ifdef HAVE_MENUBARS syms_of_menubar_mswindows (); #endif @@ -1304,7 +1024,7 @@ #ifdef HAVE_MSW_C_DIRED syms_of_dired_mswindows (); #endif -#ifdef WIN32_NATIVE +#ifdef WINDOWSNT syms_of_ntproc (); #endif #endif /* HAVE_MS_WINDOWS */ @@ -1315,7 +1035,7 @@ syms_of_mule_charset (); #endif #ifdef FILE_CODING - syms_of_file_coding (); + syms_of_mule_coding (); #endif #ifdef MULE #ifdef HAVE_WNN @@ -1356,14 +1076,6 @@ syms_of_eldap (); #endif -#ifdef HAVE_GPM - syms_of_gpmevent (); -#endif - -#ifdef HAVE_POSTGRESQL - syms_of_postgresql (); -#endif - /* Now create the subtypes for the types that have them. We do this before the vars_*() because more symbols may get initialized here. */ @@ -1395,7 +1107,6 @@ 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 @@ -1419,7 +1130,6 @@ 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 @@ -1447,7 +1157,6 @@ specifier_type_create (); specifier_type_create_image (); - specifier_type_create_gutter (); specifier_type_create_objects (); #ifdef HAVE_TOOLBARS specifier_type_create_toolbar (); @@ -1483,9 +1192,6 @@ 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 */ @@ -1503,7 +1209,7 @@ lstream_type_create (); #ifdef FILE_CODING - lstream_type_create_file_coding (); + lstream_type_create_mule_coding (); #endif #if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT) lstream_type_create_mswindows_selectable (); @@ -1534,7 +1240,7 @@ staticpro() Fprovide(symbol) intern() - Fput() + pure_put() xmalloc() defsymbol(), if it's absolutely necessary and you're sure that the symbol isn't referenced anywhere else in the initialization @@ -1544,9 +1250,10 @@ using a global variable that has been initialized earlier on in the same function - Any of the object-creating functions in alloc.c: e.g. + Any of the object-creating functions on alloc.c: e.g. make_pure_*() + Fpurecopy() make_string() build_string() make_vector() @@ -1556,6 +1263,7 @@ Fcons() listN() make_opaque_ptr() + make_opaque_long() perhaps a few others. */ @@ -1563,23 +1271,21 @@ /* 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_balloon_x (); +#endif vars_of_buffer (); vars_of_bytecode (); vars_of_callint (); vars_of_callproc (); - vars_of_chartab (); vars_of_cmdloop (); vars_of_cmds (); vars_of_console (); vars_of_data (); #ifdef DEBUG_XEMACS vars_of_debug (); - vars_of_tests (); #endif vars_of_console_stream (); vars_of_device (); @@ -1617,8 +1323,9 @@ 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 (); - vars_of_gutter (); +#endif vars_of_indent (); vars_of_insdel (); vars_of_intl (); @@ -1644,10 +1351,6 @@ #ifdef HAVE_SHLIB vars_of_module (); #endif -#ifdef WIN32_NATIVE - vars_of_nt (); - vars_of_ntproc (); -#endif vars_of_objects (); vars_of_print (); @@ -1670,8 +1373,8 @@ 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 @@ -1687,7 +1390,6 @@ #endif #ifdef HAVE_X_WINDOWS - vars_of_balloon_x (); vars_of_device_x (); #ifdef HAVE_DIALOGS vars_of_dialog_x (); @@ -1698,14 +1400,14 @@ vars_of_menubar_x (); #endif vars_of_objects_x (); - vars_of_select_x (); + vars_of_xselect (); #ifdef HAVE_SCROLLBARS vars_of_scrollbar_x (); #endif #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS) vars_of_gui_x (); #endif -#endif /* HAVE_X_WINDOWS */ +#endif #ifdef HAVE_MS_WINDOWS vars_of_device_mswindows (); @@ -1730,11 +1432,10 @@ #ifdef MULE vars_of_mule (); - vars_of_mule_ccl (); vars_of_mule_charset (); #endif #ifdef FILE_CODING - vars_of_file_coding (); + vars_of_mule_coding (); #endif #ifdef MULE #ifdef HAVE_WNN @@ -1757,14 +1458,6 @@ vars_of_eldap (); #endif -#ifdef HAVE_POSTGRESQL - vars_of_postgresql(); -#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. @@ -1780,7 +1473,6 @@ */ specifier_vars_of_glyphs (); - specifier_vars_of_gutter (); #ifdef HAVE_MENUBARS specifier_vars_of_menubar (); #endif @@ -1814,8 +1506,8 @@ earlier. The second may also depend on the first. */ complex_vars_of_mule_charset (); #endif -#ifdef FILE_CODING - complex_vars_of_file_coding (); +#if defined(FILE_CODING) + complex_vars_of_mule_coding (); #endif /* This calls allocate_glyph(), which creates specifiers @@ -1896,118 +1588,8 @@ garbage_collect_1 (); } #endif -#ifdef PDUMP - } else if (!restart) { - reinit_alloc_once_early (); - reinit_symbols_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_fileio (); - 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_search (); - 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 (); -#ifdef HAVE_SCROLLBARS - reinit_vars_of_scrollbar_x (); -#endif -#ifdef HAVE_MENUBARS - reinit_vars_of_menubar_x (); -#endif - reinit_vars_of_select_x (); -#if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS) - reinit_vars_of_gui_x (); -#endif -#endif /* HAVE_X_WINDOWS */ - -#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 /* PDUMP */ } - /* CONGRATULATIONS!!! We have successfully initialized the Lisp engine. */ @@ -2032,7 +1614,7 @@ init_initial_directory(); /* get the directory to use for the "*scratch*" buffer, etc. */ -#ifdef WIN32_NATIVE +#ifdef WINDOWSNT /* * For Win32, call init_environment() now, so that environment/registry * variables will be properly entered into Vprocess_environment. @@ -2047,16 +1629,21 @@ first because many of the functions below call egetenv() to get environment variables. */ init_lread (); /* Set up the Lisp reader. */ +#ifdef MSDOS + /* Call early 'cause init_environment needs it. */ + init_dosfns (); + /* Set defaults for several environment variables. */ + init_environment (argc, argv, skip_args); +#endif init_cmdargs (argc, argv, skip_args); /* Create list Vcommand_line_args */ init_buffer (); /* Set default directory of *scratch* buffer */ -#ifdef WIN32_NATIVE +#ifdef WINDOWSNT init_ntproc(); #endif 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 */ @@ -2070,7 +1657,7 @@ #ifdef HAVE_TTY init_device_tty (); #endif - init_console_stream (restart); /* Create the first console */ + init_console_stream (); /* Create the first console */ /* try to get the actual pathname of the exec file we are running */ if (!restart) @@ -2106,7 +1693,7 @@ Vinvocation_directory = Ffile_name_directory (Vinvocation_directory); } -#if defined(HAVE_SHLIB) && !defined(WIN32_NATIVE) +#if defined(HAVE_SHLIB) && !defined(WINDOWSNT) /* This is Unix only. MS Windows NT has a library call that does The Right Thing on that system. Rumor has it, this must be called for GNU dld in temacs and xemacs. */ @@ -2164,18 +1751,17 @@ struct standard_args { - const char *name; - const char *longname; + CONST char * CONST name; + CONST char * CONST longname; int priority; int nargs; }; -static const struct standard_args standard_args[] = +static struct standard_args standard_args[] = { /* Handled by main_1 above: */ - { "-sd", "--show-dump-id", 105, 0 }, - { "-t", "--terminal", 100, 1 }, - { "-nd", "--no-dump-file", 95, 0 }, + { "-nl", "--no-shared-memory", 100, 0 }, + { "-t", "--terminal", 95, 1 }, { "-nw", "--no-windows", 90, 0 }, { "-batch", "--batch", 85, 0 }, { "-debug-paths", "--debug-paths", 82, 0 }, @@ -2370,6 +1956,14 @@ xfree (priority); } +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; + DEFUN ("running-temacs-p", Frunning_temacs_p, 0, 0, 0, /* True if running temacs. This means we are in the dumping stage. This is false during normal execution of the `xemacs' program, and @@ -2397,11 +1991,11 @@ (int nargs, Lisp_Object *args)) { int ac; - const Extbyte *wampum; + CONST Extbyte *wampum; int namesize; int total_len; Lisp_Object orig_invoc_name = Fcar (Vcommand_line_args); - const Extbyte **wampum_all = alloca_array (const Extbyte *, nargs); + CONST Extbyte **wampum_all = alloca_array (CONST Extbyte *, nargs); int *wampum_all_len = alloca_array (int, nargs); assert (!gc_in_progress); @@ -2412,17 +2006,16 @@ /* Need to convert the orig_invoc_name and all of the arguments to external format. */ - TO_EXTERNAL_FORMAT (LISP_STRING, orig_invoc_name, - ALLOCA, (wampum, namesize), - Qnative); + GET_STRING_EXT_DATA_ALLOCA (orig_invoc_name, FORMAT_OS, wampum, + namesize); namesize++; for (ac = 0, total_len = namesize; ac < nargs; ac++) { CHECK_STRING (args[ac]); - TO_EXTERNAL_FORMAT (LISP_STRING, args[ac], - ALLOCA, (wampum_all[ac], wampum_all_len[ac]), - Qnative); + GET_STRING_EXT_DATA_ALLOCA (args[ac], FORMAT_OS, + wampum_all[ac], + wampum_all_len[ac]); wampum_all_len[ac]++; total_len += wampum_all_len[ac]; } @@ -2444,9 +2037,6 @@ unbind_to (0, Qnil); /* this closes loadup.el */ purify_flag = 0; run_temacs_argc = nargs + 1; -#if defined (HEAP_IN_DATA) && !defined(PDUMP) - report_sheap_usage (0); -#endif LONGJMP (run_temacs_catch, 1); return Qnil; /* not reached; warning suppression */ } @@ -2455,16 +2045,6 @@ int main (int argc, char **argv, char **envp) { - -#ifdef _MSC_VER - /* Under VC++, access violations and the like are not sent through - the standard signal() mechanism. Rather, they need to be handled - using the Microsoft "structured exception handling" mechanism, - which vaguely resembles the C++ mechanisms. */ - __try - { -#endif - int volatile vol_argc = argc; char ** volatile vol_argv = argv; char ** volatile vol_envp = envp; @@ -2540,7 +2120,7 @@ 06/20/96 robertl@dgii.com */ { - extern char **_environ; + extern char *_environ; if ((unsigned) environ == 0) environ=_environ; } @@ -2560,7 +2140,7 @@ int rc = malloc_set_state (malloc_state_ptr); if (rc != 0) { - stderr_out ("malloc_set_state failed, rc = %d\n", rc); + fprintf (stderr, "malloc_set_state failed, rc = %d\n", rc); abort (); } #if 0 @@ -2582,14 +2162,6 @@ run_temacs_argc = -1; main_1 (vol_argc, vol_argv, vol_envp, restarted); - -#ifdef _MSC_VER - } - /* VC++ documentation says that - GetExceptionCode() cannot be called inside the filter itself. */ - __except (mswindows_handle_hardware_exceptions (GetExceptionCode ())) {} -#endif - return 0; /* unreached */ } @@ -2604,13 +2176,9 @@ { /* 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 */ - (__typeof__ (__free_hook)) + __free_hook = voodoo_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. @@ -2634,7 +2202,9 @@ if (!preparing_for_armageddon && !noninteractive) run_hook (Qkill_emacs_hook); - ensure_no_quitting_from_now_on (); + /* make sure no quitting from now on!! */ + dont_check_for_quit = 1; + Vinhibit_quit = Qt; if (!preparing_for_armageddon) { @@ -2648,7 +2218,7 @@ be too dangerous), and if we get a crash somewhere within this loop, we'll still autosave and won't try this again. */ - LIST_LOOP_DELETING (concons, nextcons, Vconsole_list) + LIST_LOOP_DELETING(concons, nextcons, Vconsole_list) { /* There is very little point in deleting the stream console. It uses stdio, which should flush any buffered output and @@ -2662,25 +2232,13 @@ UNGCPRO; -#ifdef HAVE_MS_WINDOWS - /* If we displayed a message on the console and we're exiting due to - init error, then we must allow the user to see this message. */ - if (mswindows_message_outputted && INTP (arg) && XINT (arg) != 0) - Fmswindows_message_box (build_string ("Initialization error"), - Qnil, Qnil); -#endif - - shut_down_emacs (0, STRINGP (arg) ? arg : Qnil, 0); + shut_down_emacs (0, ((STRINGP (arg)) ? arg : Qnil)); #if defined(GNU_MALLOC) - __free_hook = -#ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */ - (__typeof__ (__free_hook)) + __free_hook = voodoo_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 */ } @@ -2693,73 +2251,59 @@ If SIG is a signal number, print a message for it. - This is called by fatal signal handlers and Fkill_emacs. It used to - be called by X protocol error handlers, but instead they now call - Fkill_emacs. */ + This is called by fatal signal handlers, X protocol error handlers, + and Fkill_emacs. */ static void -shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save) +shut_down_emacs (int sig, Lisp_Object stuff) { /* This function can GC */ /* Prevent running of hooks and other non-essential stuff from now on. */ preparing_for_armageddon = 1; - ensure_no_quitting_from_now_on (); + /* In case frames or windows are screwed up, avoid assertion + failures here */ + Vinhibit_quit = Qt; #ifdef QUANTIFY quantify_stop_recording_data (); #endif /* QUANTIFY */ +#if 0 /* This is absolutely the most important thing to do, so make sure we do it now, before anything else. We might have crashed and be in a weird inconsistent state, and potentially anything could set off another protection fault and cause us to bail out immediately. */ - /* Steve writes the following: - - [[I'm not removing the code entirely, yet. We have run up against + /* I'm not removing the code entirely, yet. We have run up against a spate of problems in diagnosing crashes due to crashes within crashes. It has very definitely been determined that code called during auto-saving cannot work if XEmacs crashed inside of GC. We already auto-save on an itimer so there cannot be too much unsaved stuff around, and if we get better crash reports we might - be able to get more problems fixed so I'm disabling this. -slb]] - - and DISABLES AUTO-SAVING ENTIRELY during crashes! Way way bad idea. - - Instead let's just be more intelligent about avoiding crashing - when possible, esp. nested crashes. - */ - if (!no_auto_save) - Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */ + be able to get more problems fixed so I'm disabling this. -slb */ + Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */ +#endif fflush (stdout); reset_all_consoles (); if (sig && sig != SIGTERM) { - if (sig == -1) - stderr_out ("\nFatal error.\n\n"); - else - stderr_out ("\nFatal error (%d).\n\n", sig); + stderr_out ("\nFatal error (%d).\n", sig); stderr_out ("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 - "Otherwise, please report this bug by selecting `Report-Bug'\n" - "in the InfoDock menu.\n" + "Please report this bug by selecting `Report-Bug' in the InfoDock\n" + "menu.\n" #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" + "Please report this bug by running the send-pr script included\n" + "with XEmacs, or selecting `Send Bug Report' 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" "M-x describe-installation.\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" @@ -2768,22 +2312,19 @@ "directory in which you started the editor, or maybe in your home\n" "directory), and type\n" "\n" - " gdb " -#endif - ); -#ifndef _MSC_VER + " gdb "); { - const char *name; + CONST char *name; char *dir = 0; /* Now try to determine the actual path to the executable, to try to make the backtrace-determination process as foolproof as possible. */ - if (STRINGP (Vinvocation_name)) + if (GC_STRINGP (Vinvocation_name)) name = (char *) XSTRING_DATA (Vinvocation_name); else name = "xemacs"; - if (STRINGP (Vinvocation_directory)) + if (GC_STRINGP (Vinvocation_directory)) dir = (char *) XSTRING_DATA (Vinvocation_directory); if (!dir || dir[0] != '/') stderr_out ("`which %s`", name); @@ -2798,7 +2339,6 @@ "(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"); -#endif /* _MSC_VER */ } stuff_buffered_input (stuff); @@ -2821,11 +2361,50 @@ #ifndef CANNOT_DUMP - -#if !defined(PDUMP) || !defined(SYSTEM_MALLOC) +/* Nothing like this can be implemented on an Apollo. + What a loss! */ + extern char my_edata[]; + +#ifdef HAVE_SHM + +DEFUN ("dump-emacs-data", Fdump_emacs_data, 1, 1, 0, /* +Dump current state of XEmacs into data file FILENAME. +This function exists on systems that use HAVE_SHM. +*/ + (intoname)) +{ + /* This function can GC */ + int opurify; + struct gcpro gcpro1; + GCPRO1 (intoname); + + CHECK_STRING (intoname); + intoname = Fexpand_file_name (intoname, Qnil); + + opurify = purify_flag; + purify_flag = 0; + + fflush (stderr); + fflush (stdout); + + disksave_object_finalization (); + release_breathing_space (); + + /* Tell malloc where start of impure now is */ + /* Also arrange for warnings when nearly out of space. */ +#ifndef SYSTEM_MALLOC + memory_warnings (my_edata, malloc_warning); #endif - + UNGCPRO; + map_out_data (XSTRING_DATA (intoname)); + + purify_flag = opurify; + + return Qnil; +} + +#else /* not HAVE_SHM */ extern void disable_free_hook (void); DEFUN ("dump-emacs", Fdump_emacs, 2, 2, 0, /* @@ -2866,12 +2445,6 @@ opurify = purify_flag; purify_flag = 0; -#if defined (HEAP_IN_DATA) && !defined(PDUMP) - report_sheap_usage (1); -#endif - - clear_message (); - fflush (stderr); fflush (stdout); @@ -2886,27 +2459,29 @@ UNGCPRO; +#if defined (MSDOS) && defined (EMX) + { + int fd = open ((char *) XSTRING_DATA (intoname), + O_WRONLY|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE); + if (!fd) { + error ("Failure operating on %s", XSTRING_DATA (intoname)); + } else { + _core (fd); + close (fd); + } + } +#else /* not MSDOS and EMX */ { char *intoname_ext; char *symname_ext; - TO_EXTERNAL_FORMAT (LISP_STRING, intoname, - C_STRING_ALLOCA, intoname_ext, - Qfile_name); - + GET_C_STRING_FILENAME_DATA_ALLOCA (intoname, intoname_ext); if (STRINGP (symname)) - TO_EXTERNAL_FORMAT (LISP_STRING, symname, - C_STRING_ALLOCA, symname_ext, - Qfile_name); + GET_C_STRING_FILENAME_DATA_ALLOCA (symname, symname_ext); else symname_ext = 0; garbage_collect_1 (); - -#ifdef PDUMP - pdump (); -#else - #ifdef DOUG_LEA_MALLOC malloc_state_ptr = malloc_get_state (); #endif @@ -2920,29 +2495,34 @@ #ifdef DOUG_LEA_MALLOC free (malloc_state_ptr); #endif -#endif /* not PDUMP */ } +#endif /* not MSDOS and EMX */ purify_flag = opurify; return Qnil; } +#endif /* not HAVE_SHM */ + #endif /* not CANNOT_DUMP */ +#ifndef SEPCHAR +#define SEPCHAR ':' +#endif /* Split STRING into a list of substrings. The substrings are the parts of original STRING separated by SEPCHAR. */ static Lisp_Object -split_string_by_emchar_1 (const Bufbyte *string, Bytecount size, +split_string_by_emchar_1 (CONST Bufbyte *string, Bytecount size, Emchar sepchar) { Lisp_Object result = Qnil; - const Bufbyte *end = string + size; + CONST Bufbyte *end = string + size; while (1) { - const Bufbyte *p = string; + CONST Bufbyte *p = string; while (p < end) { if (charptr_emchar (p) == sepchar) @@ -2962,32 +2542,33 @@ } /* The same as the above, except PATH is an external C string (it is - converted using Qfile_name), and sepchar is hardcoded to SEPCHAR + converted as FORMAT_FILENAME), and sepchar is hardcoded to SEPCHAR (':' or whatever). */ Lisp_Object -decode_path (const char *path) +decode_path (CONST char *path) { - Bytecount newlen; + int len; Bufbyte *newpath; if (!path) return Qnil; - TO_INTERNAL_FORMAT (C_STRING, path, ALLOCA, (newpath, newlen), Qfile_name); - + GET_C_CHARPTR_INT_FILENAME_DATA_ALLOCA (path, 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 string? */ - if (!newlen) + if (!len) return Qnil; - return split_string_by_emchar_1 (newpath, newlen, SEPCHAR); + return split_string_by_emchar_1 (newpath, (Bytecount)len, SEPCHAR); } Lisp_Object -decode_env_path (const char *evarname, const char *default_) +decode_env_path (CONST char *evarname, CONST char *default_) { - const char *path = 0; + CONST char *path = 0; if (evarname) path = egetenv (evarname); if (!path) @@ -3049,75 +2630,17 @@ #ifdef USE_ASSERTIONS /* This highly dubious kludge ... shut up Jamie, I'm tired of your slagging. */ -static int in_assert_failed; -static const char *assert_failed_file; -static int assert_failed_line; -static const char *assert_failed_expr; - -#ifdef fprintf -#undef fprintf -#endif - -#undef abort /* avoid infinite #define loop... */ - -#if defined (WIN32_NATIVE) && defined (DEBUG_XEMACS) -#define enter_debugger() DebugBreak () -#else -#define enter_debugger() -#endif - -void -assert_failed (const char *file, int line, const char *expr) +DOESNT_RETURN +assert_failed (CONST char *file, int line, CONST char *expr) { - /* If we're already crashing, let's not crash again. This might be - critical to getting auto-saving working properly. */ - if (fatal_error_in_progress) - return; - - /* We are extremely paranoid so we sensibly deal with recursive - assertion failures. */ - in_assert_failed++; - - if (in_assert_failed >= 4) - _exit (-1); - else if (in_assert_failed == 3) - { - enter_debugger (); - _exit (-1); - } - else if (in_assert_failed == 2) - { - /* Not stderr_out(), which does additional things and may trigger - a recursive assertion failure. fprintf was undeffed above, in - case it was encapsulated. */ - fprintf (stderr, - "Fatal error: recursive assertion failure, " - "file %s, line %d, %s\n", - file, line, expr); - fprintf (stderr, - "Original assertion failure: file %s, line %d, %s\n", - assert_failed_file, assert_failed_line, assert_failed_expr); - } - else - { - assert_failed_file = file; - assert_failed_line = line; - assert_failed_expr = expr; - - if (!initialized) - fprintf (stderr, - "Fatal error: assertion failed, file %s, line %d, %s\n", - file, line, expr); - else - stderr_out ("Fatal error: assertion failed, file %s, line %d, %s\n", - file, line, expr); - } - - enter_debugger (); -#if !defined (ASSERTIONS_DONT_ABORT) + stderr_out ("Fatal error: assertion failed, file %s, line %d, %s\n", + file, line, expr); +#undef abort /* avoid infinite #define loop... */ +#if defined (WINDOWSNT) && defined (DEBUG_XEMACS) + DebugBreak (); +#elif !defined (ASSERTIONS_DONT_ABORT) abort (); #endif - in_assert_failed = 0; } #endif /* USE_ASSERTIONS */ @@ -3156,7 +2679,11 @@ syms_of_emacs (void) { #ifndef CANNOT_DUMP +#ifdef HAVE_SHM + DEFSUBR (Fdump_emacs_data); +#else DEFSUBR (Fdump_emacs); +#endif #endif /* !CANNOT_DUMP */ DEFSUBR (Frun_emacs_from_temacs); @@ -3227,7 +2754,7 @@ DEFVAR_LISP ("system-configuration", &Vsystem_configuration /* String naming the configuration XEmacs was built for. */ ); - Vsystem_configuration = build_string (EMACS_CONFIGURATION); + Vsystem_configuration = Fpurecopy (build_string (EMACS_CONFIGURATION)); #ifndef EMACS_CONFIG_OPTIONS # define EMACS_CONFIG_OPTIONS "UNKNOWN" @@ -3235,7 +2762,8 @@ DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options /* String containing the configuration options XEmacs was built with. */ ); - Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS); + Vsystem_configuration_options = Fpurecopy (build_string + (EMACS_CONFIG_OPTIONS)); DEFVAR_LISP ("emacs-major-version", &Vemacs_major_version /* Major version number of this version of Emacs, as an integer. @@ -3253,20 +2781,7 @@ */ ); Vemacs_minor_version = make_int (EMACS_MINOR_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 /* + 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 @@ -3301,7 +2816,7 @@ #ifndef XEMACS_CODENAME #define XEMACS_CODENAME "Noname" #endif - Vxemacs_codename = build_string (XEMACS_CODENAME); + Vxemacs_codename = Fpurecopy (build_string (XEMACS_CODENAME)); DEFVAR_BOOL ("noninteractive", &noninteractive1 /* Non-nil means XEmacs is running without interactive terminal. @@ -3353,8 +2868,6 @@ malloc - check operation of malloc; gc - check garbage collection; bufpos - check buffer positions. - -quick-build - user has requested the "quick-build" configure option. */ ); Vinternal_error_checking = Qnil; #ifdef ERROR_CHECK_EXTENTS @@ -3377,50 +2890,7 @@ Vinternal_error_checking = Fcons (intern ("bufpos"), Vinternal_error_checking); #endif -#ifdef QUICK_BUILD - Vinternal_error_checking = Fcons (intern ("quick-build"), - Vinternal_error_checking); -#endif - - 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 - } + Vinternal_error_checking = Fpurecopy (Vinternal_error_checking); DEFVAR_LISP ("path-separator", &Vpath_separator /* The directory separator in search paths, as a string. @@ -3519,8 +2989,7 @@ *Directory of architecture-independent files that come with XEmacs, intended for XEmacs to use. Use of this variable in new code is almost never correct. See the -functions `locate-data-file' and `locate-data-directory' and the variable -`data-directory-list'. +function `locate-data-directory' and the variable `data-directory-list'. */ ); Vdata_directory = Qnil; @@ -3541,6 +3010,19 @@ */ ); Vdata_directory_list = Qnil; +#ifdef CLASH_DETECTION + DEFVAR_LISP ("configure-lock-directory", &Vconfigure_lock_directory /* +For internal use by the build procedure only. +configure's idea of what LOCK-DIRECTORY will be. +*/ ); +#ifdef PATH_LOCK + Vconfigure_lock_directory = Ffile_name_as_directory + (build_string ((char *) PATH_LOCK)); +#else + Vconfigure_lock_directory = Qnil; +#endif +#endif /* CLASH_DETECTION */ + DEFVAR_LISP ("site-directory", &Vsite_directory /* *Directory of site-specific Lisp files that come with XEmacs. */ ); @@ -3635,7 +3117,7 @@ #endif } -#if defined(__sgi) && !defined(PDUMP) +#ifdef __sgi /* 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