]> diplodocus.org Git - nmh/blobdiff - uip/mhparse.c
Look for w3m if lynx isn't available for mhshow-show-text.
[nmh] / uip / mhparse.c
index 716a22f73144de4b8436883d9cfe87c9d2c41459..d12fbb30f5e394413ef052c55d4f677edfcaa87c 100644 (file)
@@ -80,6 +80,19 @@ struct k2v SubApplication[] = {
     { NULL,           APPLICATION_UNKNOWN }    /* this one must be last! */
 };
 
+/*
+ * Mapping of names of CTE types in mhbuild directives
+ */
+static struct k2v EncodingType[] = {
+    { "8bit",                  CE_8BIT },
+    { "qp",                    CE_QUOTED },
+    { "q-p",                   CE_QUOTED },
+    { "quoted-printable",      CE_QUOTED },
+    { "b64",                   CE_BASE64 },
+    { "base64",                        CE_BASE64 },
+    { NULL,                    0 },
+};
+
 
 /* mhcachesbr.c */
 int find_cache (CT, int, int *, char *, char *, int);
@@ -838,6 +851,47 @@ magic_skip:
            cp++;
     }
 
+    /*
+     * Get any extension directives (right now just the content transfer
+     * encoding, but maybe others) that we care about.
+     */
+
+    if (magic && *cp == '*') {
+       /*
+        * See if it's a CTE we match on
+        */
+       struct k2v *kv;
+
+       dp = ++cp;
+       while (*cp != '\0' && ! isspace((unsigned char) *cp))
+           cp++;
+
+       if (dp == cp) {
+           advise (NULL, "invalid null transfer encoding specification");
+           return NOTOK;
+       }
+
+       if (*cp != '\0')
+           *cp++ = '\0';
+
+       ct->c_reqencoding = CE_UNKNOWN;
+
+       for (kv = EncodingType; kv->kv_key; kv++) {
+           if (strcasecmp(kv->kv_key, dp) == 0) {
+               ct->c_reqencoding = kv->kv_value;
+               break;
+           }
+       }
+
+       if (ct->c_reqencoding == CE_UNKNOWN) {
+           advise (NULL, "invalid CTE specification: \"%s\"", dp);
+           return NOTOK;
+       }
+
+       while (isspace ((unsigned char) *cp))
+           cp++;
+    }
+
     /*
      * Check if anything is left over
      */
@@ -1623,7 +1677,7 @@ static int
 openBase64 (CT ct, char **file)
 {
     int        bitno, cc, digested;
-    int fd, len, skip, own_ct_fp = 0;
+    int fd, len, skip, own_ct_fp = 0, text = ct->c_type == CT_TEXT;
     uint32_t bits;
     unsigned char value, b;
     char *cp, *ep, buffer[BUFSIZ];
@@ -1735,17 +1789,20 @@ openBase64 (CT ct, char **file)
 test_end:
                    if ((bitno -= 6) < 0) {
                        b = (bits >> 16) & 0xff;
-                       putc ((char) b, ce->ce_fp);
+                       if (!text || b != '\r')
+                           putc ((char) b, ce->ce_fp);
                        if (digested)
                            MD5Update (&mdContext, &b, 1);
                        if (skip < 2) {
                            b = (bits >> 8) & 0xff;
-                           putc ((char) b, ce->ce_fp);
+                           if (! text || b != '\r')
+                               putc ((char) b, ce->ce_fp);
                            if (digested)
                                MD5Update (&mdContext, &b, 1);
                            if (skip < 1) {
                                b = bits & 0xff;
-                               putc ((char) b, ce->ce_fp);
+                               if (! text || b != '\r')
+                                   putc ((char) b, ce->ce_fp);
                                if (digested)
                                    MD5Update (&mdContext, &b, 1);
                            }