]> diplodocus.org Git - nmh/blobdiff - uip/mhparse.c
Change things so we only supply a form filename; most programs don't do
[nmh] / uip / mhparse.c
index 42312120c66da7c8fa29c728633ca9bb813ceffc..444bf7d563caccf7b3c6bab236cd028092736c0e 100644 (file)
@@ -23,8 +23,6 @@
 
 extern int debugsw;
 
-extern pid_t xpid;     /* mhshowsbr.c  */
-
 /* cache policies */
 extern int rcachesw;   /* mhcachesbr.c */
 extern int wcachesw;   /* mhcachesbr.c */
@@ -183,19 +181,6 @@ struct str2init str2methods[] = {
 };
 
 
-int
-pidcheck (int status)
-{
-    if ((status & 0xff00) == 0xff00 || (status & 0x007f) != SIGQUIT)
-       return status;
-
-    fflush (stdout);
-    fflush (stderr);
-    done (1);
-    return 1;
-}
-
-
 /*
  * Main entry point for parsing a MIME message or file.
  * It returns the Content structure for the top level
@@ -838,7 +823,7 @@ magic_skip:
             if (ct->c_dispo_type &&
                !get_param(ct->c_dispo_first, "filename", '_', 1)) {
                add_param(&ct->c_dispo_first, &ct->c_dispo_last, "filename",
-                         r1bindex(ci->ci_magic, '/'));
+                         r1bindex(ci->ci_magic, '/'), 0);
            }
         }
        else
@@ -2478,13 +2463,6 @@ openFTP (CT ct, char **file)
        return NOTOK;
     }
 
-    if (xpid) {
-       if (xpid < 0)
-           xpid = -xpid;
-       pidcheck (pidwait (xpid, NOTOK));
-       xpid = 0;
-    }
-
     /* Get the buffer ready to go */
     bp = buffer;
     buflen = sizeof(buffer);
@@ -2684,13 +2662,6 @@ openMail (CT ct, char **file)
        return NOTOK;
     }
 
-    if (xpid) {
-       if (xpid < 0)
-           xpid = -xpid;
-       pidcheck (pidwait (xpid, NOTOK));
-       xpid = 0;
-    }
-
     /* Get buffer ready to go */
     bp = buffer;
     buflen = sizeof(buffer);
@@ -2821,13 +2792,6 @@ openURL (CT ct, char **file)
        return NOTOK;
     }
 
-    if (xpid) {
-       if (xpid < 0)
-           xpid = -xpid;
-       pidcheck (pidwait (xpid, NOTOK));
-       xpid = 0;
-    }
-
     ce->ce_unlink = (*file == NULL);
     caching = 0;
     cachefile[0] = '\0';
@@ -3403,6 +3367,8 @@ parse_header_attrs (const char *filename, const char *fieldname,
                        free(charset);
                    return NOTOK;
                }
+
+               dp = vp;
            }
 
            /*
@@ -3412,8 +3378,7 @@ parse_header_attrs (const char *filename, const char *fieldname,
             * length so we can allocate the correct buffer size.
             */
 
