From 342141fcb20cffcc7c2f49e7e478ba81af467df3 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sat, 19 Nov 2005 18:13:18 +0000 Subject: [PATCH] If transliterations don't work in the system (eg. Solaris), don't allow recode_transliterate setting to be enabled. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@4082 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- src/core/recode.c | 21 +++++++++++++-------- src/fe-common/core/fe-recode.c | 11 ++++++++++- src/fe-common/core/module-formats.c | 1 + src/fe-common/core/module-formats.h | 1 + 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/core/recode.c b/src/core/recode.c index 1dd79ca7..75a1c127 100644 --- a/src/core/recode.c +++ b/src/core/recode.c @@ -37,19 +37,31 @@ static gboolean recode_get_charset(const char **charset) } #endif +static gboolean is_translit(const char *charset) +{ + char *pos; + pos = stristr(charset, "//translit"); + return (pos != NULL); +} + gboolean is_valid_charset(const char *charset) { #ifdef HAVE_GLIB2 const char *from="UTF-8"; const char *str="irssi"; - char *recoded; + char *recoded, *to = NULL; gboolean valid; if (!charset || *charset == '\0') return FALSE; + + if (settings_get_bool("recode_transliterate") && !is_translit(charset)) + charset = to = g_strconcat(charset, "//TRANSLIT", NULL); + recoded = g_convert(str, strlen(str), charset, from, NULL, NULL, NULL); valid = (recoded != NULL); g_free(recoded); + g_free(to); return valid; #else if (!charset || *charset =='\0') @@ -58,13 +70,6 @@ gboolean is_valid_charset(const char *charset) #endif } -static gboolean is_translit(const char *charset) -{ - char *pos; - pos = stristr(charset, "//translit"); - return (pos != NULL); -} - char *recode_in(const SERVER_REC *server, const char *str, const char *target) { #ifdef HAVE_GLIB2 diff --git a/src/fe-common/core/fe-recode.c b/src/fe-common/core/fe-recode.c index b6d89e96..988c3762 100644 --- a/src/fe-common/core/fe-recode.c +++ b/src/fe-common/core/fe-recode.c @@ -155,7 +155,16 @@ static void read_settings(void) char *old_term_charset = g_strdup(term_charset); char *old_recode_fallback = g_strdup(recode_fallback); char *old_recode_out_default = g_strdup(recode_out_default); - + + if (settings_get_bool("recode_transliterate")) { + /* check if transliterations are supported in this system */ + if (!is_valid_charset("ASCII")) { + printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, + TXT_CONVERSION_NO_TRANSLITS); + settings_set_bool("recode_transliterate", FALSE); + } + } + if (recode_fallback) g_free(recode_fallback); recode_fallback = g_strdup(settings_get_str("recode_fallback")); diff --git a/src/fe-common/core/module-formats.c b/src/fe-common/core/module-formats.c index 66fb9f91..d9bfc48b 100644 --- a/src/fe-common/core/module-formats.c +++ b/src/fe-common/core/module-formats.c @@ -255,6 +255,7 @@ FORMAT_REC fecommon_core_formats[] = { { "conversion_added", "Added {hilight $0}/{hilight $1} to conversion database", 2, { FORMAT_STRING, FORMAT_STRING } }, { "conversion_removed", "Removed {hilight $0} from conversion database", 1, { FORMAT_STRING } }, { "conversion_not_found", "{hilight $0} not found in conversion database", 1, { FORMAT_STRING } }, + { "conversion_no_translits", "Transliterations not supported in this system", 0 }, { "recode_header", "%#Target Character set", 0 }, { "recode_line", "%#%|$[!30]0 $1", 2, { FORMAT_STRING, FORMAT_STRING } }, diff --git a/src/fe-common/core/module-formats.h b/src/fe-common/core/module-formats.h index 55ea9df0..8f481aca 100644 --- a/src/fe-common/core/module-formats.h +++ b/src/fe-common/core/module-formats.h @@ -221,6 +221,7 @@ enum { TXT_CONVERSION_ADDED, TXT_CONVERSION_REMOVED, TXT_CONVERSION_NOT_FOUND, + TXT_CONVERSION_NO_TRANSLITS, TXT_RECODE_HEADER, TXT_RECODE_LINE,