X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/5a7670bf32c040a56989badf3d536e87d72e0eef..9a5114ac7e384d28a13c99725380b6024abde5cf:/src/emacs.c diff --git a/src/emacs.c b/src/emacs.c index 687f1abf3e..ed5f89160c 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -32,7 +32,7 @@ Boston, MA 02111-1307, USA. */ #include #endif -#ifdef BSD +#ifdef BSD_SYSTEM #include #endif @@ -45,6 +45,11 @@ Boston, MA 02111-1307, USA. */ #include "syssignal.h" #include "process.h" +#ifdef HAVE_SETRLIMIT +#include +#include +#endif + #ifndef O_RDWR #define O_RDWR 2 #endif @@ -76,6 +81,16 @@ Lisp_Object Vkill_emacs_hook; on subsequent starts. */ int initialized; +#ifdef DOUG_LEA_MALLOC +/* Preserves a pointer to the memory allocated that copies that + static data inside glibc's malloc. */ +void *malloc_state_ptr; +/* From glibc, a routine that returns a copy of the malloc internal state. */ +extern void *malloc_get_state (); +/* From glibc, a routine that overwrites the malloc internal state. */ +extern void malloc_set_state (); +#endif + /* Variable whose value is symbol giving operating system type. */ Lisp_Object Vsystem_type; @@ -86,6 +101,8 @@ Lisp_Object Vsystem_configuration; for use when reporting bugs. */ Lisp_Object Vsystem_configuration_options; +Lisp_Object Qfile_name_handler_alist; + /* 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; @@ -205,13 +222,24 @@ init_cmdargs (argc, argv, skip_args) int skip_args; { register int i; - Lisp_Object name, dir; + Lisp_Object name, dir, tem; + int count = specpdl_ptr - specpdl; + Lisp_Object raw_name; initial_argv = argv; initial_argc = argc; - Vinvocation_name = Ffile_name_nondirectory (build_string (argv[0])); - Vinvocation_directory = Ffile_name_directory (build_string (argv[0])); + raw_name = build_string (argv[0]); + + /* Add /: to the front of the name + if it would otherwise be treated as magic. */ + tem = Ffind_file_name_handler (raw_name, Qt); + if (! NILP (tem)) + raw_name = concat2 (build_string ("/:"), raw_name); + + Vinvocation_name = Ffile_name_nondirectory (raw_name); + Vinvocation_directory = Ffile_name_directory (raw_name); + /* If we got no directory in argv[0], search PATH to find where Emacs actually came from. */ if (NILP (Vinvocation_directory)) @@ -220,12 +248,20 @@ init_cmdargs (argc, argv, skip_args) int yes = openp (Vexec_path, Vinvocation_name, EXEC_SUFFIXES, &found, 1); if (yes == 1) - Vinvocation_directory = Ffile_name_directory (found); + { + /* Add /: to the front of the name + if it would otherwise be treated as magic. */ + tem = Ffind_file_name_handler (found, Qt); + if (! NILP (tem)) + found = concat2 (build_string ("/:"), found); + Vinvocation_directory = Ffile_name_directory (found); + } } if (!NILP (Vinvocation_directory) && NILP (Ffile_name_absolute_p (Vinvocation_directory))) - /* Emacs was started with relative path, like ./emacs */ + /* Emacs was started with relative path, like ./emacs. + Make it absolute. */ Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, Qnil); Vinstallation_directory = Qnil; @@ -244,7 +280,18 @@ init_cmdargs (argc, argv, skip_args) not including lisp and info. */ tem = Fexpand_file_name (build_string ("lib-src"), dir); lib_src_exists = Ffile_exists_p (tem); - if (!NILP (lib_src_exists)) + +#ifdef MSDOS + /* MSDOS installations frequently remove lib-src, but we still + must set installation-directory, or else info won't find + its files (it uses the value of installation-directory). */ + tem = Fexpand_file_name (build_string ("info"), dir); + info_exists = Ffile_exists_p (tem); +#else + info_exists = Qnil; +#endif + + if (!NILP (lib_src_exists) || !NILP (info_exists)) { tem = Fexpand_file_name (build_string ("etc"), dir); etc_exists = Ffile_exists_p (tem); @@ -259,7 +306,17 @@ init_cmdargs (argc, argv, skip_args) /* See if dir's parent contains those subdirs. */ tem = Fexpand_file_name (build_string ("../lib-src"), dir); lib_src_exists = Ffile_exists_p (tem); - if (!NILP (lib_src_exists)) + + +#ifdef MSDOS + /* See the MSDOS commentary above. */ + tem = Fexpand_file_name (build_string ("../info"), dir); + info_exists = Ffile_exists_p (tem); +#else + info_exists = Qnil; +#endif + + if (!NILP (lib_src_exists) || !NILP (info_exists)) { tem = Fexpand_file_name (build_string ("../etc"), dir); etc_exists = Ffile_exists_p (tem); @@ -293,6 +350,8 @@ init_cmdargs (argc, argv, skip_args) Vcommand_line_args = Fcons (build_string (argv[i]), Vcommand_line_args); } + + unbind_to (count, Qnil); } DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0, @@ -429,11 +488,22 @@ main (argc, argv, envp) int skip_args = 0; extern int errno; extern sys_nerr; +#ifdef HAVE_SETRLIMIT + struct rlimit rlim; +#endif #ifdef LINUX_SBRK_BUG __sbrk (1); #endif +#ifdef DOUG_LEA_MALLOC + if (initialized) + { + malloc_set_state (malloc_state_ptr); + free (malloc_state_ptr); + } +#endif + sort_args (argc, argv); if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args)) @@ -447,7 +517,13 @@ main (argc, argv, envp) } else { - printf ("%s\n", XSTRING (tem)->data); + printf ("GNU Emacs %s\n", XSTRING (tem)->data); + printf ("Copyright (C) 1996 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"); + printf ("For more information about these matters, "); + printf ("see the files named COPYING.\n"); exit (0); } } @@ -501,6 +577,22 @@ main (argc, argv, envp) #endif /* LINK_CRTL_SHARE */ #endif /* VMS */ +#ifdef HAVE_SETRLIMIT + /* Extend the stack space available. */ + if (!getrlimit (RLIMIT_STACK, &rlim)) + { + long newlim; + /* Approximate the amount regex.c needs, plus some more. */ + newlim = 800000 * sizeof (char *); + if (newlim > rlim.rlim_max) + newlim = rlim.rlim_max; + if (rlim.rlim_cur < newlim) + rlim.rlim_cur = newlim; + + setrlimit (RLIMIT_STACK, &rlim); + } +#endif + /* Record (approximately) where the stack begins. */ stack_bottom = &stack_bottom_variable; @@ -532,9 +624,20 @@ main (argc, argv, envp) /* We do all file input/output as binary files. When we need to translate newlines, we do that manually. */ _fmode = O_BINARY; + +#if __DJGPP__ >= 2 + if (!isatty (fileno (stdin))) + setmode (fileno (stdin), O_BINARY); + if (!isatty (fileno (stdout))) + { + fflush (stdout); + setmode (fileno (stdout), O_BINARY); + } +#else /* not __DJGPP__ >= 2 */ (stdin)->_flag &= ~_IOTEXT; (stdout)->_flag &= ~_IOTEXT; (stderr)->_flag &= ~_IOTEXT; +#endif /* not __DJGPP__ >= 2 */ #endif /* MSDOS */ #ifdef SET_EMACS_PRIORITY @@ -592,7 +695,9 @@ Usage: %s [-t term] [--terminal term] [-nw] [--no-windows] [--batch]\n\ [-q] [--no-init-file] [-u user] [--user user] [--debug-init]\n\ [--version] [--no-site-file]\n\ [-f func] [--funcall func] [-l file] [--load file] [--insert file]\n\ - [+linenum] file-to-visit [--kill]\n", argv[0]); + [+linenum] file-to-visit [--kill]\n\ +Report bugs to bug-gnu-emacs@prep.ai.mit.edu. First, please see\n\ +the Bugs section of the Emacs manual or the file BUGS.", argv[0]); exit (0); } @@ -602,7 +707,7 @@ Usage: %s [-t term] [--terminal term] [-nw] [--no-windows] [--batch]\n\ because we don't even know which window system dependent code to run until we've recognized this argument. */ { - char *displayname; + char *displayname = 0; int i; int count_before = skip_args; @@ -664,13 +769,13 @@ Usage: %s [-t term] [--terminal term] [-nw] [--no-windows] [--batch]\n\ #endif ) { - sigblockx (SIGHUP); + sigblock (sigmask (SIGHUP)); /* In --batch mode, don't catch SIGHUP if already ignored. That makes nohup work. */ if (! noninteractive || signal (SIGHUP, SIG_IGN) != SIG_IGN) signal (SIGHUP, fatal_error_signal); - sigunblockx (SIGHUP); + sigunblock (sigmask (SIGHUP)); } if ( @@ -758,7 +863,10 @@ Usage: %s [-t term] [--terminal term] [-nw] [--no-windows] [--batch]\n\ init_alloc_once (); init_obarray (); init_eval_once (); + init_charset_once (); + init_coding_once (); init_syntax_once (); /* Create standard syntax table. */ + init_category_once (); /* Create standard category table. */ /* Must be done before init_buffer */ init_casetab_once (); init_buffer_once (); /* Create buffer table and some buffers */ @@ -776,13 +884,16 @@ Usage: %s [-t term] [--terminal term] [-nw] [--no-windows] [--batch]\n\ /* Call early 'cause init_environment needs it. */ init_dosfns (); /* Set defaults for several environment variables. */ - if (initialized) init_environment (argc, argv, skip_args); - else init_gettimeofday (); -#endif + if (initialized) + init_environment (argc, argv, skip_args); + else + tzset (); +#endif /* MSDOS */ #ifdef WINDOWSNT /* Initialize environment from registry settings. */ init_environment (); + init_ntproc (); /* must precede init_editfns */ #endif /* egetenv is a pretty low-level facility, which may get called in @@ -800,6 +911,17 @@ Usage: %s [-t term] [--terminal term] [-nw] [--no-windows] [--batch]\n\ 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 */ + Lisp_Object old_log_max; + old_log_max = Vmessage_log_max; + XSETFASTINT (Vmessage_log_max, 0); + message_dolog ("", 0, 1); + Vmessage_log_max = old_log_max; + } + init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */ init_lread (); @@ -851,6 +973,9 @@ Usage: %s [-t term] [--terminal term] [-nw] [--no-windows] [--batch]\n\ syms_of_casefiddle (); syms_of_casetab (); syms_of_callproc (); + syms_of_category (); + syms_of_ccl (); + syms_of_charset (); syms_of_cmds (); #ifndef NO_DIR_LIBRARY syms_of_dired (); @@ -860,10 +985,12 @@ Usage: %s [-t term] [--terminal term] [-nw] [--no-windows] [--batch]\n\ syms_of_editfns (); syms_of_emacs (); syms_of_fileio (); + syms_of_coding (); /* This should be after syms_of_fileio. */ #ifdef CLASH_DETECTION syms_of_filelock (); #endif /* CLASH_DETECTION */ syms_of_indent (); + syms_of_insdel (); syms_of_keyboard (); syms_of_keymap (); syms_of_macros (); @@ -882,12 +1009,16 @@ Usage: %s [-t term] [--terminal term] [-nw] [--no-windows] [--batch]\n\ #ifdef VMS syms_of_vmsproc (); #endif /* VMS */ +#ifdef WINDOWSNT + syms_of_ntproc (); +#endif /* WINDOWSNT */ syms_of_window (); syms_of_xdisp (); #ifdef HAVE_X_WINDOWS syms_of_xterm (); syms_of_xfns (); syms_of_xfaces (); + syms_of_fontset (); #ifdef HAVE_X11 syms_of_xselect (); #endif @@ -902,11 +1033,11 @@ Usage: %s [-t term] [--terminal term] [-nw] [--no-windows] [--batch]\n\ #endif #ifdef HAVE_NTGUI - syms_of_win32term (); - syms_of_win32fns (); - syms_of_win32faces (); - syms_of_win32select (); - syms_of_win32menu (); + syms_of_w32term (); + syms_of_w32fns (); + syms_of_w32faces (); + syms_of_w32select (); + syms_of_w32menu (); #endif /* HAVE_NTGUI */ #ifdef SYMS_SYSTEM @@ -945,13 +1076,6 @@ Usage: %s [-t term] [--terminal term] [-nw] [--no-windows] [--batch]\n\ if (initialized) { - /* 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); - message_dolog ("", 0, 1); - Vmessage_log_max = old_log_max; - #ifdef HAVE_TZSET { /* If the execution TZ happens to be the same as the dump TZ, @@ -1035,11 +1159,13 @@ struct standard_args standard_args[] = { "-g", "--geometry", 10, 1 }, { "-geometry", 0, 10, 1 }, { "-T", "--title", 10, 1 }, + { "-title", 0, 10, 1 }, { "-name", "--name", 10, 1 }, { "-xrm", "--xrm", 10, 1 }, { "-r", "--reverse-video", 5, 0 }, { "-rv", 0, 5, 0 }, { "-reverse", 0, 5, 0 }, + { "-hb", "--horizontal-scroll-bars", 5, 0 }, { "-vb", "--vertical-scroll-bars", 5, 0 }, /* These have the same priority as ordinary file name args, so they are not reordered with respect to those. */ @@ -1050,6 +1176,8 @@ struct standard_args standard_args[] = { "-f", "--funcall", 0, 1 }, { "-funcall", 0, 0, 1 }, { "-eval", "--eval", 0, 1 }, + { "-find-file", "--find-file", 0, 1 }, + { "-visit", "--visit", 0, 1 }, { "-insert", "--insert", 0, 1 }, /* This should be processed after ordinary file name args and the like. */ { "-kill", "--kill", -10, 0 }, @@ -1076,6 +1204,7 @@ sort_args (argc, argv) int to = 1; int from; int i; + int end_of_options = argc; /* Categorize all the options, and figure out which argv elts are option arguments. */ @@ -1088,6 +1217,19 @@ sort_args (argc, argv) int match, thislen; char *equals; + /* If we have found "--", don't consider + any more arguments as options. */ + if (argv[from][1] == '-') + { + /* Leave the "--", and everything following it, at the end. */ + for (; from < argc; from++) + { + priority[from] = -100; + options[from] = -1; + } + break; + } + /* Look for a match with a known old-fashioned option. */ for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++) if (!strcmp (argv[from], standard_args[i].name)) @@ -1177,6 +1319,10 @@ sort_args (argc, argv) } bcopy (new, argv, sizeof (char *) * argc); + + free (options); + free (new); + free (priority); } DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P", @@ -1297,6 +1443,10 @@ shut_down_emacs (sig, no_x, stuff) unrequest_sigio (); signal (SIGIO, SIG_IGN); #endif + +#ifdef WINDOWSNT + term_ntproc (); +#endif } @@ -1381,9 +1531,15 @@ and announce itself normally when it is run.") Meanwhile, my_edata is not valid on Windows. */ memory_warnings (my_edata, malloc_warning); #endif /* not WINDOWSNT */ +#endif +#ifdef DOUG_LEA_MALLOC + malloc_state_ptr = malloc_get_state (); #endif unexec (XSTRING (filename)->data, !NILP (symfile) ? XSTRING (symfile)->data : 0, my_edata, 0, 0); +#ifdef DOUG_LEA_MALLOC + free (malloc_state_ptr); +#endif #endif /* not VMS */ Vpurify_flag = tem; @@ -1404,8 +1560,7 @@ decode_env_path (evarname, defalt) char *evarname, *defalt; { register char *path, *p; - - Lisp_Object lpath; + Lisp_Object lpath, element, tem; /* It's okay to use getenv here, because this function is only used to initialize variables when Emacs starts up, and isn't called @@ -1421,9 +1576,16 @@ decode_env_path (evarname, defalt) { p = index (path, SEPCHAR); if (!p) p = path + strlen (path); - lpath = Fcons (p - path ? make_string (path, p - path) - : build_string ("."), - lpath); + element = (p - path ? make_string (path, p - path) + : build_string (".")); + + /* Add /: to the front of the name + if it would otherwise be treated as magic. */ + tem = Ffind_file_name_handler (element, Qt); + if (! NILP (tem)) + element = concat2 (build_string ("/:"), element); + + lpath = Fcons (element, lpath); if (*p) path = p + 1; else @@ -1434,6 +1596,9 @@ decode_env_path (evarname, defalt) syms_of_emacs () { + Qfile_name_handler_alist = intern ("file-name-handler-alist"); + staticpro (&Qfile_name_handler_alist); + #ifndef CANNOT_DUMP #ifdef HAVE_SHM defsubr (&Sdump_emacs_data);