diff options
Diffstat (limited to 'src/core/recode.c')
-rw-r--r-- | src/core/recode.c | 88 |
1 files changed, 60 insertions, 28 deletions
diff --git a/src/core/recode.c b/src/core/recode.c index aa9f8315..8237e056 100644 --- a/src/core/recode.c +++ b/src/core/recode.c @@ -20,7 +20,10 @@ #include "module.h" #include "settings.h" +#include "servers.h" +#include "signals.h" #include "lib-config/iconfig.h" +#include "misc.h" #ifdef HAVE_GLIB2 static gboolean recode_get_charset(const char **charset) @@ -29,39 +32,65 @@ static gboolean recode_get_charset(const char **charset) if (**charset) /* we use the same test as in src/fe-text/term.c:123 */ return !g_strcasecmp(*charset, "utf-8"); - + return g_get_charset(charset); } #endif +gboolean is_valid_charset(const char *charset) +{ +#ifdef HAVE_GLIB2 + const char *from="UTF-8"; + const char *str="irssi"; + char *recoded; + gboolean valid; + + if (!charset || *charset == '\0') + return FALSE; + recoded = g_convert(str, strlen(str), charset, from, NULL, NULL, NULL); + valid = (recoded != NULL); + g_free(recoded); + return valid; +#else + if (!charset || *charset =='\0') + return FALSE; + return TRUE; +#endif +} + +static gboolean is_translit(const char *charset) +{ + char *pos; + pos = stristr(charset, "//translit"); + return (pos != NULL); +} + char *recode_in(const char *str, const char *target) { #ifdef HAVE_GLIB2 const char *from = NULL; const char *to = NULL; + char *translit_to = NULL; char *recoded = NULL; - gboolean term_is_utf8; - gboolean str_is_utf8; - gboolean translit; + gboolean term_is_utf8, str_is_utf8, translit; int len; - + if (!str) return g_strdup(str); - + len = strlen(str); str_is_utf8 = g_utf8_validate(str, len, NULL); - translit = settings_get_bool("recode_transliterate"); - - if (target != NULL) + + if (target != NULL && from == NULL) from = iconfig_get_str("conversions", target, NULL); term_is_utf8 = recode_get_charset(&to); - - if (translit) - to = g_strdup_printf("%s//TRANSLIT", to); - + + if (translit && !is_translit(to)) + to = translit_to = g_strconcat(to, "//TRANSLIT", NULL); + if (from) recoded = g_convert(str, len, to, from, NULL, NULL, NULL); @@ -69,10 +98,10 @@ char *recode_in(const char *str, const char *target) if (term_is_utf8) { if (!str_is_utf8) from = settings_get_str("recode_fallback"); - + } else if (str_is_utf8) from = "UTF-8"; - + if (from) recoded = g_convert(str, len, to, from, NULL, NULL, NULL); @@ -93,31 +122,34 @@ char *recode_out(const char *str, const char *target) gboolean translit; gboolean term_is_utf8; int len; - + if (!str) return g_strdup(str); - + len = strlen(str); - + translit = settings_get_bool("recode_transliterate"); + if (target) { const char *to = NULL; + char *translit_to = NULL; + + /* default outgoing charset if set */ + to = settings_get_str("recode_out_default_charset"); + if (to == NULL || *to == '\0') + to = iconfig_get_str("conversions", target, NULL); + if (to && *to != '\0') { + if (translit && !is_translit(to)) + to = translit_to = g_strconcat(to ,"//TRANSLIT", NULL); - to = iconfig_get_str("conversions", target, NULL); - if (!to) - /* default outgoing charset if no conversion is set */ - to = settings_get_str("recode_out_default_charset"); - if (to) { - if (translit) - to = g_strdup_printf("%s//TRANSLIT", to); - term_is_utf8 = recode_get_charset(&from); recoded = g_convert(str, len, to, from, NULL, NULL, NULL); } + g_free(translit_to); } if (!recoded) recoded = g_strdup(str); - + return recoded; #else return g_strdup(str); @@ -128,7 +160,7 @@ void recode_init(void) { settings_add_str("misc", "recode_fallback", "ISO8859-1"); settings_add_str("misc", "recode_out_default_charset", ""); - settings_add_bool("misc", "recode_transliterate", TRUE); + settings_add_bool("misc", "recode_transliterate", FALSE); } void recode_deinit(void) |