X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/90d920b6076f7ad1d41091e7c16274efbb75dd07..31ade731e6dc0c0a4c124f93a1f0018e245a27a2:/src/emacs.c diff --git a/src/emacs.c b/src/emacs.c index 4953220f11..debb7a90df 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -1,5 +1,6 @@ /* Fully extensible Emacs, running on Unix, intended for GNU. - Copyright (C) 1985,86,87,93,94,95,97,1998 Free Software Foundation, Inc. + Copyright (C) 1985,86,87,93,94,95,97,98,1999,2001 + Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -19,10 +20,9 @@ the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include #include - -#include #include #include @@ -32,6 +32,10 @@ Boston, MA 02111-1307, USA. */ #include #endif +#ifdef HAVE_UNISTD_H +#include +#endif + #ifdef BSD_SYSTEM #include #endif @@ -47,6 +51,11 @@ Boston, MA 02111-1307, USA. */ #include "process.h" #include "termhooks.h" #include "keyboard.h" +#include "keymap.h" + +#ifdef HAVE_SETLOCALE +#include +#endif #ifdef HAVE_SETRLIMIT #include @@ -57,12 +66,32 @@ Boston, MA 02111-1307, USA. */ #define O_RDWR 2 #endif -extern void malloc_warning (); -extern void set_time_zone_rule (); -extern char *index (); -extern char *strerror (); +#ifdef HAVE_SETPGID +#if !defined (USG) || defined (BSD_PGRPS) +#undef setpgrp +#define setpgrp setpgid +#endif +#endif + +extern void malloc_warning P_ ((char *)); +extern void set_time_zone_rule P_ ((char *)); +#ifdef HAVE_INDEX +extern char *index P_ ((const char *, int)); +#endif + +/* Make these values available in GDB, which doesn't see macros. */ -/* Command line args from shell, as list of strings */ +EMACS_INT gdb_valbits = VALBITS; +EMACS_INT gdb_gctypebits = GCTYPEBITS; +EMACS_INT gdb_emacs_intbits = sizeof (EMACS_INT) * BITS_PER_CHAR; +#ifdef DATA_SEG_BITS +EMACS_INT gdb_data_seg_bits = DATA_SEG_BITS; +#else +EMACS_INT gdb_data_seg_bits = 0; +#endif +EMACS_INT PVEC_FLAG = PSEUDOVECTOR_FLAG; + +/* Command line args from shell, as list of strings. */ Lisp_Object Vcommand_line_args; /* The name under which Emacs was invoked, with any leading directory @@ -79,12 +108,15 @@ Lisp_Object Vinstallation_directory; /* Hook run by `kill-emacs' before it does really anything. */ Lisp_Object Vkill_emacs_hook; +/* An empty lisp string. To avoid having to build any other. */ +Lisp_Object empty_string; + #ifdef SIGUSR1 -/* Hooks for signal USR1 and USR2 handing */ +/* Hooks for signal USR1 and USR2 handling. */ Lisp_Object Vsignal_USR1_hook; #ifdef SIGUSR2 Lisp_Object Vsignal_USR2_hook; -#endif +#endif #endif /* Search path separator. */ @@ -120,17 +152,23 @@ Lisp_Object Vsystem_configuration_options; Lisp_Object Qfile_name_handler_alist; +/* Current and previous system locales for messages and time. */ +Lisp_Object Vsystem_messages_locale; +Lisp_Object Vprevious_system_messages_locale; +Lisp_Object Vsystem_time_locale; +Lisp_Object Vprevious_system_time_locale; + /* If non-zero, emacs should not attempt to use an window-specific code, - but instead should use the virtual terminal under which it was started */ + but instead should use the virtual terminal under which it was started. */ int inhibit_window_system; /* If nonzero, set Emacs to run at this priority. This is also used in child_setup and sys_suspend to make sure subshells run at normal - priority; Those functions have their own extern declaration. */ -int emacs_priority; + priority; those functions have their own extern declaration. */ +EMACS_INT emacs_priority; -/* 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. */ +/* 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; #ifdef BSD_PGRPS @@ -139,7 +177,7 @@ extern int inherited_pgroup; #endif #ifdef HAVE_X_WINDOWS -/* If non-zero, -d was specified, meaning we're using some window system. */ +/* If non-zero, -d was specified, meaning we're using some window system. */ int display_arg; #endif @@ -176,13 +214,103 @@ int initial_argc; static void sort_args (); void syms_of_emacs (); + +#define USAGE1 "\ +Usage: %s [OPTION-OR-FILENAME]...\n\ +\n\ +Run Emacs, the extensible, customizable, self-documenting real-time\n\ +display editor. The recommended way to start Emacs for normal editing\n\ +is with no options at all.\n\ +\n\ +Run M-x info RET m emacs RET m command arguments RET inside Emacs to\n\ +read the main documentation for these command-line arguments.\n\ +\n\ +Initialization options:\n\ +\n\ +--batch do not do interactive display; implies -q\n\ +--debug-init enable Emacs Lisp debugger during init file\n\ +--help display this help message and exit\n\ +--multibyte, --no-unibyte run Emacs in multibyte mode\n\ +--no-init-file, -q load neither ~/.emacs nor default.el\n\ +--no-shared-memory, -nl do not use shared memory\n\ +--no-site-file do not load site-start.el\n\ +--no-window-system, -nw don't communicate with X, ignoring $DISPLAY\n\ +--terminal, -t DEVICE use DEVICE for terminal I/O\n\ +--unibyte, --no-multibyte run Emacs in unibyte mode\n\ +--user, -u USER load ~USER/.emacs instead of your own\n\ +--version display version information and exit\n\ +\n\ +Action options:\n\ +\n\ +FILE visit FILE using find-file\n\ ++LINE FILE visit FILE using find-file, then go to line LINE\n\ ++LINE:COLUMN FILE visit FILE using find-file, then go to line LINE,\n\ + column COLUMN\n\ +--directory, -L DIR add DIR to variable load-path\n\ +--eval EXPR evaluate Emacs Lisp expression EXPR\n\ +--execute EXPR evaluate Emacs Lisp expression EXPR\n\ +--find-file FILE visit FILE\n\ +--funcall, -f FUNC call Emacs function FUNC with no arguments\n\ +--insert FILE insert contents of FILE into current buffer\n\ +--kill exit without asking for confirmation\n\ +--load, -l FILE load FILE of Emacs Lisp code using the load function\n\ +--visit FILE visit FILE\n\ +\n" + +#define USAGE2 "\ +Display options:\n\ +\n\ +--background-color, -bg COLOR window background color\n\ +--border-color, -bd COLOR main border color\n\ +--border-width, -bw WIDTH width of main border\n\ +--color=MODE color mode for character terminals;\n\ + MODE defaults to `auto', and can also\n\ + be `never', `auto', `always',\n\ + or a mode name like `ansi8'\n\ +--cursor-color, -cr COLOR color of the Emacs cursor indicating point\n\ +--display, -d DISPLAY use X server DISPLAY\n\ +--font, -fn FONT default font; must be fixed-width\n\ +--foreground-color, -fg COLOR window foreground color\n\ +--fullscreen, -fs make first frame fullscreen\n\ +--fullwidth, -fw make the first frame wide as the screen\n\ +--fullheight, -fh make the first frame high as the screen\n\ +--geometry, -g GEOMETRY window geometry\n\ +--iconic start Emacs in iconified state\n\ +--icon-type, -i use picture of gnu for Emacs icon\n\ +--internal-border, -ib WIDTH width between text and main border\n\ +--line-spacing, -lsp PIXELS additional space to put between lines\n\ +--mouse-color, -ms COLOR mouse cursor color in Emacs window\n\ +--name NAME title of main Emacs window\n\ +--reverse-video, -r, -rv switch foreground and background\n\ +--title, -T, -wn TITLE title for Emacs windows\n\ +--vertical-scroll-bars, -vb enable vertical scroll bars\n\ +--xrm XRESOURCES set additional X resources\n\ +\n\ +You can generally also specify long option names with a single -; for\n\ +example, -batch as well as --batch. You can use any unambiguous\n\ +abbreviation for a --option.\n\ +\n\ +Various environment variables and window system resources also affect\n\ +Emacs' operation. See the main documentation.\n\ +\n" + +#define USAGE3 "\ +Report bugs to %s. First, please see the Bugs\n\ +section of the Emacs manual or the file BUGS.\n" + -/* Signal code for the fatal signal that was received */ +/* Signal code for the fatal signal that was received. */ int fatal_error_code; -/* Nonzero if handling a fatal error already */ +/* Nonzero if handling a fatal error already. */ int fatal_error_in_progress; +/* If non-null, call this function from fatal_error_signal before + committing suicide. */ + +void (*fatal_error_signal_hook) P_ ((void)); + + #ifdef SIGUSR1 SIGTYPE handle_USR1_signal (sig) @@ -190,11 +318,9 @@ handle_USR1_signal (sig) { struct input_event buf; - buf.kind = user_signal; - buf.code = 0; - buf.frame_or_window = Fselected_frame (); - buf.modifiers = 0; - buf.timestamp = 0; + bzero (&buf, sizeof buf); + buf.kind = USER_SIGNAL_EVENT; + buf.frame_or_window = selected_frame; kbd_buffer_store_event (&buf); } @@ -207,17 +333,16 @@ handle_USR2_signal (sig) { struct input_event buf; - buf.kind = user_signal; + bzero (&buf, sizeof buf); + buf.kind = USER_SIGNAL_EVENT; buf.code = 1; - buf.frame_or_window = Fselected_frame (); - buf.modifiers = 0; - buf.timestamp = 0; + buf.frame_or_window = selected_frame; kbd_buffer_store_event (&buf); } #endif /* SIGUSR2 */ -/* Handle bus errors, illegal instruction, etc. */ +/* Handle bus errors, invalid instruction, etc. */ SIGTYPE fatal_error_signal (sig) int sig; @@ -245,6 +370,10 @@ fatal_error_signal (sig) #ifndef MSDOS sigunblock (sigmask (fatal_error_code)); #endif + + if (fatal_error_signal_hook) + fatal_error_signal_hook (); + kill (getpid (), fatal_error_code); #endif /* not VMS */ } @@ -267,10 +396,15 @@ memory_warning_signal (sig) /* We define abort, rather than using it from the library, so that GDB can return from a breakpoint here. - MSDOS has its own definition on msdos.c */ + MSDOS has its own definition in msdos.c. */ #if ! defined (DOS_NT) && ! defined (NO_ABORT) -void + +#ifndef ABORT_RETURN_TYPE +#define ABORT_RETURN_TYPE void +#endif + +ABORT_RETURN_TYPE abort () { kill (getpid (), SIGABRT); @@ -280,7 +414,7 @@ abort () #endif -/* Code for dealing with Lisp access to the Unix command line */ +/* Code for dealing with Lisp access to the Unix command line. */ static void init_cmdargs (argc, argv, skip_args) @@ -313,7 +447,7 @@ init_cmdargs (argc, argv, skip_args) { Lisp_Object found; int yes = openp (Vexec_path, Vinvocation_name, - EXEC_SUFFIXES, &found, 1); + Vexec_suffixes, &found, 1); if (yes == 1) { /* Add /: to the front of the name @@ -422,17 +556,17 @@ init_cmdargs (argc, argv, skip_args) } DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0, - "Return the program name that was used to run Emacs.\n\ -Any directory names are omitted.") - () + doc: /* Return the program name that was used to run Emacs. +Any directory names are omitted. */) + () { return Fcopy_sequence (Vinvocation_name); } DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory, - 0, 0, 0, - "Return the directory name in which the Emacs executable was located") - () + 0, 0, 0, + doc: /* Return the directory name in which the Emacs executable was located. */) + () { return Fcopy_sequence (Vinvocation_directory); } @@ -466,7 +600,7 @@ void __do_global_ctors_aux () void __do_global_dtors () {} /* Linux has a bug in its library; avoid an error. */ -#ifndef LINUX +#ifndef GNU_LINUX char * __CTOR_LIST__[2] = { (char *) (-1), 0 }; #endif char * __DTOR_LIST__[2] = { (char *) (-1), 0 }; @@ -496,7 +630,7 @@ argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr) char **valptr; int *skipptr; { - char *p; + char *p = NULL; int arglen; char *arg; @@ -554,7 +688,9 @@ argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr) static void malloc_initialize_hook () { +#ifndef USE_CRT_DLL extern char **environ; +#endif if (initialized) { @@ -565,7 +701,7 @@ malloc_initialize_hook () { char **p; - for (p = environ; *p; p++) + for (p = environ; p && *p; p++) if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0) { do @@ -586,6 +722,42 @@ void (*__malloc_initialize_hook) () = malloc_initialize_hook; #endif /* DOUG_LEA_MALLOC */ + +#define REPORT_EMACS_BUG_ADDRESS "bug-gnu-emacs@gnu.org" +#define REPORT_EMACS_BUG_PRETEST_ADDRESS "emacs-pretest-bug@gnu.org" + +/* This function is used to determine an address to which bug report should + be sent. */ + +char * +bug_reporting_address () +{ + int count = 0; + Lisp_Object temp; + char *string; + + temp = Fsymbol_value (intern ("emacs-version")); + + /* When `emacs-version' is invalid, use normal address. */ + if (!STRINGP(temp)) + return REPORT_EMACS_BUG_ADDRESS; + + string = XSTRING (temp)->data; + + /* Count dots in `emacs-version'. */ + while (*string) + { + if (*string == '.') + count++; + string++; + } + + /* When `emacs-version' has at least three dots, it is development or + pretest version of Emacs. */ + return count >= 3 ? REPORT_EMACS_BUG_PRETEST_ADDRESS : REPORT_EMACS_BUG_ADDRESS; +} + + /* ARGSUSED */ int main (argc, argv, envp) @@ -593,15 +765,25 @@ main (argc, argv, envp) char **argv; char **envp; { +#if GC_MARK_STACK + Lisp_Object dummy; +#endif char stack_bottom_variable; + int do_initial_setlocale; int skip_args = 0; +#ifndef USE_CRT_DLL extern int errno; - extern int sys_nerr; +#endif #ifdef HAVE_SETRLIMIT struct rlimit rlim; #endif int no_loadup = 0; +#if GC_MARK_STACK + extern Lisp_Object *stack_base; + stack_base = &dummy; +#endif + #ifdef LINUX_SBRK_BUG __sbrk (1); #endif @@ -630,7 +812,7 @@ main (argc, argv, envp) else { printf ("GNU Emacs %s\n", XSTRING (tem)->data); - printf ("Copyright (C) 1999 Free Software Foundation, Inc.\n"); + printf ("Copyright (C) 2001 Free Software Foundation, Inc.\n"); printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n"); printf ("You may redistribute copies of Emacs\n"); printf ("under the terms of the GNU General Public License.\n"); @@ -667,7 +849,7 @@ main (argc, argv, envp) #endif /* NeXT */ #ifdef VMS - /* If -map specified, map the data file in */ + /* If -map specified, map the data file in. */ { char *file; if (argmatch (argv, argc, "-map", "--map-data", 3, &mapin_file, &skip_args)) @@ -676,7 +858,7 @@ main (argc, argv, envp) #ifdef LINK_CRTL_SHARE #ifdef SHARABLE_LIB_BUG - /* Bletcherous shared libraries! */ + /* Bletcherous shared libraries! */ if (!stdin) stdin = fdopen (0, "r"); if (!stdout) @@ -777,32 +959,46 @@ main (argc, argv, envp) setuid (getuid ()); #endif /* SET_EMACS_PRIORITY */ + /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case. + The build procedure uses this while dumping, to ensure that the + dumped Emacs does not have its system locale tables initialized, + as that might cause screwups when the dumped Emacs starts up. */ + { + char *lc_all = getenv ("LC_ALL"); + do_initial_setlocale = ! lc_all || strcmp (lc_all, "C"); + } + + /* Set locale now, so that initial error messages are localized properly. + fixup_locale must wait until later, since it builds strings. */ + if (do_initial_setlocale) + setlocale (LC_ALL, ""); + #ifdef EXTRA_INITIALIZE EXTRA_INITIALIZE; #endif inhibit_window_system = 0; - /* Handle the -t switch, which specifies filename to use as terminal */ + /* Handle the -t switch, which specifies filename to use as terminal. */ while (1) { char *term; if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args)) { int result; - close (0); - close (1); - result = open (term, O_RDWR, 2 ); + emacs_close (0); + emacs_close (1); + result = emacs_open (term, O_RDWR, 0); if (result < 0) { char *errstring = strerror (errno); - fprintf (stderr, "emacs: %s: %s\n", term, errstring); + fprintf (stderr, "%s: %s: %s\n", argv[0], term, errstring); exit (1); } dup (0); if (! isatty (0)) { - fprintf (stderr, "emacs: %s: not a tty\n", term); + fprintf (stderr, "%s: %s: not a tty\n", argv[0], term); exit (1); } fprintf (stderr, "Using %s\n", term); @@ -814,7 +1010,10 @@ main (argc, argv, envp) break; } - if (argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args)) + /* Command line option --no-windows is deprecated and thus not mentioned + in the manual and usage informations. */ + if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args) + || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args)) inhibit_window_system = 1; /* Handle the -batch switch, which means don't do interactive display. */ @@ -822,18 +1021,12 @@ main (argc, argv, envp) if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args)) noninteractive = 1; - /* Handle the --help option, which gives a usage message.. */ + /* Handle the --help option, which gives a usage message. */ if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args)) { - printf ("\ -Usage: %s [--batch] [-t term] [--terminal term]\n\ - [-d display] [--display display] [-nw] [--no-windows]\n\ - [-q] [--no-init-file] [-u user] [--user user] [--debug-init]\n\ - [--unibyte] [--multibyte] [--version] [--no-site-file]\n\ - [-f func] [--funcall func] [-l file] [--load file] [--eval expr]\n\ - [--insert file] [+linenum] file-to-visit [--kill]\n\ -Report bugs to bug-gnu-emacs@gnu.org. First, please see\n\ -the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); + printf (USAGE1, argv[0]); + printf (USAGE2); + printf (USAGE3, bug_reporting_address ()); exit (0); } @@ -852,9 +1045,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); #endif } -#ifdef POSIX_SIGNALS init_signals (); -#endif /* Don't catch SIGHUP if dumping. */ if (1 @@ -956,7 +1147,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); noninteractive1 = noninteractive; -/* Perform basic initializations (not merely interning symbols) */ +/* Perform basic initializations (not merely interning symbols). */ if (!initialized) { @@ -967,31 +1158,63 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); init_coding_once (); init_syntax_once (); /* Create standard syntax table. */ init_category_once (); /* Create standard category table. */ - /* Must be done before init_buffer */ + /* Must be done before init_buffer. */ init_casetab_once (); - init_buffer_once (); /* Create buffer table and some buffers */ - init_minibuf_once (); /* Create list of minibuffers */ - /* Must precede init_window_once */ - + init_buffer_once (); /* Create buffer table and some buffers. */ + init_minibuf_once (); /* Create list of minibuffers. */ + /* Must precede init_window_once. */ + /* Call syms_of_xfaces before init_window_once because that function creates Vterminal_frame. Termcap frames now use faces, and the face implementation uses some symbols as face names. */ -#ifndef HAVE_NTGUI syms_of_xfaces (); + /* Call syms_of_keyboard before init_window_once because + keyboard sets up symbols that include some face names that + the X support will want to use. This can happen when + CANNOT_DUMP is defined. */ + syms_of_keyboard (); + +#ifdef macintosh + /* init_window_once calls make_terminal_frame which on Mac OS + creates a full-fledge output_mac type frame. This does not + work correctly before syms_of_textprop, syms_of_macfns, + syms_of_ccl, syms_of_fontset, syms_of_xterm, syms_of_search, + syms_of_frame, x_term_init, and init_keyboard have already + been called. */ + syms_of_textprop (); + syms_of_macfns (); + syms_of_ccl (); + syms_of_fontset (); + syms_of_macterm (); + syms_of_macmenu (); + syms_of_data (); + syms_of_search (); + syms_of_frame (); + + x_term_init (); + init_keyboard (); #endif - init_window_once (); /* Init the window system */ + init_window_once (); /* Init the window system. */ init_fileio_once (); /* Must precede any path manipulation. */ } init_alloc (); + + if (do_initial_setlocale) + { + fixup_locale (); + Vsystem_messages_locale = Vprevious_system_messages_locale; + Vsystem_time_locale = Vprevious_system_time_locale; + } + init_eval (); - init_coding (); init_data (); #ifdef CLASH_DETECTION - init_filelock ();; + init_filelock (); #endif + init_atimer (); running_asynch_code = 0; /* Handle --unibyte and the EMACS_UNIBYTE envvar, @@ -1020,7 +1243,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); aren't now decoded; also existing buffers are now made unibyte during startup if .emacs sets unibyte. Tested with 8-bit data in environment variables and /etc/passwd, setting - unibyte and Latin-1 in .emacs. -- Dave Love */ + unibyte and Latin-1 in .emacs. -- Dave Love */ if (argmatch (argv, argc, "-unibyte", "--unibyte", 4, NULL, &skip_args) || argmatch (argv, argc, "-no-multibyte", "--no-multibyte", 4, NULL, &skip_args) || (getenv ("EMACS_UNIBYTE") && !inhibit_unibyte)) @@ -1041,11 +1264,11 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); } for (tail = Vbuffer_alist; CONSP (tail); - tail = XCONS (tail)->cdr) + tail = XCDR (tail)) { Lisp_Object buffer; - buffer = Fcdr (XCONS (tail)->car); + buffer = Fcdr (XCAR (tail)); /* Verify that all buffers are empty now, as they ought to be. */ if (BUF_Z (XBUFFER (buffer)) > BUF_BEG (XBUFFER (buffer))) @@ -1057,7 +1280,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); } no_loadup - = !argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args); + = argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args); #ifdef HAVE_X_WINDOWS @@ -1067,7 +1290,6 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); to run until we've recognized this argument. */ { char *displayname = 0; - int i; int count_before = skip_args; /* Skip any number of -d options, but only use the last one. */ @@ -1129,7 +1351,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); #ifdef WINDOWSNT /* Initialize environment from registry settings. */ init_environment (argv); - init_ntproc (); /* must precede init_editfns */ + init_ntproc (); /* must precede init_editfns. */ #endif /* egetenv is a pretty low-level facility, which may get called in @@ -1139,18 +1361,19 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); /* AIX crashes are reported in system versions 3.2.3 and 3.2.4 if this is not done. Do it after set_process_environment so that we don't pollute Vprocess_environment. */ -#ifdef AIX + /* Setting LANG here will defeat the startup locale processing... */ +#ifdef AIX3_2 putenv ("LANG=C"); #endif - init_buffer (); /* Init default directory of main buffer */ + init_buffer (); /* Init default directory of main buffer. */ init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */ init_cmdargs (argc, argv, skip_args); /* Must precede init_lread. */ if (initialized) { - /* Erase any pre-dump messages in the message log, to avoid confusion */ + /* Erase any pre-dump messages in the message log, to avoid confusion. */ Lisp_Object old_log_max; old_log_max = Vmessage_log_max; XSETFASTINT (Vmessage_log_max, 0); @@ -1166,10 +1389,13 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); if (!initialized) { - /* The basic levels of Lisp must come first */ + /* The basic levels of Lisp must come first. */ /* And data must come first of all - for the sake of symbols like error-message */ + for the sake of symbols like error-message. */ +#ifndef macintosh + /* Called before init_window_once for Mac OS. */ syms_of_data (); +#endif syms_of_alloc (); syms_of_lread (); syms_of_print (); @@ -1185,7 +1411,10 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); syms_of_casetab (); syms_of_callproc (); syms_of_category (); +#ifndef macintosh + /* Called before init_window_once for Mac OS. */ syms_of_ccl (); +#endif syms_of_charset (); syms_of_cmds (); #ifndef NO_DIR_LIBRARY @@ -1202,24 +1431,27 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); #endif /* CLASH_DETECTION */ syms_of_indent (); syms_of_insdel (); - syms_of_keyboard (); syms_of_keymap (); syms_of_macros (); syms_of_marker (); syms_of_minibuf (); - syms_of_mocklisp (); syms_of_process (); +#ifndef macintosh + /* Called before init_window_once for Mac OS. */ syms_of_search (); syms_of_frame (); +#endif syms_of_syntax (); syms_of_term (); syms_of_undo (); #ifdef HAVE_SOUND syms_of_sound (); #endif - - /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */ +#ifndef macintosh + /* Called before init_window_once for Mac OS. */ syms_of_textprop (); +#endif + syms_of_composite (); #ifdef VMS syms_of_vmsproc (); #endif /* VMS */ @@ -1238,13 +1470,14 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); #endif /* HAVE_X_WINDOWS */ #ifndef HAVE_NTGUI +#ifndef macintosh syms_of_xmenu (); #endif +#endif #ifdef HAVE_NTGUI syms_of_w32term (); syms_of_w32fns (); - syms_of_w32faces (); syms_of_w32select (); syms_of_w32menu (); syms_of_fontset (); @@ -1263,24 +1496,25 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); keys_of_buffer (); keys_of_keyboard (); keys_of_keymap (); - keys_of_macros (); keys_of_minibuf (); keys_of_window (); - keys_of_frame (); } if (!noninteractive) { #ifdef VMS - init_vms_input ();/* init_display calls get_frame_size, that needs this */ + init_vms_input ();/* init_display calls get_frame_size, that needs this. */ #endif /* VMS */ - init_display (); /* Determine terminal type. init_sys_modes uses results */ + init_display (); /* Determine terminal type. init_sys_modes uses results. */ } - init_keyboard (); /* This too must precede init_sys_modes */ +#ifndef macintosh + /* Called before init_window_once for Mac OS. */ + init_keyboard (); /* This too must precede init_sys_modes. */ +#endif #ifdef VMS - init_vmsproc (); /* And this too. */ + init_vmsproc (); /* And this too. */ #endif /* VMS */ - init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.) */ + init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.). */ #ifdef HAVE_X_WINDOWS init_xfns (); #endif /* HAVE_X_WINDOWS */ @@ -1288,9 +1522,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); init_xdisp (); init_macros (); init_editfns (); -#ifdef LISP_FLOAT_TYPE init_floatfns (); -#endif #ifdef VMS init_vmsfns (); #endif /* VMS */ @@ -1298,11 +1530,12 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); #ifdef HAVE_SOUND init_sound (); #endif + init_window (); if (!initialized) { char *file; - /* Handle -l loadup, args passed by Makefile. */ + /* Handle -l loadup, args passed by Makefile. */ if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args)) Vtop_level = Fcons (intern ("load"), Fcons (build_string (file), Qnil)); @@ -1334,16 +1567,19 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); #endif } - /* Gerd Moellmann says this makes profiling work on - FreeBSD. It might work on some other systems too. - Give it a try and tell me if it works on your system. */ -#ifdef __FreeBSD__ + /* Set up for profiling. This is known to work on FreeBSD and + GNU/Linux. It might work on some other systems too. Give it a + try and tell us if it works on your system. To compile for + profiling use something like `make CFLAGS="-pg -g -O -DPROFILING=1'. */ +#if defined (__FreeBSD__) || defined (__linux) #ifdef PROFILING if (initialized) { - extern void _mcleanup (); + extern void _mcleanup (); extern char etext; extern void safe_bcopy (); + extern void dump_opcode_frequencies (); + atexit (_mcleanup); /* This uses safe_bcopy because that function comes first in the Emacs executable. It might be better to use something that @@ -1363,13 +1599,14 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); zone rather than looking it up every time. Since localtime() is called to bolt the undumping time into the undumped emacs, this results in localtime ignoring the TZ environment variable. - This flushes the new TZ value into localtime. */ + This flushes the new TZ value into localtime. */ tzset (); #endif /* defined (LOCALTIME_CACHE) */ /* Enter editor command loop. This never returns. */ Frecursive_edit (); /* NOTREACHED */ + return 0; } /* Sort the args so we can find the most important ones @@ -1395,6 +1632,7 @@ struct standard_args standard_args[] = { "-map", "--map-data", 130, 0 }, #endif { "-t", "--terminal", 120, 1 }, + { "-nw", "--no-window-system", 110, 0 }, { "-nw", "--no-windows", 110, 0 }, { "-batch", "--batch", 100, 0 }, { "-help", "--help", 90, 0 }, @@ -1429,6 +1667,9 @@ struct standard_args standard_args[] = { "-cr", "--cursor-color", 10, 1 }, { "-fn", "--font", 10, 1 }, { "-font", 0, 10, 1 }, + { "-fs", "--fullscreen", 10, 0 }, + { "-fw", "--fullwidth", 10, 0 }, + { "-fh", "--fullheight", 10, 0 }, { "-g", "--geometry", 10, 1 }, { "-geometry", 0, 10, 1 }, { "-T", "--title", 10, 1 }, @@ -1440,6 +1681,7 @@ struct standard_args standard_args[] = { "-reverse", 0, 5, 0 }, { "-hb", "--horizontal-scroll-bars", 5, 0 }, { "-vb", "--vertical-scroll-bars", 5, 0 }, + { "-color", "--color", 5, 0}, /* These have the same priority as ordinary file name args, so they are not reordered with respect to those. */ { "-L", "--directory", 0, 1 }, @@ -1449,8 +1691,10 @@ struct standard_args standard_args[] = { "-f", "--funcall", 0, 1 }, { "-funcall", 0, 0, 1 }, { "-eval", "--eval", 0, 1 }, + { "-execute", "--execute", 0, 1 }, { "-find-file", "--find-file", 0, 1 }, { "-visit", "--visit", 0, 1 }, + { "-file", "--file", 0, 1 }, { "-insert", "--insert", 0, 1 }, /* This should be processed after ordinary file name args and the like. */ { "-kill", "--kill", -10, 0 }, @@ -1481,7 +1725,6 @@ sort_args (argc, argv) int incoming_used = 1; int from; int i; - int end_of_options = argc; /* Categorize all the options, and figure out which argv elts are option arguments. */ @@ -1580,7 +1823,7 @@ sort_args (argc, argv) if (options[from] > 0) from += options[from]; } - + if (best < 0) abort (); @@ -1614,17 +1857,16 @@ sort_args (argc, argv) } DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P", - "Exit the Emacs job and kill it.\n\ -If ARG is an integer, return ARG as the exit program code.\n\ -If ARG is a string, stuff it as keyboard input.\n\n\ -The value of `kill-emacs-hook', if not void,\n\ -is a list of functions (of no args),\n\ -all of which are called before Emacs is actually killed.") - (arg) + doc: /* Exit the Emacs job and kill it. +If ARG is an integer, return ARG as the exit program code. +If ARG is a string, stuff it as keyboard input. + +The value of `kill-emacs-hook', if not void, +is a list of functions (of no args), +all of which are called before Emacs is actually killed. */) + (arg) Lisp_Object arg; { - Lisp_Object hook, hook1; - int i; struct gcpro gcpro1; GCPRO1 (arg); @@ -1681,7 +1923,7 @@ shut_down_emacs (sig, no_x, stuff) /* Prevent running of hooks from now on. */ Vrun_hooks = Qnil; - /* If we are controlling the terminal, reset terminal modes */ + /* If we are controlling the terminal, reset terminal modes. */ #ifdef EMACS_HAVE_TTY_PGRP { int pgrp = EMACS_GETPGRP (0); @@ -1736,7 +1978,13 @@ shut_down_emacs (sig, no_x, stuff) term_ntproc (); #endif - check_glyph_memory (); + /* Do this only if terminating normally, we want glyph matrices + etc. in a core dump. */ + if (sig == 0 || sig == SIGTERM) + { + check_glyph_memory (); + check_message_stack (); + } #ifdef MSDOS dos_cleanup (); @@ -1750,22 +1998,23 @@ shut_down_emacs (sig, no_x, stuff) #ifdef HAVE_SHM DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0, - "Dump current state of Emacs into data file FILENAME.\n\ -This function exists on systems that use HAVE_SHM.") - (filename) + doc: /* Dump current state of Emacs into data file FILENAME. +This function exists on systems that use HAVE_SHM. */) + (filename) Lisp_Object filename; { extern char my_edata[]; Lisp_Object tem; - CHECK_STRING (filename, 0); + check_pure_size (); + CHECK_STRING (filename); filename = Fexpand_file_name (filename, Qnil); tem = Vpurify_flag; Vpurify_flag = Qnil; fflush (stdout); - /* Tell malloc where start of impure now is */ + /* 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); @@ -1780,18 +2029,20 @@ This function exists on systems that use HAVE_SHM.") #else /* not HAVE_SHM */ DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0, - "Dump current state of Emacs into executable file FILENAME.\n\ -Take symbols from SYMFILE (presumably the file you executed to run Emacs).\n\ -This is used in the file `loadup.el' when building Emacs.\n\ -\n\ -You must run Emacs in batch mode in order to dump it.") - (filename, symfile) + doc: /* Dump current state of Emacs into executable file FILENAME. +Take symbols from SYMFILE (presumably the file you executed to run Emacs). +This is used in the file `loadup.el' when building Emacs. + +You must run Emacs in batch mode in order to dump it. */) + (filename, symfile) Lisp_Object filename, symfile; { extern char my_edata[]; Lisp_Object tem; Lisp_Object symbol; - int count = specpdl_ptr - specpdl; + int count = BINDING_STACK_SIZE (); + + check_pure_size (); if (! noninteractive) error ("Dumping Emacs works only in batch mode"); @@ -1802,11 +2053,11 @@ You must run Emacs in batch mode in order to dump it.") symbol = intern ("command-line-process"); specbind (symbol, Qnil); - CHECK_STRING (filename, 0); + CHECK_STRING (filename); filename = Fexpand_file_name (filename, Qnil); if (!NILP (symfile)) { - CHECK_STRING (symfile, 0); + CHECK_STRING (symfile); if (XSTRING (symfile)->size) symfile = Fexpand_file_name (symfile, Qnil); } @@ -1826,7 +2077,7 @@ You must run Emacs in batch mode in order to dump it.") #ifdef VMS mapout_data (XSTRING (filename)->data); #else - /* Tell malloc where start of impure now is */ + /* Tell malloc where start of impure now is. */ /* Also arrange for warnings when nearly out of space. */ #ifndef SYSTEM_MALLOC #ifndef WINDOWSNT @@ -1838,8 +2089,15 @@ You must run Emacs in batch mode in order to dump it.") #ifdef DOUG_LEA_MALLOC malloc_state_ptr = malloc_get_state (); #endif + +#ifdef USE_MMAP_FOR_BUFFERS + mmap_set_vars (0); +#endif unexec (XSTRING (filename)->data, !NILP (symfile) ? XSTRING (symfile)->data : 0, my_edata, 0, 0); +#ifdef USE_MMAP_FOR_BUFFERS + mmap_set_vars (1); +#endif #ifdef DOUG_LEA_MALLOC free (malloc_state_ptr); #endif @@ -1854,6 +2112,53 @@ You must run Emacs in batch mode in order to dump it.") #endif /* not CANNOT_DUMP */ +#if HAVE_SETLOCALE +/* Recover from setlocale (LC_ALL, ""). */ +void +fixup_locale () +{ + /* The Emacs Lisp reader needs LC_NUMERIC to be "C", + so that numbers are read and printed properly for Emacs Lisp. */ + setlocale (LC_NUMERIC, "C"); +} + +/* Set system locale CATEGORY, with previous locale *PLOCALE, to + DESIRED_LOCALE. */ +static void +synchronize_locale (category, plocale, desired_locale) + int category; + Lisp_Object *plocale; + Lisp_Object desired_locale; +{ + if (! EQ (*plocale, desired_locale)) + { + *plocale = desired_locale; + setlocale (category, (STRINGP (desired_locale) + ? (char *)(XSTRING (desired_locale)->data) + : "")); + } +} + +/* Set system time locale to match Vsystem_time_locale, if possible. */ +void +synchronize_system_time_locale () +{ + synchronize_locale (LC_TIME, &Vprevious_system_time_locale, + Vsystem_time_locale); +} + +/* Set system messages locale to match Vsystem_messages_locale, if + possible. */ +void +synchronize_system_messages_locale () +{ +#ifdef LC_MESSAGES + synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale, + Vsystem_messages_locale); +#endif +} +#endif /* HAVE_SETLOCALE */ + #ifndef SEPCHAR #define SEPCHAR ':' #endif @@ -1931,71 +2236,93 @@ syms_of_emacs () defsubr (&Sinvocation_directory); DEFVAR_LISP ("command-line-args", &Vcommand_line_args, - "Args passed by shell to Emacs, as a list of strings."); + doc: /* Args passed by shell to Emacs, as a list of strings. */); DEFVAR_LISP ("system-type", &Vsystem_type, - "Value is symbol indicating type of operating system you are using."); + doc: /* Value is symbol indicating type of operating system you are using. */); Vsystem_type = intern (SYSTEM_TYPE); DEFVAR_LISP ("system-configuration", &Vsystem_configuration, - "Value is string indicating configuration Emacs was built for."); + doc: /* Value is string indicating configuration Emacs was built for. +On MS-Windows, the value reflects the OS flavor and version on which +Emacs is running. */); Vsystem_configuration = build_string (EMACS_CONFIGURATION); DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options, - "String containing the configuration options Emacs was built with."); + doc: /* String containing the configuration options Emacs was built with. */); Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS); DEFVAR_BOOL ("noninteractive", &noninteractive1, - "Non-nil means Emacs is running without interactive terminal."); + doc: /* Non-nil means Emacs is running without interactive terminal. */); DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook, - "Hook to be run whenever kill-emacs is called.\n\ -Since kill-emacs may be invoked when the terminal is disconnected (or\n\ -in other similar situations), functions placed on this hook should not\n\ -expect to be able to interact with the user. To ask for confirmation,\n\ -see `kill-emacs-query-functions' instead."); + doc: /* Hook to be run whenever kill-emacs is called. +Since kill-emacs may be invoked when the terminal is disconnected (or +in other similar situations), functions placed on this hook should not +expect to be able to interact with the user. To ask for confirmation, +see `kill-emacs-query-functions' instead. */); Vkill_emacs_hook = Qnil; + empty_string = build_string (""); + staticpro (&empty_string); + #ifdef SIGUSR1 DEFVAR_LISP ("signal-USR1-hook", &Vsignal_USR1_hook, - "Hook to be run whenever emacs receives a USR1 signal"); + doc: /* Hook to be run whenever emacs receives a USR1 signal. */); Vsignal_USR1_hook = Qnil; #ifdef SIGUSR2 DEFVAR_LISP ("signal-USR2-hook", &Vsignal_USR2_hook, - "Hook to be run whenever emacs receives a USR2 signal"); + doc: /* Hook to be run whenever emacs receives a USR2 signal. */); Vsignal_USR2_hook = Qnil; #endif #endif DEFVAR_INT ("emacs-priority", &emacs_priority, - "Priority for Emacs to run at.\n\ -This value is effective only if set before Emacs is dumped,\n\ -and only if the Emacs executable is installed with setuid to permit\n\ -it to change priority. (Emacs sets its uid back to the real uid.)\n\ -Currently, you need to define SET_EMACS_PRIORITY in `config.h'\n\ -before you compile Emacs, to enable the code for this feature."); + doc: /* Priority for Emacs to run at. +This value is effective only if set before Emacs is dumped, +and only if the Emacs executable is installed with setuid to permit +it to change priority. (Emacs sets its uid back to the real uid.) +Currently, you need to define SET_EMACS_PRIORITY in `config.h' +before you compile Emacs, to enable the code for this feature. */); emacs_priority = 0; DEFVAR_LISP ("path-separator", &Vpath_separator, - "The directory separator in search paths, as a string."); + doc: /* The directory separator in search paths, as a string. */); { char c = SEPCHAR; Vpath_separator = make_string (&c, 1); } DEFVAR_LISP ("invocation-name", &Vinvocation_name, - "The program name that was used to run Emacs.\n\ -Any directory names are omitted."); + doc: /* The program name that was used to run Emacs. +Any directory names are omitted. */); DEFVAR_LISP ("invocation-directory", &Vinvocation_directory, - "The directory in which the Emacs executable was found, to run it.\n\ -The value is nil if that directory's name is not known."); + doc: /* The directory in which the Emacs executable was found, to run it. +The value is nil if that directory's name is not known. */); DEFVAR_LISP ("installation-directory", &Vinstallation_directory, - "A directory within which to look for the `lib-src' and `etc' directories.\n\ -This is non-nil when we can't find those directories in their standard\n\ -installed locations, but we can find them\n\ -near where the Emacs executable was found."); + doc: /* A directory within which to look for the `lib-src' and `etc' directories. +This is non-nil when we can't find those directories in their standard +installed locations, but we can find them +near where the Emacs executable was found. */); Vinstallation_directory = Qnil; + + DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale, + doc: /* System locale for messages. */); + Vsystem_messages_locale = Qnil; + + DEFVAR_LISP ("previous-system-messages-locale", + &Vprevious_system_messages_locale, + doc: /* Most recently used system locale for messages. */); + Vprevious_system_messages_locale = Qnil; + + DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale, + doc: /* System locale for time. */); + Vsystem_time_locale = Qnil; + + DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale, + doc: /* Most recently used system locale for time. */); + Vprevious_system_time_locale = Qnil; }