12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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;
- +}
|