X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/b74db6347cf5cac1ebd4c604fd5691c588fd8e32..0e963201d03d9229bb8ac4323291d2b0119526ed:/src/emacs.c diff --git a/src/emacs.c b/src/emacs.c index c2b698ba50..b1b2170a02 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -1,6 +1,6 @@ /* Fully extensible Emacs, running on Unix, intended for GNU. -Copyright (C) 1985-1987, 1993-1995, 1997-1999, 2001-2015 Free Software +Copyright (C) 1985-1987, 1993-1995, 1997-1999, 2001-2016 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -22,6 +22,7 @@ along with GNU Emacs. If not, see . */ #include #include +#include #include #include @@ -59,13 +60,12 @@ along with GNU Emacs. If not, see . */ #include TERM_HEADER #endif /* HAVE_WINDOW_SYSTEM */ -#include "commands.h" +#include "coding.h" #include "intervals.h" #include "character.h" #include "buffer.h" #include "window.h" -#include "systty.h" #include "atimer.h" #include "blockinput.h" #include "syssignal.h" @@ -82,6 +82,7 @@ along with GNU Emacs. If not, see . */ #include "syntax.h" #include "sysselect.h" #include "systime.h" +#include "puresize.h" #include "gnutls.h" @@ -95,6 +96,10 @@ extern void moncontrol (int mode); #include #endif +#if HAVE_WCHAR_H +# include +#endif + #ifdef HAVE_SETRLIMIT #include #include @@ -195,9 +200,13 @@ bool no_site_lisp; /* Name for the server started by the daemon.*/ static char *daemon_name; +#ifndef WINDOWSNT /* Pipe used to send exit notification to the daemon parent at startup. */ int daemon_pipe[2]; +#else +HANDLE w32_daemon_event; +#endif /* Save argv and argc. */ char **initial_argv; @@ -233,6 +242,7 @@ Initialization options:\n\ --no-init-file, -q load neither ~/.emacs nor default.el\n\ --no-loadup, -nl do not load loadup.el into bare Emacs\n\ --no-site-file do not load site-start.el\n\ +--no-x-resources do not load X resources\n\ --no-site-lisp, -nsl do not add site-lisp directories to load-path\n\ --no-splash do not display a splash screen on startup\n\ --no-window-system, -nw do not communicate with X, ignoring $DISPLAY\n\ @@ -240,6 +250,7 @@ Initialization options:\n\ "\ --quick, -Q equivalent to:\n\ -q --no-site-file --no-site-lisp --no-splash\n\ + --no-x-resources\n\ --script FILE run FILE as an Emacs Lisp script\n\ --terminal, -t DEVICE use DEVICE for terminal I/O\n\ --user, -u USER load ~USER/.emacs instead of your own\n\ @@ -338,6 +349,19 @@ setlocale (int cat, char const *locale) } #endif +/* True if the current system locale uses UTF-8 encoding. */ +static bool +using_utf8 (void) +{ +#ifdef HAVE_WCHAR_H + wchar_t wc; + mbstate_t mbs = { 0 }; + return mbrtowc (&wc, "\xc4\x80", 2, &mbs) == 2 && wc == 0x100; +#else + return false; +#endif +} + /* Report a fatal error due to signal SIG, output a backtrace of at most BACKTRACE_LIMIT lines, and exit. */ @@ -691,9 +715,7 @@ close_output_streams (void) int main (int argc, char **argv) { -#if GC_MARK_STACK Lisp_Object dummy; -#endif char stack_bottom_variable; bool do_initial_setlocale; bool dumping; @@ -712,9 +734,7 @@ main (int argc, char **argv) /* If we use --chdir, this records the original directory. */ char *original_pwd = 0; -#if GC_MARK_STACK stack_base = &dummy; -#endif #ifndef CANNOT_DUMP might_dump = !initialized; @@ -741,6 +761,9 @@ main (int argc, char **argv) names between UTF-8 and the system's ANSI codepage. */ maybe_load_unicows_dll (); #endif + /* This has to be done before module_init is called below, so that + the latter could use the thread ID of the main thread. */ + w32_init_main_thread (); #endif #ifdef RUN_TIME_REMAP @@ -756,6 +779,10 @@ main (int argc, char **argv) atexit (close_output_streams); +#ifdef HAVE_MODULES + module_init (); +#endif + sort_args (argc, argv); argc = 0; while (argv[argc]) argc++; @@ -770,12 +797,12 @@ main (int argc, char **argv) tem2 = Fsymbol_value (intern_c_string ("emacs-copyright")); if (!STRINGP (tem)) { - fprintf (stderr, "Invalid value of `emacs-version'\n"); + fprintf (stderr, "Invalid value of 'emacs-version'\n"); exit (1); } if (!STRINGP (tem2)) { - fprintf (stderr, "Invalid value of `emacs-copyright'\n"); + fprintf (stderr, "Invalid value of 'emacs-copyright'\n"); exit (1); } else @@ -840,10 +867,13 @@ main (int argc, char **argv) } #endif /* HAVE_PERSONALITY_LINUX32 */ -#if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK) - /* Extend the stack space available. - Don't do that if dumping, since some systems (e.g. DJGPP) - might define a smaller stack limit at that time. */ +#if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK) && !defined (CYGWIN) + /* Extend the stack space available. Don't do that if dumping, + since some systems (e.g. DJGPP) might define a smaller stack + limit at that time. And it's not needed on Cygwin, since emacs + is built with an 8MB stack. Moreover, the setrlimit call can + cause problems on Cygwin + (https://www.cygwin.com/ml/cygwin/2015-07/msg00096.html). */ if (1 #ifndef CANNOT_DUMP && (!noninteractive || initialized) @@ -877,7 +907,7 @@ main (int argc, char **argv) setrlimit (RLIMIT_STACK, &rlim); } -#endif /* HAVE_SETRLIMIT and RLIMIT_STACK */ +#endif /* HAVE_SETRLIMIT and RLIMIT_STACK and not CYGWIN */ /* Record (approximately) where the stack begins. */ stack_bottom = &stack_bottom_variable; @@ -915,6 +945,7 @@ main (int argc, char **argv) fixup_locale must wait until later, since it builds strings. */ if (do_initial_setlocale) setlocale (LC_ALL, ""); + text_quoting_flag = using_utf8 (); inhibit_window_system = 0; @@ -982,8 +1013,12 @@ main (int argc, char **argv) exit (0); } +#ifndef WINDOWSNT /* Make sure IS_DAEMON starts up as false. */ daemon_pipe[1] = 0; +#else + w32_daemon_event = NULL; +#endif if (argmatch (argv, argc, "-daemon", "--daemon", 5, NULL, &skip_args) || argmatch (argv, argc, "-daemon", "--daemon", 5, &dname_arg, &skip_args)) @@ -1107,16 +1142,25 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem } #endif /* DAEMON_MUST_EXEC */ - if (dname_arg) - daemon_name = xstrdup (dname_arg); /* Close unused reading end of the pipe. */ emacs_close (daemon_pipe[0]); setsid (); -#else /* DOS_NT */ +#elif defined(WINDOWSNT) + /* Indicate that we want daemon mode. */ + w32_daemon_event = CreateEvent (NULL, TRUE, FALSE, W32_DAEMON_EVENT); + if (w32_daemon_event == NULL) + { + fprintf (stderr, "Couldn't create MS-Windows event for daemon: %s\n", + w32_strerror (0)); + exit (1); + } +#else /* MSDOS */ fprintf (stderr, "This platform does not support the -daemon flag.\n"); exit (1); -#endif /* DOS_NT */ +#endif /* MSDOS */ + if (dname_arg) + daemon_name = xstrdup (dname_arg); } #if defined HAVE_PTHREAD && !defined SYSTEM_MALLOC \ @@ -1413,6 +1457,11 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem syms_of_terminal (); syms_of_term (); syms_of_undo (); + +#ifdef HAVE_MODULES + syms_of_module (); +#endif + #ifdef HAVE_SOUND syms_of_sound (); #endif @@ -1530,7 +1579,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem /* This calls putenv and so must precede init_process_emacs. Also, it sets Voperating_system_release, which init_process_emacs uses. */ - init_editfns (); + init_editfns (dumping); /* These two call putenv. */ #ifdef HAVE_DBUS @@ -1644,6 +1693,7 @@ static const struct standard_args standard_args[] = { "-quick", 0, 55, 0 }, { "-q", "--no-init-file", 50, 0 }, { "-no-init-file", 0, 50, 0 }, + { "-no-x-resources", "--no-x-resources", 40, 0 }, { "-no-site-file", "--no-site-file", 40, 0 }, { "-u", "--user", 30, 1 }, { "-user", 0, 30, 1 }, @@ -1776,7 +1826,7 @@ sort_args (int argc, char **argv) options[from] = standard_args[i].nargs; priority[from] = standard_args[i].priority; if (from + standard_args[i].nargs >= argc) - fatal ("Option `%s' requires an argument\n", argv[from]); + fatal ("Option '%s' requires an argument\n", argv[from]); from += standard_args[i].nargs; goto done; } @@ -1813,7 +1863,7 @@ sort_args (int argc, char **argv) if (equals != 0) options[from] = 0; if (from + options[from] >= argc) - fatal ("Option `%s' requires an argument\n", argv[from]); + fatal ("Option '%s' requires an argument\n", argv[from]); from += options[from]; } /* FIXME When match < 0, shouldn't there be some error, @@ -1891,16 +1941,12 @@ all of which are called before Emacs is actually killed. */ attributes: noreturn) (Lisp_Object arg) { - struct gcpro gcpro1; int exit_code; - GCPRO1 (arg); - /* Fsignal calls emacs_abort () if it sees that waiting_for_input is set. */ waiting_for_input = 0; run_hook (Qkill_emacs_hook); - UNGCPRO; #ifdef HAVE_X_WINDOWS /* Transfer any clipboards we own to the clipboard manager. */ @@ -1988,7 +2034,6 @@ shut_down_emacs (int sig, Lisp_Object stuff) /* There is a tendency for a SIGIO signal to arrive within exit, and cause a SIGHUP because the input descriptor is already closed. */ unrequest_sigio (); - ignore_sigio (); /* Do this only if terminating normally, we want glyph matrices etc. in a core dump. */ @@ -2133,9 +2178,22 @@ synchronize_locale (int category, Lisp_Object *plocale, Lisp_Object desired_loca if (! EQ (*plocale, desired_locale)) { *plocale = desired_locale; +#ifdef WINDOWSNT + /* Changing categories like LC_TIME usually requires to specify + an encoding suitable for the new locale, but MS-Windows's + 'setlocale' will only switch the encoding when LC_ALL is + specified. So we ignore CATEGORY, use LC_ALL instead, and + then restore LC_NUMERIC to "C", so reading and printing + numbers is unaffected. */ + setlocale (LC_ALL, (STRINGP (desired_locale) + ? SSDATA (desired_locale) + : "")); + fixup_locale (); +#else /* !WINDOWSNT */ setlocale (category, (STRINGP (desired_locale) ? SSDATA (desired_locale) : "")); +#endif /* !WINDOWSNT */ } } @@ -2247,7 +2305,7 @@ decode_env_path (const char *evarname, const char *defalt, bool empty) p = strchr (path, SEPCHAR); if (!p) p = path + strlen (path); - element = (p - path ? make_unibyte_string (path, p - path) + element = ((p - path) ? make_unibyte_string (path, p - path) : empty_element); if (! NILP (element)) { @@ -2313,17 +2371,18 @@ This finishes the daemonization process by doing the other half of detaching from the parent process and its tty file descriptors. */) (void) { - int nfd; bool err = 0; if (!IS_DAEMON) error ("This function can only be called if emacs is run as a daemon"); - if (daemon_pipe[1] < 0) + if (!DAEMON_RUNNING) error ("The daemon has already been initialized"); if (NILP (Vafter_init_time)) error ("This function can only be called after loading the init files"); +#ifndef WINDOWSNT + int nfd; /* Get rid of stdin, stdout and stderr. */ nfd = emacs_open ("/dev/null", O_RDWR, 0); @@ -2344,6 +2403,13 @@ from the parent process and its tty file descriptors. */) err |= emacs_close (daemon_pipe[1]) != 0; /* Set it to an invalid value so we know we've already run this function. */ daemon_pipe[1] = -1; +#else /* WINDOWSNT */ + /* Signal the waiting emacsclient process. */ + err |= SetEvent (w32_daemon_event) == 0; + err |= CloseHandle (w32_daemon_event) == 0; + /* Set it to an invalid value so we know we've already run this function. */ + w32_daemon_event = INVALID_HANDLE_VALUE; +#endif if (err) error ("I/O error during daemon initialization"); @@ -2386,7 +2452,7 @@ Special values: Anything else (in Emacs 24.1, the possibilities are: aix, berkeley-unix, hpux, irix, usg-unix-v) indicates some sort of Unix system. */); Vsystem_type = intern_c_string (SYSTEM_TYPE); - /* See configure.ac (and config.nt) for the possible SYSTEM_TYPEs. */ + /* See configure.ac for the possible SYSTEM_TYPEs. */ DEFVAR_LISP ("system-configuration", Vsystem_configuration, doc: /* Value is string indicating configuration Emacs was built for. */); @@ -2399,7 +2465,10 @@ hpux, irix, usg-unix-v) indicates some sort of Unix system. */); DEFVAR_LISP ("system-configuration-features", Vsystem_configuration_features, doc: /* String listing some of the main features this Emacs was compiled with. An element of the form \"FOO\" generally means that HAVE_FOO was -defined during the build. */); +defined during the build. + +This is mainly intended for diagnostic purposes in bug reports. +Don't rely on it for testing whether a feature you want to use is available. */); Vsystem_configuration_features = build_string (EMACS_CONFIG_FEATURES); DEFVAR_BOOL ("noninteractive", noninteractive1,