]> diplodocus.org Git - nmh/blobdiff - uip/mhparse.c
Handle the case in the test suite where wcwidth() can return different
[nmh] / uip / mhparse.c
index 91cc4116d27a2d1654606b995c71bf4ef8e89e96..93f1f26fc7f817035c5794bc64cc03e97b62c9c5 100644 (file)
@@ -22,8 +22,6 @@
 
 extern int debugsw;
 
-extern int endian;     /* mhmisc.c     */
-
 extern pid_t xpid;     /* mhshowsbr.c  */
 
 /* cache policies */
@@ -48,11 +46,7 @@ struct k2v SubText[] = {
     { NULL,       TEXT_UNKNOWN }    /* this one must be last! */
 };
 
-struct k2v Charset[] = {
-    { "us-ascii",   CHARSET_USASCII },
-    { "iso-8859-1", CHARSET_LATIN },
-    { NULL,         CHARSET_UNKNOWN }  /* this one must be last! */
-};
+/* Charset[] removed -- yozo.  Mon Oct  8 01:03:41 JST 2012 */
 
 /*
  * Structures for MULTIPART messages
@@ -1079,14 +1073,8 @@ InitText (CT ct)
 
     /* check if content specified a character set */
     if (*ap) {
-       /* match character set or set to CHARSET_UNKNOWN */
-       for (kv = Charset; kv->kv_key; kv++) {
-           if (!mh_strcasecmp (*ep, kv->kv_key)) {
-               chset = *ep;
-               break;
-           }
-       }
-       t->tx_charset = kv->kv_value;
+       chset = *ep;
+       t->tx_charset = CHARSET_SPECIFIED;
     } else {
        t->tx_charset = CHARSET_UNSPECIFIED;
     }
@@ -1133,9 +1121,22 @@ InitMultiPart (CT ct)
      */
     if (ct->c_encoding != CE_7BIT && ct->c_encoding != CE_8BIT
        && ct->c_encoding != CE_BINARY) {
+       /* Copy the Content-Transfer-Encoding header field body so we can
+          remove any trailing whitespace and leading blanks from it. */
+       char *cte = add (ct->c_celine ? ct->c_celine : "(null)", NULL);
+
+       bp = cte + strlen (cte) - 1;
+       while (bp >= cte && isspace (*bp)) *bp-- = '\0';
+       for (bp = cte; *bp && isblank (*bp); ++bp) continue;
+
        admonish (NULL,
-                 "\"%s/%s\" type in message %s must be encoded in 7bit, 8bit, or binary",
-                 ci->ci_type, ci->ci_subtype, ct->c_file);
+                 "\"%s/%s\" type in message %s must be encoded in\n"
+                 "7bit, 8bit, or binary, per RFC 2045 (6.4).  One workaround "
+                 "is to\nmanually edit the file and change the \"%s\"\n"
+                 "Content-Transfer-Encoding to one of those.  For now",
+                 ci->ci_type, ci->ci_subtype, ct->c_file, bp);
+       free (cte);
+
        return NOTOK;
     }
 
@@ -1728,8 +1729,8 @@ openBase64 (CT ct, char **file)
 {
     int        bitno, cc, digested;
     int fd, len, skip, own_ct_fp = 0;
-    unsigned long bits;
-    unsigned char value, *b, *b1, *b2, *b3;
+    uint32_t bits;
+    unsigned char value, b;
     unsigned char *cp, *ep;
     char buffer[BUFSIZ];
     /* sbeck -- handle suffixes */
@@ -1737,16 +1738,6 @@ openBase64 (CT ct, char **file)
     CE ce;
     MD5_CTX mdContext;
 
-    /* the decoder works on the least-significant three bytes of the bits integer,
-       but their position in memory depend on both endian-ness and size of 
-       long int... for little-endian architectures the size is irrelevant, for
-       big-endian archs it's crucial... ideally we'd adopt posix and use a64l instead
-       of this mess. */
-    b  = (unsigned char *) &bits;
-    b1 = &b[endian > 0 ? sizeof(bits)==8?5:1 : 2];
-    b2 = &b[endian > 0 ? sizeof(bits)==8?6:2 : 1];
-    b3 = &b[endian > 0 ? sizeof(bits)==8?7:3 : 0];
-
     ce = ct->c_cefile;
     if (ce->ce_fp) {
        fseek (ce->ce_fp, 0L, SEEK_SET);
@@ -1855,17 +1846,20 @@ openBase64 (CT ct, char **file)
                    bits |= value << bitno;
 test_end:
                    if ((bitno -= 6) < 0) {
-                       putc ((char) *b1, ce->ce_fp);
+                       b = (bits >> 16) & 0xff;
+                       putc ((char) b, ce->ce_fp);
                        if (digested)
-                           MD5Update (&mdContext, b1, 1);
+                           MD5Update (&mdContext, &b, 1);
                        if (skip < 2) {
-                           putc ((char) *b2, ce->ce_fp);
+                           b = (bits >> 8) & 0xff;
+                           putc ((char) b, ce->ce_fp);
                            if (digested)
-                               MD5Update (&mdContext, b2, 1);
+                               MD5Update (&mdContext, &b, 1);
                            if (skip < 1) {
-                               putc ((char) *b3, ce->ce_fp);
+                               b = bits & 0xff;
+                               putc ((char) b, ce->ce_fp);
                                if (digested)
-                                   MD5Update (&mdContext, b3, 1);
+                                   MD5Update (&mdContext, &b, 1);
                            }
                        }
 
@@ -2825,20 +2819,9 @@ static int
 readDigest (CT ct, char *cp)
 {
     int        bitno, skip;
-    unsigned long bits;
+    uint32_t bits;
     char *bp = cp;
     unsigned char *dp, value, *ep;
-    unsigned char *b, *b1, *b2, *b3;
-
-    /* the decoder works on the least-significant three bytes of the bits integer,
-       but their position in memory depend on both endian-ness and size of 
-       long int... for little-endian architectures the size is irrelevant, for
-       big-endian archs it's crucial... ideally we'd adopt posix and use a64l instead
-       of this mess. */
-    b  = (unsigned char *) &bits;
-    b1 = &b[endian > 0 ? sizeof(bits)==8?5:1 : 2];
-    b2 = &b[endian > 0 ? sizeof(bits)==8?6:2 : 1];
-    b3 = &b[endian > 0 ? sizeof(bits)==8?7:3 : 0];
 
     bitno = 18;
     bits = 0L;
@@ -2861,11 +2844,11 @@ test_end:
                if ((bitno -= 6) < 0) {
                    if (dp + (3 - skip) > ep)
                        goto invalid_digest;
-                   *dp++ = *b1;
+                   *dp++ = (bits >> 16) & 0xff;
                    if (skip < 2) {
-                       *dp++ = *b2;
+                       *dp++ = (bits >> 8) & 0xff;
                        if (skip < 1)
-                           *dp++ = *b3;
+                           *dp++ = bits & 0xff;
                    }
                    bitno = 18;
                    bits = 0L;