]> 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..371d0c926567e084418a74dcea4dfd1a40886778 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
      */