workaround a stupid issue in how decoding is performed in mutt *sigh*
[apps/madmutt.git] / lib-mime / rfc2047.c
index 8d444bc..a2629a9 100644 (file)
@@ -69,9 +69,9 @@ convert_string(const char *from, const char *f, ssize_t flen,
 
     obl = 4 * flen + 1;
     ob = buf = p_new(char, obl);
-    n = my_iconv(cd, &f, &flen, &ob, &obl);
+    n = mutt_iconv(cd, &f, &flen, &ob, &obl);
 
-    if (n < 0 || my_iconv(cd, 0, 0, &ob, &obl) < 0) {
+    if (n < 0 || mutt_iconv(cd, 0, 0, &ob, &obl) < 0) {
         int e = errno;
         iconv_close(cd);
         errno = e;
@@ -100,7 +100,7 @@ char *mutt_choose_charset(const char *fromcode, const char *charsets,
     const char *p = charsets;
 
     while (*p) {
-        char cset[SHORT_STRING];
+        char cset[STRING];
         const char *q;
         char *s;
         ssize_t slen, n;
@@ -266,14 +266,14 @@ static size_t try_block(const char *d, ssize_t dlen,
 
         ob = buf1;
 
-        if (my_iconv(cd, &ib, &ibl, &ob, &obl) < 0
-        ||  my_iconv(cd, 0, 0, &ob, &obl) < 0)
+        if (mutt_iconv(cd, &ib, &ibl, &ob, &obl) < 0
+        ||  mutt_iconv(cd, 0, 0, &ob, &obl) < 0)
         {
             assert (errno == E2BIG && ib > d);
             iconv_close(cd);
             return (ib - d == dlen) ? dlen : ib - d + 1;
         }
-        iconv_close (cd);
+        iconv_close(cd);
     } else {
         if (dlen > obl)
             return obl + 1;
@@ -331,10 +331,10 @@ encode_block(char *s, char *d, ssize_t dlen,
         cd = mutt_iconv_open(tocode, fromcode, 0);
         assert (cd != MUTT_ICONV_ERROR);
         ib = d, ibl = dlen, ob = buf1, obl = sizeof(buf1) - m_strlen(tocode);
-        n1 = my_iconv(cd, &ib, &ibl, &ob, &obl);
-        n2 = my_iconv(cd, 0, 0, &ob, &obl);
+        n1 = mutt_iconv(cd, &ib, &ibl, &ob, &obl);
+        n2 = mutt_iconv(cd, 0, 0, &ob, &obl);
         assert (n1 >= 0 && n2 >= 0);
-        iconv_close (cd);
+        iconv_close(cd);
         return (*encoder)(s, buf1, ob - buf1, tocode);
     } else {
         return (*encoder)(s, d, dlen, tocode);
@@ -561,13 +561,13 @@ static void _rfc2047_encode_string(char **pd, int encode_specials, int col)
     ssize_t elen;
     const char *charsets;
 
-    if (!Charset || !*pd)
+    if (!mod_cset.charset || !*pd)
         return;
 
-    charsets = m_strisempty(SendCharset) ? "UTF-8" : SendCharset;
+    charsets = m_strisempty(mod_cset.send_charset) ? "utf-8" : mod_cset.send_charset;
 
     rfc2047_encode(*pd, m_strlen(*pd), col,
-                   Charset, charsets, &e, &elen,
+                   mod_cset.charset, charsets, &e, &elen,
                    encode_specials ? RFC822Specials : NULL);
 
     p_delete(pd);
@@ -667,7 +667,7 @@ rfc2047_decode_word(char *d, size_t len, const char *p, const char *end)
     *q = '\0';
 
     if (*charset)
-        mutt_convert_string(&d0, charset, Charset, M_ICONV_HOOK_FROM);
+        mutt_convert_string(&d0, charset, mod_cset.charset, M_ICONV_HOOK_FROM);
     m_strcpy(d, len, d0);
     p_delete(&d0);
     return 0;
@@ -759,8 +759,6 @@ static ssize_t lwsrlen(const char *s, ssize_t n)
  */
 void rfc2047_decode(char **pd)
 {
-    const int strict_mime = option(OPTSTRICTMIME);
-
     const char *s = *pd;
     char *d0, *d;
     ssize_t dlen;
@@ -779,29 +777,28 @@ void rfc2047_decode(char **pd)
 
         if (!p) {
             /* no encoded words */
-            if (!strict_mime) {
-                ssize_t m, n;
-
-                n = m_strlen(s);
-                if (found_encoded && (m = lwslen(s, n)) != 0) {
-                    if (m != n)
-                        *d++ = ' ', dlen--;
-                    n -= m, s += m;
-                }
+            ssize_t m, n;
+
+            n = m_strlen(s);
+            if (found_encoded && (m = lwslen(s, n)) != 0) {
+                if (m != n)
+                    *d++ = ' ', dlen--;
+                n -= m, s += m;
+            }
 
-                if (mime_which_token(AssumedCharset, -1) == MIME_US_ASCII) {
-                    char *t;
-
-                    t = p_dupstr(s, n);
-                    if (mutt_convert_nonmime_string(&t) == 0) {
-                        d += m_strcpy(d, dlen, t);
-                    } else {
-                        d += m_strcpy(d, dlen, s);
-                    }
-                    p_delete(&t);
-                    break;
+            if (mime_which_token(mod_cset.assumed_charset, -1) == MIME_US_ASCII) {
+                char *t;
+
+                t = p_dupstr(s, n);
+                if (mutt_convert_nonmime_string(&t) == 0) {
+                    d += m_strcpy(d, dlen, t);
+                } else {
+                    d += m_strcpy(d, dlen, s);
                 }
+                p_delete(&t);
+                break;
             }
+
             d += m_strcpy(d, dlen, s);
             break;
         }
@@ -812,25 +809,18 @@ void rfc2047_decode(char **pd)
             n = (p - s);
             /* ignore spaces between encoded words
              * and linear white spaces between encoded word and *text */
-            if (!strict_mime) {
-                if (found_encoded && (m = lwslen(s, n)) != 0) {
-                    if (m != n)
-                        *d++ = ' ', dlen--;
-                    n -= m, s += m;
-                }
+            if (found_encoded && (m = lwslen(s, n)) != 0) {
+                if (m != n)
+                    *d++ = ' ', dlen--;
+                n -= m, s += m;
+            }
 
-                if ((m = n - lwsrlen(s, n)) != 0) {
-                    m  = m_strncpy(d, dlen, s, m);
-                    d += m;
-                    dlen -= m;
-                    if (m != n)
-                        *d++ = ' ', dlen--;
-                }
-            } else
-            if (!found_encoded || (ssize_t)strspn(s, " \t\r\n") != n) {
-                n  = m_strncpy(d, dlen, s, n);
-                d += n;
-                dlen -= n;
+            if ((m = n - lwsrlen(s, n)) != 0) {
+                m  = m_strncpy(d, dlen, s, m);
+                d += m;
+                dlen -= m;
+                if (m != n)
+                    *d++ = ' ', dlen--;
             }
         }