From 9164192f0231bed4913e5cd3bb4174343163439b Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 18 Jul 2010 11:59:57 +0300 Subject: [PATCH] nl_langinfo is not thread-safe, avoid it This brings some useless overhead for native UTF-8 systems. Linux packagers may want to define ASSUME_UTF8 to avoid this problem. Also, this assumes that iconv_open() recognizes "" as the current character set (POSIX says nothing about valid iconv_open() parameters). --- src/text/unicode.c | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/src/text/unicode.c b/src/text/unicode.c index 77b7684d4a..41734eddc7 100644 --- a/src/text/unicode.c +++ b/src/text/unicode.c @@ -57,38 +57,14 @@ # error No UTF8 charset conversion implemented on this platform! #endif -#if defined (USE_ICONV) -# include -static char charset[sizeof ("CSISO11SWEDISHFORNAMES")] = ""; - -static void find_charset_once (void) -{ - strlcpy (charset, nl_langinfo (CODESET), sizeof (charset)); - if (!strcasecmp (charset, "ASCII") - || !strcasecmp (charset, "ANSI_X3.4-1968")) - strcpy (charset, "UTF-8"); /* superset... */ -} - -static int find_charset (void) -{ - static pthread_once_t once = PTHREAD_ONCE_INIT; - pthread_once (&once, find_charset_once); - return !strcasecmp (charset, "UTF-8"); -} -#endif - - static char *locale_fast (const char *string, bool from) { if( string == NULL ) return NULL; #if defined (USE_ICONV) - if (find_charset ()) - return (char *)string; - - vlc_iconv_t hd = vlc_iconv_open (from ? "UTF-8" : charset, - from ? charset : "UTF-8"); + vlc_iconv_t hd = vlc_iconv_open (from ? "UTF-8" : "", + from ? "" : "UTF-8"); if (hd == (vlc_iconv_t)(-1)) return NULL; /* Uho! */ @@ -144,8 +120,6 @@ static inline char *locale_dup (const char *string, bool from) assert( string ); #if defined (USE_ICONV) - if (find_charset ()) - return strdup (string); return locale_fast (string, from); #elif defined (USE_MB2MB) return locale_fast (string, from); @@ -162,8 +136,7 @@ static inline char *locale_dup (const char *string, bool from) void LocaleFree (const char *str) { #if defined (USE_ICONV) - if (!find_charset ()) - free ((char *)str); + free ((char *)str); #elif defined (USE_MB2MB) free ((char *)str); #else -- 2.39.2