#endif /* ENABLE_NLS */
assert (default_encoding == NULL);
- default_encoding = strdup (locale_charset ());
+ default_encoding = xstrdup (locale_charset ());
hmapx_init (&map);
}
+const char *
+get_default_encoding (void)
+{
+ return default_encoding;
+}
+
+void
+set_default_encoding (const char *enc)
+{
+ free (default_encoding);
+ default_encoding = xstrdup (enc);
+}
+
+
+/* Attempts to set the encoding from a locale name
+ returns true if successfull.
+ This function does not (should not!) alter the current locale.
+*/
+bool
+set_encoding_from_locale (const char *loc)
+{
+ bool ok = true;
+ char *c_encoding;
+ char *loc_encoding;
+ char *tmp = xstrdup (setlocale (LC_CTYPE, NULL));
+
+ setlocale (LC_CTYPE, "C");
+ c_encoding = xstrdup (locale_charset ());
+
+ setlocale (LC_CTYPE, loc);
+ loc_encoding = xstrdup (locale_charset ());
+
+
+ if ( 0 == strcmp (loc_encoding, c_encoding))
+ {
+ ok = false;
+ }
+
+
+ setlocale (LC_CTYPE, tmp);
+
+ free (tmp);
+
+ if (ok)
+ {
+ free (default_encoding);
+ default_encoding = loc_encoding;
+ }
+ else
+ free (loc_encoding);
+
+ free (c_encoding);
+
+ return ok;
+}
+
void
i18n_done (void)
{
+bool
+valid_encoding (const char *enc)
+{
+ iconv_t conv = iconv_open ("UTF8", enc);
+
+ if ( conv == (iconv_t) -1)
+ return false;
+
+ iconv_close (conv);
+
+ return true;
+}
+
/* Return the system local's idea of the
decimal seperator character */
{
char radix_char;
- char *ol = strdup (setlocale (LC_NUMERIC, NULL));
+ char *ol = xstrdup (setlocale (LC_NUMERIC, NULL));
setlocale (LC_NUMERIC, "");
#if HAVE_NL_LANGINFO