]> diplodocus.org Git - nmh/blobdiff - uip/mhparse.c
Use "mhparam etcdir" instead of hard-coded etc in build_nmh.
[nmh] / uip / mhparse.c
index f61edeb652830109158a41c499e478235ceac59d..548a9509683162dff4261ad99a4922a7d8848ac4 100644 (file)
@@ -115,7 +115,7 @@ static int get_comment (const char *, const char *, char **, char **);
 static int InitGeneric (CT);
 static int InitText (CT);
 static int InitMultiPart (CT);
-void reverse_parts (CT);
+static void reverse_parts (CT);
 static int InitMessage (CT);
 static int InitApplication (CT);
 static int init_encoding (CT, OpenCEFunc);
@@ -1277,7 +1277,7 @@ last_part:
  * reverse the order of the parts of a multipart/alternative
  */
 
-void
+static void
 reverse_parts (CT ct)
 {
     struct multipart *m = (struct multipart *) ct->c_ctparams;
@@ -1294,6 +1294,30 @@ reverse_parts (CT ct)
 }
 
 
+
+
+/* parse_mime() arranges alternates in reverse (priority) order.  This
+   function can be used to reverse them back.  This will put, for
+   example, a text/plain part before a text/html part in a
+   multipart/alternative part, for example, where it belongs. */
+void
+reverse_alternative_parts (CT ct) {
+    if (ct->c_type == CT_MULTIPART) {
+        struct multipart *m = (struct multipart *) ct->c_ctparams;
+        struct part *part;
+
+        if (ct->c_subtype == MULTI_ALTERNATE) {
+            reverse_parts (ct);
+        }
+
+        /* And call recursively on each part of a multipart. */
+        for (part = m->mp_parts; part; part = part->mp_next) {
+            reverse_alternative_parts (part->mp_part);
+        }
+    }
+}
+
+
 /*
  * MESSAGE
  */
@@ -1711,15 +1735,7 @@ openBase64 (CT ct, char **file)
 
     /* sbeck@cise.ufl.edu -- handle suffixes */
     ci = &ct->c_ctinfo;
