Commit 9130fe63 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

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).
(cherry picked from commit 9164192f0231bed4913e5cd3bb4174343163439b)
parent 643e2bd0
...@@ -57,38 +57,14 @@ ...@@ -57,38 +57,14 @@
# error No UTF8 charset conversion implemented on this platform! # error No UTF8 charset conversion implemented on this platform!
#endif #endif
#if defined (USE_ICONV)
# include <langinfo.h>
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) static char *locale_fast (const char *string, bool from)
{ {
if( string == NULL ) if( string == NULL )
return NULL; return NULL;
#if defined (USE_ICONV) #if defined (USE_ICONV)
if (find_charset ()) vlc_iconv_t hd = vlc_iconv_open (from ? "UTF-8" : "",
return (char *)string; from ? "" : "UTF-8");
vlc_iconv_t hd = vlc_iconv_open (from ? "UTF-8" : charset,
from ? charset : "UTF-8");
if (hd == (vlc_iconv_t)(-1)) if (hd == (vlc_iconv_t)(-1))
return NULL; /* Uho! */ return NULL; /* Uho! */
...@@ -144,8 +120,6 @@ static inline char *locale_dup (const char *string, bool from) ...@@ -144,8 +120,6 @@ static inline char *locale_dup (const char *string, bool from)
assert( string ); assert( string );
#if defined (USE_ICONV) #if defined (USE_ICONV)
if (find_charset ())
return strdup (string);
return locale_fast (string, from); return locale_fast (string, from);
#elif defined (USE_MB2MB) #elif defined (USE_MB2MB)
return locale_fast (string, from); return locale_fast (string, from);
...@@ -162,8 +136,7 @@ static inline char *locale_dup (const char *string, bool from) ...@@ -162,8 +136,7 @@ static inline char *locale_dup (const char *string, bool from)
void LocaleFree (const char *str) void LocaleFree (const char *str)
{ {
#if defined (USE_ICONV) #if defined (USE_ICONV)
if (!find_charset ()) free ((char *)str);
free ((char *)str);
#elif defined (USE_MB2MB) #elif defined (USE_MB2MB)
free ((char *)str); free ((char *)str);
#else #else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment