X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fi18n.c;h=f8e5e396e865efe267155f29f02aa29fb024649f;hb=9a331fe64eb814ae5c1322e21717a04fb254bf65;hp=d194634f654dfca804cfd5d22b29e57b46f42966;hpb=43b1296aafe7582e7dbe6c2b6a8b478d7d9b0fcf;p=pspp-builds.git diff --git a/src/libpspp/i18n.c b/src/libpspp/i18n.c index d194634f..f8e5e396 100644 --- a/src/libpspp/i18n.c +++ b/src/libpspp/i18n.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -29,9 +30,13 @@ #include #include "xstrndup.h" +#if HAVE_NL_LANGINFO +#include +#endif -static char *locale = 0; -static const char *charset; + +static char *locale; +static char *charset; static iconv_t convertor[n_CONV]; @@ -45,7 +50,7 @@ create_iconv (const char* tocode, const char* fromcode) /* I don't think it's safe to translate this string or to use messaging as the convertors have not yet been set up */ - if ( (iconv_t) -1 == conv) + if ( (iconv_t) -1 == conv && 0 != strcmp (tocode, fromcode)) { const int err = errno; fprintf (stderr, @@ -160,16 +165,17 @@ void set_pspp_locale (const char *l) { char *current_locale; - const char *current_charset; + char *current_charset; free(locale); locale = strdup(l); - current_locale = setlocale (LC_CTYPE, 0); - current_charset = locale_charset (); + current_locale = strdup (setlocale (LC_CTYPE, 0)); + current_charset = strdup (locale_charset ()); setlocale (LC_CTYPE, locale); - charset = locale_charset (); + free (charset); + charset = strdup (locale_charset ()); setlocale (LC_CTYPE, current_locale); iconv_close (convertor[CONV_PSPP_TO_UTF8]); @@ -177,6 +183,12 @@ set_pspp_locale (const char *l) iconv_close (convertor[CONV_SYSTEM_TO_PSPP]); convertor[CONV_SYSTEM_TO_PSPP] = create_iconv (charset, current_charset); + + iconv_close (convertor[CONV_UTF8_TO_PSPP]); + convertor[CONV_UTF8_TO_PSPP] = create_iconv (charset, "UTF-8"); + + free (current_locale); + free (current_charset); } void @@ -186,10 +198,13 @@ i18n_init (void) locale = strdup (setlocale (LC_CTYPE, NULL)); setlocale (LC_CTYPE, locale); - charset = locale_charset (); - convertor[CONV_PSPP_TO_UTF8] = create_iconv ("UTF-8", charset); + free (charset); + charset = strdup (locale_charset ()); + + convertor[CONV_PSPP_TO_UTF8] = create_iconv ("UTF-8", charset); convertor[CONV_SYSTEM_TO_PSPP] = create_iconv (charset, charset); + convertor[CONV_UTF8_TO_PSPP] = create_iconv (charset, "UTF-8"); } @@ -208,3 +223,33 @@ i18n_done (void) } } + + + +/* Return the system local's idea of the + decimal seperator character */ +char +get_system_decimal (void) +{ + char radix_char; + + char *ol = strdup (setlocale (LC_NUMERIC, NULL)); + setlocale (LC_NUMERIC, ""); + +#if HAVE_NL_LANGINFO + radix_char = nl_langinfo (RADIXCHAR)[0]; +#else + { + char buf[10]; + snprintf (buf, sizeof buf, "%f", 2.5); + radix_char = buf[1]; + } +#endif + + /* We MUST leave LC_NUMERIC untouched, since it would + otherwise interfere with data_{in,out} */ + setlocale (LC_NUMERIC, ol); + free (ol); + return radix_char; +} +