From 928e2b479b20b370fd8d4ee1fa1596d40798b494 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 6 Feb 2006 04:50:39 +0000 Subject: [PATCH] Created ctdl_iconv_open() wrapper around iconv_open() in order to add extra charset aliases. Nonstandard, broken Microsoft charsets such as 'MS950' are now aliased to names such as 'CP950'. This will allow WebCit to display broken messages created by broken Microsoft products. --- webcit/html2html.c | 2 +- webcit/messages.c | 32 +++++++++++++++++++++++++++++--- webcit/rss.c | 2 +- webcit/webcit.h | 4 ++++ 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/webcit/html2html.c b/webcit/html2html.c index 1f2d358c9..05bc77a93 100644 --- a/webcit/html2html.c +++ b/webcit/html2html.c @@ -216,7 +216,7 @@ void output_html(char *supplied_charset, int treat_as_wiki) { && (strcasecmp(charset, "")) ) { lprintf(9, "Converting %s to UTF-8\n", charset); - ic = iconv_open("UTF-8", charset); + ic = ctdl_iconv_open("UTF-8", charset); if (ic == (iconv_t)(-1) ) { lprintf(5, "%s:%d iconv_open() failed: %s\n", __FILE__, __LINE__, strerror(errno)); diff --git a/webcit/messages.c b/webcit/messages.c index 35ee6e05d..ec3e13ff9 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -28,6 +28,32 @@ struct addrbookent { #ifdef HAVE_ICONV + +/** + * \brief Wrapper around iconv_open() + * Our version adds aliases for non-standard Microsoft charsets + * such as 'MS950', aliasing them to names like 'CP950' + * + * \param tocode Target encoding + * \param fromcode Source encoding + */ +iconv_t ctdl_iconv_open(const char *tocode, const char *fromcode) +{ + iconv_t ic = (iconv_t)(-1) ; + ic = iconv_open(tocode, fromcode); + if (ic == (iconv_t)(-1) ) { + char alias_fromcode[64]; + if ( (strlen(fromcode) == 5) && (!strncasecmp(fromcode, "MS", 2)) ) { + safestrncpy(alias_fromcode, fromcode, sizeof alias_fromcode); + alias_fromcode[0] = 'C'; + alias_fromcode[1] = 'P'; + ic = iconv_open(tocode, alias_fromcode); + } + } + return(ic); +} + + /** * \brief Handle subjects with RFC2047 encoding * such as: @@ -73,7 +99,7 @@ void utf8ify_rfc822_string(char *buf) { ibuflen = strlen(istr); } - ic = iconv_open("UTF-8", charset); + ic = ctdl_iconv_open("UTF-8", charset); if (ic != (iconv_t)(-1) ) { obuf = malloc(1024); obuflen = 1024; @@ -897,7 +923,7 @@ void read_message(long msgnum, int printable_view, char *section) { && (strcasecmp(mime_charset, "UTF-8")) && (strcasecmp(mime_charset, "")) ) { - ic = iconv_open("UTF-8", mime_charset); + ic = ctdl_iconv_open("UTF-8", mime_charset); if (ic == (iconv_t)(-1) ) { lprintf(5, "%s:%d iconv_open(UTF-8, %s) failed: %s\n", __FILE__, __LINE__, mime_charset, strerror(errno)); @@ -1293,7 +1319,7 @@ void pullquote_message(long msgnum, int forward_attachments, int include_headers && (strcasecmp(mime_charset, "UTF-8")) && (strcasecmp(mime_charset, "")) ) { - ic = iconv_open("UTF-8", mime_charset); + ic = ctdl_iconv_open("UTF-8", mime_charset); if (ic == (iconv_t)(-1) ) { lprintf(5, "%s:%d iconv_open() failed: %s\n", __FILE__, __LINE__, strerror(errno)); diff --git a/webcit/rss.c b/webcit/rss.c index 937fcbff5..6a962559a 100644 --- a/webcit/rss.c +++ b/webcit/rss.c @@ -246,7 +246,7 @@ void display_rss(char *roomname, char *request_method) /** Set up a character set conversion if we need to */ #ifdef HAVE_ICONV if (strcasecmp(charset, "us-ascii") && strcasecmp(charset, "utf-8") && strcasecmp(charset, "") ) { - ic = iconv_open("UTF-8", charset); + ic = ctdl_iconv_open("UTF-8", charset); if (ic == (iconv_t)(-1)) { lprintf(5, "%s:%d iconv_open() failed: %s\n", __FILE__, __LINE__, strerror(errno)); diff --git a/webcit/webcit.h b/webcit/webcit.h index bfad3dcae..eababbed8 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -679,6 +679,10 @@ void end_tab(int tabnum, int num_tabs); void str_wiki_index(char *s); void display_wiki_page(void); +#ifdef HAVE_ICONV +iconv_t ctdl_iconv_open(const char *tocode, const char *fromcode); +#endif + void embed_room_banner(char *, int); /* navbar types that can be passed to embed_room_banner */ -- 2.30.2