-    snprintf (buffer, sizeof(buffer), "%s-suffix-%s/%s",
-              invo_name, ci->ci_type, ci->ci_subtype);
-    cp = context_find (buffer);
-    if (cp == NULL || *cp == '\0') {
-        snprintf (buffer, sizeof(buffer), "%s-suffix-%s", invo_name,
-                  ci->ci_type);
-        cp = context_find (buffer);
-    }
-    if (cp != NULL && *cp != '\0') {
+    if ((cp = context_find_by_type ("suffix", ci->ci_type, ci->ci_subtype))) {
        if (ce->ce_unlink) {
            /* Create temporary file with filename extension. */
            if ((ce->ce_file = m_mktemps(invo_name, cp, NULL, NULL)) == NULL) {
@@ -1921,7 +1937,6 @@ openQuoted (CT ct, char **file)
 {
     int        cc, digested, len, quoted, own_ct_fp = 0;
     char *cp, *ep;
-    char buffer[BUFSIZ];
     char *bufp = NULL;
     size_t buflen;
     ssize_t gotlen;
@@ -1953,15 +1968,7 @@ openQuoted (CT ct, char **file)
 
     /* sbeck@cise.ufl.edu -- handle suffixes */
     ci = &ct->c_ctinfo;
-    snprintf (buffer, sizeof(buffer), "%s-suffix-%s/%s",
-              invo_name, ci->ci_type, ci->ci_subtype);
-    cp = context_find (buffer);
-    if (cp == NULL || *cp == '\0') {
-        snprintf (buffer, sizeof(buffer), "%s-suffix-%s", invo_name,
-                  ci->ci_type);
-        cp = context_find (buffer);
-    }
-    if (cp != NULL && *cp != '\0') {
+    if ((cp = context_find_by_type ("suffix", ci->ci_type, ci->ci_subtype))) {
        if (ce->ce_unlink) {
            /* Create temporary file with filename extension. */
            if ((ce->ce_file = m_mktemps(invo_name, cp, NULL, NULL)) == NULL) {
@@ -2179,15 +2186,7 @@ open7Bit (CT ct, char **file)
 
     /* sbeck@cise.ufl.edu -- handle suffixes */
     ci = &ct->c_ctinfo;
-    snprintf (buffer, sizeof(buffer), "%s-suffix-%s/%s",
-              invo_name, ci->ci_type, ci->ci_subtype);
-    cp = context_find (buffer);
-    if (cp == NULL || *cp == '\0') {
-        snprintf (buffer, sizeof(buffer), "%s-suffix-%s", invo_name,
-                  ci->ci_type);
-        cp = context_find (buffer);
-    }
-    if (cp != NULL && *cp != '\0') {
+    if ((cp = context_find_by_type ("suffix", ci->ci_type, ci->ci_subtype))) {
        if (ce->ce_unlink) {
            /* Create temporary file with filename extension. */
            if ((ce->ce_file = m_mktemps(invo_name, cp, NULL, NULL)) == NULL) {
@@ -2275,7 +2274,9 @@ open7Bit (CT ct, char **file)
                cc = len;
            len -= cc;
 
-           fwrite (buffer, sizeof(*buffer), cc, ce->ce_fp);
+           if ((int) fwrite (buffer, sizeof(*buffer), cc, ce->ce_fp) < cc) {
+               advise ("open7Bit", "fwrite");
+           }
            if (ferror (ce->ce_fp)) {
                content_error (ce->ce_file, ct, "error writing to");
                goto clean_up;
@@ -2342,6 +2343,7 @@ openExternal (CT ct, CT cb, CE ce, char **file, int *fd)
        }
     }
 
+    *fd = fileno (ce->ce_fp);
     return OK;
 
 ready_already:
@@ -2409,7 +2411,9 @@ openFile (CT ct, char **file)
 
            while ((cc = fread (buffer, sizeof(*buffer), sizeof(buffer), gp))
                       > 0)
-               fwrite (buffer, sizeof(*buffer), cc, fp);
+               if ((int) fwrite (buffer, sizeof(*buffer), cc, fp) < cc) {
+                   advise ("openFile", "fwrite");
+               }
            fflush (fp);
 
            if (ferror (gp)) {
@@ -2618,7 +2622,9 @@ openFTP (CT ct, char **file)
 
                while ((cc= fread (buffer, sizeof(*buffer), sizeof(buffer), gp))
                           > 0)
-                   fwrite (buffer, sizeof(*buffer), cc, fp);
+                   if ((int) fwrite (buffer, sizeof(*buffer), cc, fp) < cc) {
+                       advise ("openFTP", "fwrite");
+                   }
                fflush (fp);
 
                if (ferror (gp)) {
@@ -2878,7 +2884,9 @@ openURL (CT ct, char **file)
 
                while ((cc = fread(buffer, sizeof(*buffer),
                                   sizeof(buffer), gp)) > 0)
-                   fwrite(buffer, sizeof(*buffer), cc, fp);
+                   if ((int) fwrite(buffer, sizeof(*buffer), cc, fp) < cc) {
+                       advise ("openURL", "fwrite");
+                   }
 
                fflush(fp);
 
@@ -3876,8 +3884,12 @@ param_len(PM pm, int index, size_t valueoff, int *encode, int *cont,
         * add them now.
         */
 
-       if (! pm->pm_charset)
+       if (! pm->pm_charset) {
            pm->pm_charset = getcpy(write_charset_8bit());
+           if (strcasecmp(pm->pm_charset, "US-ASCII") == 0)
+               adios(NULL, "8-bit characters in parameter \"%s\", but "
+                     "local character set is US-ASCII", pm->pm_name);
+       }
        if (! pm->pm_lang)
            pm->pm_lang = getcpy(NULL); /* Default to a blank lang tag */