Simplify locale setup

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.
This commit is contained in:
Paul Eggert 2020-01-23 23:06:27 -08:00
parent 04ca1a1e08
commit 75c1f936fc
2 changed files with 34 additions and 40 deletions

View file

@ -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.
* Lisp Changes in Emacs 28.1

View 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. */);