From 604c11affe988bab23c87598c02248fff1d73f43 Mon Sep 17 00:00:00 2001 From: Fumitoshi UKAI Date: Mon, 22 Sep 2003 21:02:15 +0000 Subject: merge m17n patch add libwc --- mimehead.c | 52 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 14 deletions(-) (limited to 'mimehead.c') diff --git a/mimehead.c b/mimehead.c index d8371f9..a15f80f 100644 --- a/mimehead.c +++ b/mimehead.c @@ -1,9 +1,10 @@ -/* $Id: mimehead.c,v 1.8 2003/01/23 18:37:21 ukai Exp $ */ +/* $Id: mimehead.c,v 1.9 2003/09/22 21:02:20 ukai Exp $ */ /* * MIME header support by Akinori ITO */ #include +#include "fm.h" #include "myctype.h" #include "Str.h" @@ -191,12 +192,15 @@ decodeQP(char **ww) } Str -decodeWord(char **ow) +decodeWord(char **ow, wc_ces * charset) { +#ifdef USE_M17N + wc_ces c; +#endif char *p, *w = *ow; char method; Str a = Strnew(); - Str charset = Strnew(); + Str tmp = Strnew(); if (*w != '=' || *(w + 1) != '?') goto convert_fail; @@ -204,12 +208,17 @@ decodeWord(char **ow) for (; *w != '?'; w++) { if (*w == '\0') goto convert_fail; - Strcat_char(charset, *w); + Strcat_char(tmp, *w); } - if (Strcasecmp_charp(charset, J_CHARSET) != 0) { - /* NOT ISO-2022-JP encoding ... don't convert */ +#ifdef USE_M17N + c = wc_guess_charset(tmp->ptr, 0); + if (!c) goto convert_fail; - } +#else + if (strcasecmp(buf, "ISO-8859-1") != 0 && strcasecmp(buf, "US_ASCII") != 0) + /* NOT ISO-8859-1 encoding ... don't convert */ + goto convert_fail; +#endif w++; method = *(w++); if (*w != '?') @@ -234,6 +243,9 @@ decodeWord(char **ow) w++; } *ow = w; +#ifdef USE_M17N + *charset = c; +#endif return a; convert_fail: @@ -244,17 +256,24 @@ decodeWord(char **ow) * convert MIME encoded string to the original one */ Str -decodeMIME(char *orgstr) +decodeMIME(Str orgstr, wc_ces * charset) { - char *org = orgstr; + char *org = orgstr->ptr, *endp = org + orgstr->length; char *org0, *p; - Str cnv = Strnew_size(strlen(orgstr)); + Str cnv = NULL; - while (*org) { +#ifdef USE_M17N + *charset = 0; +#endif + while (org < endp) { if (*org == '=' && *(org + 1) == '?') { + if (cnv == NULL) { + cnv = Strnew_size(orgstr->length); + Strcat_charp_n(cnv, orgstr->ptr, org - orgstr->ptr); + } nextEncodeWord: p = org; - Strcat(cnv, decodeWord(&org)); + Strcat(cnv, decodeWord(&org, charset)); if (org == p) { /* Convert failure */ Strcat_charp(cnv, org); return cnv; @@ -277,9 +296,14 @@ decodeMIME(char *orgstr) break; } } - else - Strcat_char(cnv, *(org++)); + else { + if (cnv != NULL) + Strcat_char(cnv, *org); + org++; + } } + if (cnv == NULL) + return orgstr; return cnv; } -- cgit v1.2.3