-           for (dp = vp, len = 0; *vp != '\0' && !isspace((unsigned char) *vp);
-                                                               vp++) {
+           for (vp = dp, len = 0; istoken(*vp); vp++) {
                if (*vp == '%') {
                     if (*(vp + 1) == '\0' ||
                                !isxdigit((unsigned char) *(vp + 1)) ||
@@ -3437,7 +3402,7 @@ parse_header_attrs (const char *filename, const char *fieldname,
 
            up = valptr = mh_xmalloc(len + 1);
 
-           for (vp = dp; *vp != '\0' && !isspace((unsigned char) *vp); vp++) {
+           for (vp = dp; istoken(*vp); vp++) {
                if (*vp == '%') {
                    *up++ = decode_qp(*(vp + 1), *(vp + 2));
                    vp += 2;
@@ -3589,9 +3554,7 @@ bad_quote:
                pp->lang = lang;
            }
        } else {
-           pm = add_param(param_head, param_tail, nameptr, valptr);
-           free(nameptr);
-           free(valptr);
+           pm = add_param(param_head, param_tail, nameptr, valptr, 1);
            pm->pm_charset = charset;
            pm->pm_lang = lang;
        }
@@ -3636,11 +3599,9 @@ bad_quote:
 
        p[tlen] = '\0';
 
-       pm = add_param(param_head, param_tail, pp->name, p);
+       pm = add_param(param_head, param_tail, pp->name, p, 1);
        pm->pm_charset = pp->charset;
        pm->pm_lang = pp->lang;
-       free(pp->name);
-       free(p);
        pp2 = pp->next;
        free(pp);
        pp = pp2;
@@ -3650,6 +3611,25 @@ bad_quote:
     return OK;
 }
 
+/*
+ * Return the charset for a particular content type.  Return pointer is
+ * only valid until the next call to content_charset().
+ */
+
+char *
+content_charset (CT ct) {
+    static char *ret_charset = NULL;
+
+    if (ret_charset != NULL) {
+       free(ret_charset);
+    }
+
+    ret_charset = get_param(ct->c_ctinfo.ci_first_pm, "charset", '?', 0);
+
+    return ret_charset ? ret_charset : "US-ASCII";
+}
+
+
 /*
  * Create a string based on a list of output parameters.  Assume that this
  * parameter string will be appended to an existing header, so start out
@@ -4057,14 +4037,14 @@ normal_param(PM pm, char *output, size_t len, size_t valuelen,
  */
 
 PM
-add_param(PM *first, PM *last, const char *name, const char *value)
+add_param(PM *first, PM *last, char *name, char *value, int nocopy)
 {
     PM pm = mh_xmalloc(sizeof(*pm));
 
     memset(pm, 0, sizeof(*pm));
 
-    pm->pm_name = getcpy(name);
-    pm->pm_value = getcpy(value);
+    pm->pm_name = nocopy ? name : getcpy(name);
+    pm->pm_value = nocopy ? value : getcpy(value);
 
     if (*first) {
        (*last)->pm_next = pm;
@@ -4077,6 +4057,33 @@ add_param(PM *first, PM *last, const char *name, const char *value)
     return pm;
 }
 
+/*
+ * Either replace a current parameter with a new value, or add the parameter
+ * to the parameter linked list.
+ */
+
+PM
+replace_param(PM *first, PM *last, char *name, char *value, int nocopy)
+{
+    PM pm;
+
+    for (pm = *first; pm != NULL; pm = pm->pm_next) {
+       if (strcasecmp(name, pm->pm_name) == 0) {
+           /*
+            * If nocopy is set, it's assumed that we own both name
+            * and value.  We don't need name, so we discard it now.
+            */
+           if (nocopy)
+               free(name);
+           free(pm->pm_value);
+           pm->pm_value = nocopy ? value : getcpy(value);
+           return pm;
+       }
+    }
+
+    return add_param(first, last, name, value, nocopy);
+}
+
 /*
  * Retrieve a parameter value from a parameter linked list.  If the parameter
  * value needs converted to the local character set, do that now.
@@ -4112,7 +4119,10 @@ char *get_param_value(PM pm, char replace)
     int utf8;
     iconv_t cd;
     ICONV_CONST char *p;
+#else /* HAVE_ICONV */
+    char *p;
 #endif /* HAVE_ICONV */
+
     char *q;
 
     /*
@@ -4187,9 +4197,10 @@ char *get_param_value(PM pm, char replace)
     *q = '\0';
 
     return buffer;
-#endif /* HAVE_ICONV */
 
 noiconv:
+#endif /* HAVE_ICONV */
+
     /*
      * Take everything non-ASCII and substituite the replacement character
      */