diff options
-rw-r--r-- | libidn/toutf8.c | 80 |
1 files changed, 28 insertions, 52 deletions
diff --git a/libidn/toutf8.c b/libidn/toutf8.c index d16efdb..262f252 100644 --- a/libidn/toutf8.c +++ b/libidn/toutf8.c @@ -45,69 +45,45 @@ # include <locale.h> # endif -# ifndef _LIBC -static const char * -stringprep_locale_charset_slow (void) -{ - return nl_langinfo (CODESET); - const char *charset = getenv ("CHARSET"); /* flawfinder: ignore */ - - if (charset && *charset) - return charset; - -# ifdef LOCALE_WORKS - { - char *p; - - p = setlocale (LC_CTYPE, NULL); - setlocale (LC_CTYPE, ""); - - charset = nl_langinfo (CODESET); - - setlocale (LC_CTYPE, p); - - if (charset && *charset) - return charset; - } -# endif - - return "ASCII"; -} - -static const char *stringprep_locale_charset_cache; -# endif - +# ifdef _LIBC +# define stringprep_locale_charset() nl_langinfo (CODESET) +# else /** * stringprep_locale_charset: * - * Find out system locale charset. + * Find out current locale charset. The function respect the CHARSET + * environment variable, but typically uses nl_langinfo(CODESET) when + * it is supported. It fall back on "ASCII" if CHARSET isn't set and + * nl_langinfo isn't supported or return anything. * - * Note that this function return what it believe the SYSTEM is using - * as a locale, not what locale the program is currently in (modified, - * e.g., by a setlocale(LC_CTYPE, "ISO-8859-1")). The reason is that - * data read from argv[], stdin etc comes from the system, and is more - * likely to be encoded using the system locale than the program - * locale. + * Note that this function return the application's locale's preferred + * charset (or thread's locale's preffered charset, if your system + * support thread-specific locales). It does not return what the + * system may be using. Thus, if you receive data from external + * sources you cannot in general use this function to guess what + * charset it is encoded in. Use stringprep_convert from the external + * representation into the charset returned by this function, to have + * data in the locale encoding. * - * You can set the environment variable CHARSET to override the value - * returned. Note that this function caches the result, so you will - * have to modify CHARSET before calling (even indirectly) any - * stringprep functions, e.g., by setting it when invoking the - * application. - * - * Return value: Return the character set used by the system locale. + * Return value: Return the character set used by the current locale. * It will never return NULL, but use "ASCII" as a fallback. **/ -# ifdef _LIBC -# define stringprep_locale_charset() nl_langinfo (CODESET) -# else const char * stringprep_locale_charset (void) { - if (!stringprep_locale_charset_cache) - stringprep_locale_charset_cache = stringprep_locale_charset_slow (); + const char *charset = getenv ("CHARSET"); /* flawfinder: ignore */ + + if (charset && *charset) + return charset; - return stringprep_locale_charset_cache; +# ifdef LOCALE_WORKS + charset = nl_langinfo (CODESET); + + if (charset && *charset) + return charset; +# endif + + return "ASCII"; } # endif |