mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 20:00:19 +02:00
* Makefile.am (EXTRA_DIST): Add `m4/gnulib-cache.m4'. * build-aux/git-version-gen: Keep unchanged.
81 lines
2.2 KiB
Diff
81 lines
2.2 KiB
Diff
Add a variant of `locale_charset' that returns its result based solely on
|
|
information from the environment. See
|
|
http://lists.gnu.org/archive/html/guile-devel/2011-11/msg00040.html for the
|
|
rationale.
|
|
|
|
--- a/lib/localcharset.c
|
|
+++ b/lib/localcharset.c
|
|
@@ -544,3 +544,73 @@ locale_charset (void)
|
|
|
|
return codeset;
|
|
}
|
|
+
|
|
+/* A variant of the above, without calls to `setlocale', `nl_langinfo',
|
|
+ etc. */
|
|
+const char *
|
|
+environ_locale_charset (void)
|
|
+{
|
|
+ static char buf[2 + 10 + 1];
|
|
+ const char *codeset, *aliases;
|
|
+ const char *locale = NULL;
|
|
+
|
|
+ locale = getenv ("LC_ALL");
|
|
+ if (locale == NULL || locale[0] == '\0')
|
|
+ {
|
|
+ locale = getenv ("LC_CTYPE");
|
|
+ if (locale == NULL || locale[0] == '\0')
|
|
+ locale = getenv ("LANG");
|
|
+ }
|
|
+
|
|
+ if (locale != NULL && locale[0] != '\0')
|
|
+ {
|
|
+ /* If the locale name contains an encoding after the dot, return it. */
|
|
+ const char *dot = strchr (locale, '.');
|
|
+
|
|
+ if (dot != NULL)
|
|
+ {
|
|
+ const char *modifier;
|
|
+
|
|
+ dot++;
|
|
+ /* Look for the possible @... trailer and remove it, if any. */
|
|
+ modifier = strchr (dot, '@');
|
|
+ if (modifier == NULL)
|
|
+ return dot;
|
|
+ if (modifier - dot < sizeof (buf))
|
|
+ {
|
|
+ memcpy (buf, dot, modifier - dot);
|
|
+ buf [modifier - dot] = '\0';
|
|
+ return buf;
|
|
+ }
|
|
+ }
|
|
+ else if (strcmp (locale, "C") == 0)
|
|
+ {
|
|
+ strcpy (buf, "ASCII");
|
|
+ return buf;
|
|
+ }
|
|
+ else
|
|
+ codeset = "";
|
|
+ }
|
|
+ else
|
|
+ codeset = "";
|
|
+
|
|
+ /* Resolve alias. */
|
|
+ for (aliases = get_charset_aliases ();
|
|
+ *aliases != '\0';
|
|
+ aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
|
|
+ if (strcmp (codeset, aliases) == 0
|
|
+ || (aliases[0] == '*' && aliases[1] == '\0'))
|
|
+ {
|
|
+ codeset = aliases + strlen (aliases) + 1;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /* Don't return an empty string. GNU libc and GNU libiconv interpret
|
|
+ the empty string as denoting "the locale's character encoding",
|
|
+ thus GNU libiconv would call this function a second time. */
|
|
+ if (codeset[0] == '\0')
|
|
+ /* Default to Latin-1, for backward compatibility with Guile 1.8. */
|
|
+ codeset = "ISO-8859-1";
|
|
+
|
|
+ return codeset;
|
|
+}
|