Commit 9164192f 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).
parent 53a9e90c
......@@ -57,38 +57,14 @@
# error No UTF8 charset conversion implemented on this platform!
#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)
{
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,7 +136,6 @@ 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);
#elif defined (USE_MB2MB)
free ((char *)str);
......
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