X-Git-Url: http://git.madism.org/?a=blobdiff_plain;ds=sidebyside;f=lib-mime%2Frfc2047.c;h=06db45625f55f9756dc7e88c59eb6ad41772ae8f;hb=a743b55a20cbf3a33699fdb24dcb8638e878cc46;hp=1d4fa46ed803c01fa83c5b9d57b36e5777ea8de6;hpb=b4e1f0143e321a296e7b90c5b01051b94a8b20cc;p=apps%2Fmadmutt.git diff --git a/lib-mime/rfc2047.c b/lib-mime/rfc2047.c index 1d4fa46..06db456 100644 --- a/lib-mime/rfc2047.c +++ b/lib-mime/rfc2047.c @@ -37,6 +37,7 @@ #include "charset.h" #include "thread.h" +#include #include #include #include @@ -49,7 +50,6 @@ #ifdef NDEBUG #define assert(x) #else -#include #endif #define ENCWORD_LEN_MAX 75 @@ -75,7 +75,6 @@ convert_string(const char *from, const char *f, ssize_t flen, iconv_t cd; char *buf, *ob; ssize_t obl, n; - int e; cd = mutt_iconv_open(to, from, 0); @@ -87,38 +86,47 @@ convert_string(const char *from, const char *f, ssize_t flen, n = my_iconv(cd, &f, &flen, &ob, &obl); if (n < 0 || my_iconv(cd, 0, 0, &ob, &obl) < 0) { - e = errno; - p_delete(&buf); - iconv_close (cd); + int e = errno; + iconv_close(cd); errno = e; + p_delete(&buf); return -1; } + iconv_close(cd); *ob = '\0'; *tlen = ob - buf; - - p_realloc(&buf, ob - buf + 1); - *t = buf; - iconv_close (cd); + *t = buf; return n; } +/* choose the shortest encoding for u */ char *mutt_choose_charset(const char *fromcode, const char *charsets, - char *u, ssize_t ulen, char **d, ssize_t *dlen) + char *u, ssize_t ulen, char **dst, ssize_t *dlen) { - char canonical_buff[LONG_STRING]; - char *e = 0, *tocode = 0; - ssize_t elen = 0, bestn = 0; - const char *p, *q; + char *res = NULL; + ssize_t reslen = 0; - for (p = charsets; p; p = q ? q + 1 : 0) { - char *s, *t; - ssize_t slen, n; + char *tocode = NULL; + ssize_t bestn = 0; - q = strchr (p, ':'); + const char *p = charsets; - n = q ? q - p : m_strlen(p); + while (*p) { + char cset[SHORT_STRING]; + ssize_t slen, n; + const char *q; + char *s; + + q = strchr(p, ':'); + if (q) { + n = m_strncpy(cset, sizeof(cset), p, q - p); + p = ++q; + } else { + n = m_strcpy(cset, sizeof(cset), p); + p += n; + } if (!n || /* Assume that we never need more than 12 characters of @@ -126,39 +134,36 @@ char *mutt_choose_charset(const char *fromcode, const char *charsets, n > (ENCWORD_LEN_MAX - ENCWORD_LEN_MIN + 2 - 12)) continue; - t = p_dupstr(p, n); - - n = convert_string(fromcode, u, ulen, t, &s, &slen); + n = convert_string(fromcode, u, ulen, cset, &s, &slen); if (n < 0) continue; if (!tocode || n < bestn) { + m_strreplace(&tocode, cset); bestn = n; - p_delete(&tocode); - tocode = t; - if (d) { - p_delete(&e); - e = s; - } else { - p_delete(&s); - } - elen = slen; + + p_delete(&res); + res = s; + reslen = slen; if (!bestn) break; } else { - p_delete(&t); p_delete(&s); } } if (tocode) { - if (d) - *d = e; - if (dlen) - *dlen = elen; + char buf[LONG_STRING]; + + if (dst && dlen) { + *dst = res; + *dlen = reslen; + } else { + p_delete(&res); + } - mutt_canonical_charset(canonical_buff, sizeof(canonical_buff), tocode); - m_strreplace(&tocode, canonical_buff); + mutt_canonical_charset(buf, sizeof(buf), tocode); + m_strreplace(&tocode, buf); } return tocode; @@ -419,7 +424,8 @@ static int rfc2047_encode (const char *d, ssize_t dlen, int col, /* Choose target charset. */ tocode = fromcode; if (icode) { - if ((tocode1 = mutt_choose_charset (icode, charsets, u, ulen, 0, 0))) + if ((tocode1 = mutt_choose_charset(icode, charsets, u, ulen, + NULL, NULL))) tocode = tocode1; else ret = 2, icode = 0; @@ -747,7 +753,7 @@ void rfc2047_decode (char **pd) } if (ascii_strcasecmp (AssumedCharset, "us-ascii")) { char *t; - size_t tlen; + ssize_t tlen; t = p_dupstr(s, n); if (mutt_convert_nonmime_string (&t) == 0) { @@ -769,7 +775,7 @@ void rfc2047_decode (char **pd) } if (p != s) { - n = (size_t) (p - s); + n = (p - s); /* ignore spaces between encoded words * and linear white spaces between encoded word and *text */ if (!option (OPTSTRICTMIME)) { @@ -812,32 +818,31 @@ void rfc2047_decode (char **pd) str_adjust (pd); } -void rfc2047_decode_adrlist (address_t * a) +void rfc2047_decode_adrlist(address_t *a) { while (a) { if (a->personal) - rfc2047_decode (&a->personal); + rfc2047_decode(&a->personal); a = a->next; } } -void rfc2047_decode_envelope (ENVELOPE* e) { - - if (!e) - return; +void rfc2047_decode_envelope(ENVELOPE* e) +{ + assert (e); /* do RFC2047 decoding */ - rfc2047_decode_adrlist (e->from); - rfc2047_decode_adrlist (e->to); - rfc2047_decode_adrlist (e->cc); - rfc2047_decode_adrlist (e->bcc); - rfc2047_decode_adrlist (e->reply_to); - rfc2047_decode_adrlist (e->mail_followup_to); - rfc2047_decode_adrlist (e->return_path); - rfc2047_decode_adrlist (e->sender); + rfc2047_decode_adrlist(e->from); + rfc2047_decode_adrlist(e->to); + rfc2047_decode_adrlist(e->cc); + rfc2047_decode_adrlist(e->bcc); + rfc2047_decode_adrlist(e->reply_to); + rfc2047_decode_adrlist(e->mail_followup_to); + rfc2047_decode_adrlist(e->return_path); + rfc2047_decode_adrlist(e->sender); if (e->subject) { - rfc2047_decode (&e->subject); - mutt_adjust_subject (e); + rfc2047_decode(&e->subject); + mutt_adjust_subject(e); } }