]> git.eshelyaron.com Git - emacs.git/commitdiff
Simplify locale setup
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 24 Jan 2020 07:06:27 +0000 (23:06 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 24 Jan 2020 07:20:01 +0000 (23:20 -0800)
Stop exporting Vprevious_system_time_locale and
Vprevious_system_messages_locale to Elisp.  I did that export by
mistake in 1999, and the Elisp variables have never been used.
Simplifying this cruft should make it easier to fix Bug#39248.
* etc/NEWS: Mention this.
* src/emacs.c (main): Simplify locale initialization.
(synchronize_locale): Simplify.
(Vprevious_system_time_locale, Vprevious_system_messages_locale):
Now static variables not visible to Lisp, and defined only if
HAVE_SETLOCALE.
(Vprevious_system_messages_locale): Define only if LC_MESSAGES.

etc/NEWS
src/emacs.c

index 11ef31b2c8bf1f4f176dc9d7be014a786a5b0f62..764eda56a1ab0f15cdb8e09fc86106d0bfb07dc2 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -110,6 +110,10 @@ Formerly it made an exception for integer components of SOA records,
 because SOA serial numbers can exceed fixnum ranges on 32-bit platforms.
 Emacs now supports bignums so this old glitch is no longer needed.
 
+** The Lisp variables 'previous-system-messages-locale' and
+'previous-system-time-locale' have been removed, as they were created
+by mistake and were not useful to Lisp code.
+
 \f
 * Lisp Changes in Emacs 28.1
 
index c5a760d29f642e0f419fcad6b2e766dd22bf2c2d..4b5d00a0e80f2d2806eb7ae3da31d56bd1e0a441 100644 (file)
@@ -930,7 +930,6 @@ main (int argc, char **argv)
      for pointers.  */
   void *stack_bottom_variable;
 
-  bool do_initial_setlocale;
   bool no_loadup = false;
   char *junk = 0;
   char *dname_arg = 0;
@@ -1235,19 +1234,17 @@ main (int argc, char **argv)
   set_binary_mode (STDOUT_FILENO, O_BINARY);
 #endif /* MSDOS */
 
-  /* 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, "");
+  /* Set locale, so that initial error messages are localized properly.
+     However, skip this if LC_ALL is "C", as it's not needed in that case.
+     Skipping helps if dumping with unexec, 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");
+  if (! (lc_all && strcmp (lc_all, "C") == 0))
+    {
+      setlocale (LC_ALL, "");
+      fixup_locale ();
+    }
   text_quoting_flag = using_utf8 ();
 
   inhibit_window_system = 0;
@@ -1576,14 +1573,6 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
   init_alloc ();
   init_bignum ();
   init_threads ();
-
-  if (do_initial_setlocale)
-    {
-      fixup_locale ();
-      Vsystem_messages_locale = Vprevious_system_messages_locale;
-      Vsystem_time_locale = Vprevious_system_time_locale;
-    }
-
   init_eval ();
   init_atimer ();
   running_asynch_code = 0;
@@ -2617,25 +2606,25 @@ synchronize_locale (int category, Lisp_Object *plocale, Lisp_Object desired_loca
   if (! EQ (*plocale, desired_locale))
     {
       *plocale = desired_locale;
-#ifdef WINDOWSNT
+      char const *locale_string
+       = STRINGP (desired_locale) ? SSDATA (desired_locale) : "";
+# ifdef WINDOWSNT
       /* Changing categories like LC_TIME usually requires specifying
         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)
-                         : ""));
+      setlocale (LC_ALL, locale_string);
       fixup_locale ();
-#else  /* !WINDOWSNT */
-      setlocale (category, (STRINGP (desired_locale)
-                           ? SSDATA (desired_locale)
-                           : ""));
-#endif /* !WINDOWSNT */
+# else /* !WINDOWSNT */
+      setlocale (category, locale_string);
+# endif        /* !WINDOWSNT */
     }
 }
 
+static Lisp_Object Vprevious_system_time_locale;
+
 /* Set system time locale to match Vsystem_time_locale, if possible.  */
 void
 synchronize_system_time_locale (void)
@@ -2644,15 +2633,19 @@ synchronize_system_time_locale (void)
                      Vsystem_time_locale);
 }
 
+# ifdef LC_MESSAGES
+static Lisp_Object Vprevious_system_messages_locale;
+# endif
+
 /* Set system messages locale to match Vsystem_messages_locale, if
    possible.  */
 void
 synchronize_system_messages_locale (void)
 {
-#ifdef LC_MESSAGES
+# ifdef LC_MESSAGES
   synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
                      Vsystem_messages_locale);
-#endif
+# endif
 }
 #endif /* HAVE_SETLOCALE */
 
@@ -2974,19 +2967,16 @@ build directory.  */);
   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.  */);
+#ifdef LC_MESSAGES
   Vprevious_system_messages_locale = Qnil;
+  staticpro (&Vprevious_system_messages_locale);
+#endif
 
   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;
+  staticpro (&Vprevious_system_time_locale);
 
   DEFVAR_LISP ("before-init-time", Vbefore_init_time,
               doc: /* Value of `current-time' before Emacs begins initialization.  */);