const gchar * camel_iconv_locale_language (void) { iconv_init (FALSE); return locale_lang; }
const gchar * camel_iconv_locale_charset (void) { iconv_init (FALSE); return locale_charset; }
/* On all platforms operate on UTF-8 encoding */ int #if defined(WIN32) translated_main(int argc, char **argv, char **envp) #else /* defined(WIN32) */ main(int argc, char **argv, char **envp) #endif /* defined(WIN32) */ { RCType rc = RC_OK; #if defined(J9ZOS390) /* Convert EBCDIC to UTF-8 (ASCII) */ if (-1 != iconv_init()) { /* translate argv strings to ascii */ for (int i = 0; i < argc; i++) { argv[i] = e2a_string(argv[i]); if (NULL == argv[i]) { eprintf("failed to convert argument #%d from EBCDIC to ASCII", i); rc = RC_FAILED; break; } } } else { eprintf("failed to initialize iconv"); rc = RC_FAILED; } #endif /* defined(J9ZOS390) */ if (RC_OK == rc) { rc = startTraceGen(argc, argv); } return (RC_OK == rc) ? 0 : -1; }
const gchar * camel_iconv_charset_name (const gchar *charset) { gchar *name, *ret, *tmp; if (charset == NULL) return NULL; name = g_alloca (strlen (charset) + 1); strcpy (name, charset); e_strdown (name); iconv_init (TRUE); ret = g_hash_table_lookup (iconv_charsets, name); if (ret != NULL) { G_UNLOCK (iconv); return ret; } /* Unknown, try canonicalise some basic charset types to something that should work */ if (strncmp (name, "iso", 3) == 0) { /* Convert iso-nnnn-n or isonnnn-n or iso_nnnn-n to iso-nnnn-n or isonnnn-n */ gint iso, codepage; gchar *p; tmp = name + 3; if (*tmp == '-' || *tmp == '_') tmp++; iso = strtoul (tmp, &p, 10); if (iso == 10646) { /* they all become ICONV_10646 */ ret = g_strdup (ICONV_10646); } else { tmp = p; if (*tmp == '-' || *tmp == '_') tmp++; codepage = strtoul (tmp, &p, 10); if (p > tmp) { /* codepage is numeric */ #ifdef __aix__ if (codepage == 13) ret = g_strdup ("IBM-921"); else #endif /* __aix__ */ ret = g_strdup_printf (ICONV_ISO_D_FORMAT, iso, codepage); } else { /* codepage is a string - probably iso-2022-jp or something */ ret = g_strdup_printf (ICONV_ISO_S_FORMAT, iso, p); } } } else if (strncmp (name, "windows-", 8) == 0) { /* Convert windows-nnnnn or windows-cpnnnnn to cpnnnn */ tmp = name + 8; if (!strncmp (tmp, "cp", 2)) tmp+=2; ret = g_strdup_printf ("CP%s", tmp); } else if (strncmp (name, "microsoft-", 10) == 0) { /* Convert microsoft-nnnnn or microsoft-cpnnnnn to cpnnnn */ tmp = name + 10; if (!strncmp (tmp, "cp", 2)) tmp+=2; ret = g_strdup_printf ("CP%s", tmp); } else { /* Just assume its ok enough as is, case and all */ ret = g_strdup (charset); } g_hash_table_insert (iconv_charsets, g_strdup (name), ret); G_UNLOCK (iconv); return ret; }