X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/92939d319a808c2f2162e079eadbdab2db813fcf..cd2904bd2c06864bc02f3e454caccdeb3f0e03f2:/src/emacs.c diff --git a/src/emacs.c b/src/emacs.c index 49f6e23907..53ee61cae8 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -1,5 +1,5 @@ /* 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 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -19,10 +19,9 @@ the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include #include - -#include #include #include @@ -32,12 +31,12 @@ Boston, MA 02111-1307, USA. */ #include #endif -#ifdef BSD_SYSTEM -#include +#ifdef HAVE_UNISTD_H +#include #endif -#ifdef STDC_HEADERS -#include +#ifdef BSD_SYSTEM +#include #endif #include "lisp.h" @@ -52,6 +51,10 @@ Boston, MA 02111-1307, USA. */ #include "termhooks.h" #include "keyboard.h" +#ifdef HAVE_SETLOCALE +#include +#endif + #ifdef HAVE_SETRLIMIT #include #include @@ -61,10 +64,30 @@ 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. */ + +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; @@ -124,6 +147,12 @@ 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 */ int inhibit_window_system; @@ -180,6 +209,79 @@ 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-windows, -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\ ++LINENUM FILE visit FILE using find-file, then go to line LINENUM\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\ +--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-widthp\n\ +--foreground-color, -fg COLOR window foreground color\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\ +Report bugs to bug-gnu-emacs@gnu.org. 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 */ int fatal_error_code; @@ -194,11 +296,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); } @@ -211,17 +311,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; @@ -274,7 +373,12 @@ memory_warning_signal (sig) MSDOS has its own definition on 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); @@ -500,7 +604,7 @@ argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr) char **valptr; int *skipptr; { - char *p; + char *p = NULL; int arglen; char *arg; @@ -558,7 +662,9 @@ argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr) static void malloc_initialize_hook () { +#ifndef USE_CRT_DLL extern char **environ; +#endif if (initialized) { @@ -597,15 +703,26 @@ 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 @@ -781,6 +898,20 @@ 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 @@ -794,9 +925,9 @@ main (argc, argv, envp) 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); @@ -829,15 +960,8 @@ main (argc, argv, envp) /* 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); exit (0); } @@ -856,9 +980,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 @@ -981,8 +1103,30 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); 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, 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 (); + + x_term_init (); + init_keyboard (); #endif init_window_once (); /* Init the window system */ @@ -990,12 +1134,20 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); } 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 ();; #endif + init_atimer (); running_asynch_code = 0; /* Handle --unibyte and the EMACS_UNIBYTE envvar, @@ -1045,11 +1197,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))) @@ -1061,7 +1213,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 @@ -1071,7 +1223,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. */ @@ -1143,7 +1294,8 @@ 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 @@ -1173,7 +1325,10 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); /* The basic levels of Lisp must come first */ /* And data must come first of all 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 (); @@ -1189,7 +1344,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 @@ -1206,14 +1364,16 @@ 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 (); +#endif syms_of_frame (); syms_of_syntax (); syms_of_term (); @@ -1221,9 +1381,11 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); #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 */ @@ -1242,13 +1404,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 (); @@ -1280,7 +1443,10 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); #endif /* VMS */ init_display (); /* Determine terminal type. init_sys_modes uses results */ } +#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. */ #endif /* VMS */ @@ -1292,9 +1458,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 */ @@ -1302,6 +1466,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); #ifdef HAVE_SOUND init_sound (); #endif + init_window (); if (!initialized) { @@ -1341,13 +1506,15 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); /* 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__ +#if defined (__FreeBSD__) || defined (__linux) #ifdef PROFILING if (initialized) { 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 @@ -1374,6 +1541,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]); /* Enter editor command loop. This never returns. */ Frecursive_edit (); /* NOTREACHED */ + return 0; } /* Sort the args so we can find the most important ones @@ -1453,8 +1621,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 }, @@ -1485,7 +1655,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. */ @@ -1627,8 +1796,6 @@ 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); @@ -1843,8 +2010,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 @@ -1859,6 +2033,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 @@ -1943,7 +2164,9 @@ syms_of_emacs () Vsystem_type = intern (SYSTEM_TYPE); DEFVAR_LISP ("system-configuration", &Vsystem_configuration, - "Value is string indicating configuration Emacs was built for."); + "Value is string indicating configuration Emacs was built for.\n\ +On MS-Windows, the value reflects the OS flavor and version on which\n\ +Emacs is running."); Vsystem_configuration = build_string (EMACS_CONFIGURATION); DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options, @@ -2003,4 +2226,21 @@ 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."); Vinstallation_directory = Qnil; + + DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale, + "System locale for messages."); + Vsystem_messages_locale = Qnil; + + DEFVAR_LISP ("previous-system-messages-locale", + &Vprevious_system_messages_locale, + "Most recently used system locale for messages."); + Vprevious_system_messages_locale = Qnil; + + DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale, + "System locale for time."); + Vsystem_time_locale = Qnil; + + DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale, + "Most recently used system locale for time."); + Vprevious_system_time_locale = Qnil; }