X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/bfed046df118533fc599449d48e59a3100e6439d..0e963201d03d9229bb8ac4323291d2b0119526ed:/src/emacs.c diff --git a/src/emacs.c b/src/emacs.c index 70db900246..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 @@ -344,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. */ @@ -697,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; @@ -718,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; @@ -747,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 @@ -762,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++; @@ -776,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 @@ -846,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) @@ -883,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; @@ -921,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; @@ -1432,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 @@ -1549,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 @@ -1796,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; } @@ -1833,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, @@ -1911,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. */ @@ -2008,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. */ @@ -2152,17 +2177,23 @@ 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 and use LC_ALL instead. */ - category = LC_ALL; -#endif - *plocale = desired_locale; + 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 */ } } @@ -2421,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. */); @@ -2434,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,