]> diplodocus.org Git - nmh/blobdiff - uip/mhparse.c
context_replace.c: Move interface to own file.
[nmh] / uip / mhparse.c
index 4b5d16be5a080eaaec59e63225f178949cc19c14..9b8eb973f3e1b765b57973188d35f5a9ec5a6490 100644 (file)
@@ -5,20 +5,26 @@
  * complete copyright information.
  */
 
  * complete copyright information.
  */
 
-#include <h/mh.h>
+#include "h/mh.h"
+#include "sbr/context_find.h"
+#include "sbr/pidstatus.h"
+#include "sbr/arglist.h"
+#include "sbr/error.h"
 #include <fcntl.h>
 #include <fcntl.h>
-#include <h/md5.h>
-#include <h/mts.h>
-#include <h/tws.h>
-#include <h/mime.h>
-#include <h/mhparse.h>
-#include <h/utils.h>
-#include <h/mhcachesbr.h>
-#include "../sbr/m_mktemp.h"
+#include "h/md5.h"
+#include "h/mts.h"
+#include "h/tws.h"
+#include "h/mime.h"
+#include "h/mhparse.h"
+#include "h/utils.h"
+#include "mhmisc.h"
+#include "h/mhcachesbr.h"
+#include "sbr/m_mktemp.h"
 #include "mhfree.h"
 #ifdef HAVE_ICONV
 # include <iconv.h>
 #endif /* HAVE_ICONV */
 #include "mhfree.h"
 #ifdef HAVE_ICONV
 # include <iconv.h>
 #endif /* HAVE_ICONV */
+#include "sbr/base64.h"
 
 
 extern int debugsw;
 
 
 extern int debugsw;
@@ -33,19 +39,18 @@ int checksw = 0;    /* check Content-MD5 field */
  * 3) Suppress the warning about extraneous trailing ';' in header parameter
  *    lists.
  */
  * 3) Suppress the warning about extraneous trailing ';' in header parameter
  *    lists.
  */
-int skip_mp_cte_check;
-int suppress_bogus_mp_content_warning;
-int bogus_mp_content;
-int suppress_extraneous_trailing_semicolon_warning;
+bool skip_mp_cte_check;
+bool suppress_bogus_mp_content_warning;
+bool bogus_mp_content;
+bool suppress_extraneous_trailing_semicolon_warning;
 
 /*
  * By default, suppress warning about multiple MIME-Version header fields.
  */
 
 /*
  * By default, suppress warning about multiple MIME-Version header fields.
  */
-int suppress_multiple_mime_version_warning = 1;
+bool suppress_multiple_mime_version_warning = true;
 
 /* list of preferred type/subtype pairs, for -prefer */
 
 /* list of preferred type/subtype pairs, for -prefer */
-char *preferred_types[NPREFS],
-     *preferred_subtypes[NPREFS];
+mime_type_subtype mime_preference[NPREFS];
 int npreferred;
 
 
 int npreferred;
 
 
@@ -106,11 +111,6 @@ static struct k2v EncodingType[] = {
 };
 
 
 };
 
 
-/* mhmisc.c */
-int part_ok (CT);
-int type_ok (CT, int);
-void content_error (char *, CT, char *, ...);
-
 /*
  * static prototypes
  */
 /*
  * static prototypes
  */
@@ -173,7 +173,7 @@ struct str2init str2ces[] = {
 /*
  * NOTE WELL: si_key MUST NOT have value of NOTOK
  *
 /*
  * NOTE WELL: si_key MUST NOT have value of NOTOK
  *
- * si_key is 1 if access method is anonymous.
+ * si_val is 1 if access method is anonymous.
  */
 struct str2init str2methods[] = {
     { "afs",         1,        InitFile },
  */
 struct str2init str2methods[] = {
     { "afs",         1,        InitFile },
@@ -202,7 +202,7 @@ parse_mime (char *file)
     size_t n;
     struct stat statbuf;
 
     size_t n;
     struct stat statbuf;
 
-    bogus_mp_content = 0;
+    bogus_mp_content = false;
 
     /*
      * Check if file is actually standard input
 
     /*
      * Check if file is actually standard input
@@ -300,7 +300,7 @@ get_content (FILE *in, char *file, int toplevel)
     /* allocate the content structure */
     NEW0(ct);
     ct->c_fp = in;
     /* allocate the content structure */
     NEW0(ct);
     ct->c_fp = in;
-    ct->c_file = add (file, NULL);
+    ct->c_file = mh_xstrdup(FENDNULL(file));
     ct->c_begin = ftell (ct->c_fp) + 1;
 
     /*
     ct->c_begin = ftell (ct->c_fp) + 1;
 
     /*
@@ -365,10 +365,10 @@ get_content (FILE *in, char *file, int toplevel)
 
        case LENERR:
        case FMTERR:
 
        case LENERR:
        case FMTERR:
-           adios (NULL, "message format error in component #%d", compnum);
+           die("message format error in component #%d", compnum);
 
        default:
 
        default:
-           adios (NULL, "getfld() returned %d", state);
+           die("getfld() returned %d", state);
        }
 
        /* break out of the loop */
        }
 
        /* break out of the loop */
@@ -391,7 +391,7 @@ get_content (FILE *in, char *file, int toplevel)
            char c, *cp, *dp;
            char *vrsn;
 
            char c, *cp, *dp;
            char *vrsn;
 
-           vrsn = add (hp->value, NULL);
+           vrsn = mh_xstrdup(FENDNULL(hp->value));
 
            /* Now, cleanup this field */
            cp = vrsn;
 
            /* Now, cleanup this field */
            cp = vrsn;
@@ -474,7 +474,7 @@ get_content (FILE *in, char *file, int toplevel)
            }
 
            /* get copy of this field */
            }
 
            /* get copy of this field */
-           ct->c_celine = cp = add (hp->value, NULL);
+           ct->c_celine = cp = mh_xstrdup(FENDNULL(hp->value));
 
            while (isspace ((unsigned char) *cp))
                cp++;
 
            while (isspace ((unsigned char) *cp))
                cp++;
@@ -512,7 +512,7 @@ get_content (FILE *in, char *file, int toplevel)
                goto next_header;
            }
 
                goto next_header;
            }
 
-           ep = cp = add (hp->value, NULL);    /* get a copy */
+           ep = cp = mh_xstrdup(FENDNULL(hp->value)); /* get a copy */
 
            while (isspace ((unsigned char) *cp))
                cp++;
 
            while (isspace ((unsigned char) *cp))
                cp++;
@@ -642,7 +642,7 @@ get_ctinfo (char *cp, CT ct, int magic)
     ci = &ct->c_ctinfo;
 
     /* store copy of Content-Type line */
     ci = &ct->c_ctinfo;
 
     /* store copy of Content-Type line */
-    cp = ct->c_ctline = add (cp, NULL);
+    cp = ct->c_ctline = mh_xstrdup(FENDNULL(cp));
 
     while (isspace ((unsigned char) *cp))      /* trim leading spaces */
        cp++;
 
     while (isspace ((unsigned char) *cp))      /* trim leading spaces */
        cp++;
@@ -733,7 +733,7 @@ magic_skip:
      * Get any <Content-Id> given in buffer
      */
     if (magic && *cp == '<') {
      * Get any <Content-Id> given in buffer
      */
     if (magic && *cp == '<') {
-        mh_xfree(ct->c_id);
+        free(ct->c_id);
         ct->c_id = NULL;
        if (!(dp = strchr(ct->c_id = ++cp, '>'))) {
            inform("invalid ID in message %s", ct->c_file);
         ct->c_id = NULL;
        if (!(dp = strchr(ct->c_id = ++cp, '>'))) {
            inform("invalid ID in message %s", ct->c_file);
@@ -891,7 +891,7 @@ get_dispo (char *cp, CT ct, int buildflag)
      * time.
      */
 
      * time.
      */
 
-    dispoheader = cp = add(cp, NULL);
+    dispoheader = cp = mh_xstrdup(FENDNULL(cp));
 
     while (isspace ((unsigned char) *cp))      /* trim leading spaces */
        cp++;
 
     while (isspace ((unsigned char) *cp))      /* trim leading spaces */
        cp++;
@@ -1086,7 +1086,7 @@ InitText (CT ct)
 static int
 InitMultiPart (CT ct)
 {
 static int
 InitMultiPart (CT ct)
 {
-    int        inout;
+    bool inout;
     long last, pos;
     char *cp, *dp;
     PM pm;
     long last, pos;
     char *cp, *dp;
     PM pm;
@@ -1112,7 +1112,7 @@ InitMultiPart (CT ct)
 
        bp = cte + strlen (cte) - 1;
        while (bp >= cte && isspace ((unsigned char) *bp)) *bp-- = '\0';
 
        bp = cte + strlen (cte) - 1;
        while (bp >= cte && isspace ((unsigned char) *bp)) *bp-- = '\0';
-       for (bp = cte; *bp && isblank ((unsigned char) *bp); ++bp) continue;
+       for (bp = cte; isblank((unsigned char)*bp); ++bp) continue;
 
        inform("\"%s/%s\" type in message %s must be encoded in\n"
            "7bit, 8bit, or binary, per RFC 2045 (6.4).  "
 
        inform("\"%s/%s\" type in message %s must be encoded in\n"
            "7bit, 8bit, or binary, per RFC 2045 (6.4).  "
@@ -1179,7 +1179,7 @@ InitMultiPart (CT ct)
     last = ct->c_end;
     next = &m->mp_parts;
     part = NULL;
     last = ct->c_end;
     next = &m->mp_parts;
     part = NULL;
-    inout = 1;
+    inout = true;
 
     while ((gotlen = getline(&bufp, &buflen, fp)) != -1) {
        if (pos > last)
 
     while ((gotlen = getline(&bufp, &buflen, fp)) != -1) {
        if (pos > last)
@@ -1206,10 +1206,10 @@ next_part:
            part->mp_part = p;
            pos = p->c_begin;
            fseek (fp, pos, SEEK_SET);
            part->mp_part = p;
            pos = p->c_begin;
            fseek (fp, pos, SEEK_SET);
-           inout = 0;
+           inout = false;
        } else {
            if (strcmp (bufp + 2, m->mp_start) == 0) {
        } else {
            if (strcmp (bufp + 2, m->mp_start) == 0) {
-               inout = 1;
+               inout = true;
 end_part:
                p = part->mp_part;
                p->c_end = ftell(fp) - (gotlen + 1);
 end_part:
                p = part->mp_part;
                p->c_end = ftell(fp) - (gotlen + 1);
@@ -1227,7 +1227,7 @@ end_part:
     if (! suppress_bogus_mp_content_warning) {
         inform("bogus multipart content in message %s", ct->c_file);
     }
     if (! suppress_bogus_mp_content_warning) {
         inform("bogus multipart content in message %s", ct->c_file);
     }
-    bogus_mp_content = 1;
+    bogus_mp_content = true;
 
     if (!inout && part) {
        p = part->mp_part;
 
     if (!inout && part) {
        p = part->mp_part;
@@ -1320,7 +1320,7 @@ reverse_parts (CT ct)
 }
 
 static void
 }
 
 static void
-move_preferred_part (CT ct, char *type, char *subtype)
+move_preferred_part(CT ct, mime_type_subtype *pref)
 {
     struct multipart *m = (struct multipart *) ct->c_ctparams;
     struct part *part, *prev, *head, *nhead, *ntail;
 {
     struct multipart *m = (struct multipart *) ct->c_ctparams;
     struct part *part, *prev, *head, *nhead, *ntail;
@@ -1344,8 +1344,9 @@ move_preferred_part (CT ct, char *type, char *subtype)
     part = head->mp_next;
     while (part != NULL) {
        ci = &part->mp_part->c_ctinfo;
     part = head->mp_next;
     while (part != NULL) {
        ci = &part->mp_part->c_ctinfo;
-       if (!strcasecmp(ci->ci_type, type) &&
-               (!subtype || !strcasecmp(ci->ci_subtype, subtype))) {
+       if (!strcasecmp(ci->ci_type, pref->type) &&
+            (!pref->subtype ||
+                !strcasecmp(ci->ci_subtype, pref->subtype))) {
            prev->mp_next = part->mp_next;
            part->mp_next = NULL;
            ntail->mp_next = part;
            prev->mp_next = part->mp_next;
            part->mp_next = NULL;
            ntail->mp_next = part;
@@ -1358,7 +1359,6 @@ move_preferred_part (CT ct, char *type, char *subtype)
     }
     ntail->mp_next = head->mp_next;
     m->mp_parts = nhead->mp_next;
     }
     ntail->mp_next = head->mp_next;
     m->mp_parts = nhead->mp_next;
-
 }
 
 /*
 }
 
 /*
@@ -1370,8 +1370,8 @@ static void
 prefer_parts(CT ct)
 {
     int i;
 prefer_parts(CT ct)
 {
     int i;
-    for (i = npreferred-1; i >= 0; i--)
-       move_preferred_part(ct, preferred_types[i], preferred_subtypes[i]);
+    for (i = 0; i < npreferred; i++)
+       move_preferred_part(ct, mime_preference + i);
 }
 
 
 }
 
 
@@ -1381,7 +1381,8 @@ prefer_parts(CT ct)
    example, a text/plain part before a text/html part in a
    multipart/alternative part, for example, where it belongs. */
 void
    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) {
+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_type == CT_MULTIPART) {
         struct multipart *m = (struct multipart *) ct->c_ctparams;
         struct part *part;
@@ -1436,7 +1437,7 @@ InitMessage (CT ct)
                /* scan for parameters "id", "number", and "total" */
                for (pm = ci->ci_first_pm; pm; pm = pm->pm_next) {
                    if (!strcasecmp (pm->pm_name, "id")) {
                /* scan for parameters "id", "number", and "total" */
                for (pm = ci->ci_first_pm; pm; pm = pm->pm_next) {
                    if (!strcasecmp (pm->pm_name, "id")) {
-                       p->pm_partid = add (pm->pm_value, NULL);
+                       p->pm_partid = mh_xstrdup(FENDNULL(pm->pm_value));
                        continue;
                    }
                    if (!strcasecmp (pm->pm_name, "number")) {
                        continue;
                    }
                    if (!strcasecmp (pm->pm_name, "number")) {
@@ -1515,7 +1516,7 @@ invalid_param:
                                adios ("failed", "fread");
 
                            case OK:
                                adios ("failed", "fread");
 
                            case OK:
-                               adios (NULL, "unexpected EOF from fread");
+                               die("unexpected EOF from fread");
 
                            default:
                                bp += cc, size -= cc;
 
                            default:
                                bp += cc, size -= cc;
@@ -1718,11 +1719,11 @@ size_encoding (CT ct)
     }
 
     if (ct->c_encoding == CE_EXTERNAL)
     }
 
     if (ct->c_encoding == CE_EXTERNAL)
-       return (ct->c_end - ct->c_begin);       
+       return ct->c_end - ct->c_begin; 
 
     file = NULL;
     if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK)
 
     file = NULL;
     if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK)
-       return (ct->c_end - ct->c_begin);
+       return ct->c_end - ct->c_begin;
 
     if (fstat (fd, &st) != NOTOK)
        size = (long) st.st_size;
 
     if (fstat (fd, &st) != NOTOK)
        size = (long) st.st_size;
@@ -1749,7 +1750,8 @@ static int
 openBase64 (CT ct, char **file)
 {
     ssize_t cc, len;
 openBase64 (CT ct, char **file)
 {
     ssize_t cc, len;
-    int fd, own_ct_fp = 0;
+    int fd;
+    bool own_ct_fp = false;
     char *cp, *buffer = NULL;
     /* sbeck -- handle suffixes */
     CI ci;
     char *cp, *buffer = NULL;
     /* sbeck -- handle suffixes */
     CI ci;
@@ -1784,7 +1786,7 @@ openBase64 (CT ct, char **file)
        if (ce->ce_unlink) {
            /* Create temporary file with filename extension. */
            if ((ce->ce_file = m_mktemps(invo_name, cp, NULL, NULL)) == NULL) {
        if (ce->ce_unlink) {
            /* Create temporary file with filename extension. */
            if ((ce->ce_file = m_mktemps(invo_name, cp, NULL, NULL)) == NULL) {
-               adios(NULL, "unable to create temporary file in %s",
+               die("unable to create temporary file in %s",
                      get_temp_dir());
            }
        } else {
                      get_temp_dir());
            }
        } else {
@@ -1793,7 +1795,7 @@ openBase64 (CT ct, char **file)
     } else if (*file == NULL) {
        char *tempfile;
        if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) {
     } else if (*file == NULL) {
        char *tempfile;
        if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) {
-           adios(NULL, "unable to create temporary file in %s",
+           die("unable to create temporary file in %s",
                  get_temp_dir());
        }
        ce->ce_file = mh_xstrdup(tempfile);
                  get_temp_dir());
        }
        ce->ce_file = mh_xstrdup(tempfile);
@@ -1805,7 +1807,7 @@ openBase64 (CT ct, char **file)
     }
 
     if ((len = ct->c_end - ct->c_begin) < 0)
     }
 
     if ((len = ct->c_end - ct->c_begin) < 0)
-       adios (NULL, "internal error(1)");
+       die("internal error(1)");
 
     buffer = mh_xmalloc (len + 1);
 
 
     buffer = mh_xmalloc (len + 1);
 
@@ -1814,7 +1816,7 @@ openBase64 (CT ct, char **file)
            content_error (ct->c_file, ct, "unable to open for reading");
            return NOTOK;
        }
            content_error (ct->c_file, ct, "unable to open for reading");
            return NOTOK;
        }
-       own_ct_fp = 1;
+       own_ct_fp = true;
     }
 
     lseek (fd = fileno (ct->c_fp), (off_t) ct->c_begin, SEEK_SET);
     }
 
     lseek (fd = fileno (ct->c_fp), (off_t) ct->c_begin, SEEK_SET);
@@ -1932,7 +1934,8 @@ InitQuoted (CT ct)
 static int
 openQuoted (CT ct, char **file)
 {
 static int
 openQuoted (CT ct, char **file)
 {
-    int        cc, digested, len, quoted, own_ct_fp = 0;
+    int        cc, digested, len, quoted;
+    bool own_ct_fp = false;
     char *cp, *ep;
     char *bufp = NULL;
     size_t buflen;
     char *cp, *ep;
     char *bufp = NULL;
     size_t buflen;
@@ -1969,7 +1972,7 @@ openQuoted (CT ct, char **file)
        if (ce->ce_unlink) {
            /* Create temporary file with filename extension. */
            if ((ce->ce_file = m_mktemps(invo_name, cp, NULL, NULL)) == NULL) {
        if (ce->ce_unlink) {
            /* Create temporary file with filename extension. */
            if ((ce->ce_file = m_mktemps(invo_name, cp, NULL, NULL)) == NULL) {
-               adios(NULL, "unable to create temporary file in %s",
+               die("unable to create temporary file in %s",
                      get_temp_dir());
            }
        } else {
                      get_temp_dir());
            }
        } else {
@@ -1978,7 +1981,7 @@ openQuoted (CT ct, char **file)
     } else if (*file == NULL) {
        char *tempfile;
        if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) {
     } else if (*file == NULL) {
        char *tempfile;
        if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) {
-           adios(NULL, "unable to create temporary file in %s",
+           die("unable to create temporary file in %s",
                  get_temp_dir());
        }
        ce->ce_file = mh_xstrdup(tempfile);
                  get_temp_dir());
        }
        ce->ce_file = mh_xstrdup(tempfile);
@@ -1990,23 +1993,20 @@ openQuoted (CT ct, char **file)
     }
 
     if ((len = ct->c_end - ct->c_begin) < 0)
     }
 
     if ((len = ct->c_end - ct->c_begin) < 0)
-       adios (NULL, "internal error(2)");
+       die("internal error(2)");
 
     if (! ct->c_fp) {
        if ((ct->c_fp = fopen (ct->c_file, "r")) == NULL) {
            content_error (ct->c_file, ct, "unable to open for reading");
            return NOTOK;
        }
 
     if (! ct->c_fp) {
        if ((ct->c_fp = fopen (ct->c_file, "r")) == NULL) {
            content_error (ct->c_file, ct, "unable to open for reading");
            return NOTOK;
        }
-       own_ct_fp = 1;
+       own_ct_fp = true;
     }
 
     if ((digested = ct->c_digested))
        MD5Init (&mdContext);
 
     quoted = 0;
     }
 
     if ((digested = ct->c_digested))
        MD5Init (&mdContext);
 
     quoted = 0;
-#ifdef lint
-    mask = 0;
-#endif
 
     fseek (ct->c_fp, ct->c_begin, SEEK_SET);
     while (len > 0) {
 
     fseek (ct->c_fp, ct->c_begin, SEEK_SET);
     while (len > 0) {
@@ -2107,7 +2107,7 @@ openQuoted (CT ct, char **file)
        unsigned char digest[16];
 
        MD5Final (digest, &mdContext);
        unsigned char digest[16];
 
        MD5Final (digest, &mdContext);
-       if (memcmp((char *) digest, (char *) ct->c_digest,
+       if (memcmp(digest, ct->c_digest,
                   sizeof digest))
            content_error (NULL, ct,
                           "content integrity suspect (digest mismatch) -- continuing");
                   sizeof digest))
            content_error (NULL, ct,
                           "content integrity suspect (digest mismatch) -- continuing");
@@ -2155,7 +2155,8 @@ Init7Bit (CT ct)
 int
 open7Bit (CT ct, char **file)
 {
 int
 open7Bit (CT ct, char **file)
 {
-    int        cc, fd, len, own_ct_fp = 0;
+    int        cc, fd, len;
+    bool own_ct_fp = false;
     char buffer[BUFSIZ];
     /* sbeck -- handle suffixes */
     char *cp;
     char buffer[BUFSIZ];
     /* sbeck -- handle suffixes */
     char *cp;
@@ -2188,7 +2189,7 @@ open7Bit (CT ct, char **file)
        if (ce->ce_unlink) {
            /* Create temporary file with filename extension. */
            if ((ce->ce_file = m_mktemps(invo_name, cp, NULL, NULL)) == NULL) {
        if (ce->ce_unlink) {
            /* Create temporary file with filename extension. */
            if ((ce->ce_file = m_mktemps(invo_name, cp, NULL, NULL)) == NULL) {
-               adios(NULL, "unable to create temporary file in %s",
+               die("unable to create temporary file in %s",
                      get_temp_dir());
            }
        } else {
                      get_temp_dir());
            }
        } else {
@@ -2197,7 +2198,7 @@ open7Bit (CT ct, char **file)
     } else if (*file == NULL) {
        char *tempfile;
        if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) {
     } else if (*file == NULL) {
        char *tempfile;
        if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) {
-           adios(NULL, "unable to create temporary file in %s",
+           die("unable to create temporary file in %s",
                  get_temp_dir());
        }
        ce->ce_file = mh_xstrdup(tempfile);
                  get_temp_dir());
        }
        ce->ce_file = mh_xstrdup(tempfile);
@@ -2214,7 +2215,7 @@ open7Bit (CT ct, char **file)
 
        len = 0;
        fprintf (ce->ce_fp, "%s: %s/%s", TYPE_FIELD, ci->ci_type, ci->ci_subtype);
 
        len = 0;
        fprintf (ce->ce_fp, "%s: %s/%s", TYPE_FIELD, ci->ci_type, ci->ci_subtype);
-       len += strlen (TYPE_FIELD) + 2 + strlen (ci->ci_type)
+       len += LEN(TYPE_FIELD) + 2 + strlen (ci->ci_type)
            + 1 + strlen (ci->ci_subtype);
        buffer = output_params(len, ci->ci_first_pm, &len, 0);
 
            + 1 + strlen (ci->ci_subtype);
        buffer = output_params(len, ci->ci_first_pm, &len, 0);
 
@@ -2246,14 +2247,14 @@ open7Bit (CT ct, char **file)
     }
 
     if ((len = ct->c_end - ct->c_begin) < 0)
     }
 
     if ((len = ct->c_end - ct->c_begin) < 0)
-       adios (NULL, "internal error(3)");
+       die("internal error(3)");
 
     if (! ct->c_fp) {
        if ((ct->c_fp = fopen (ct->c_file, "r")) == NULL) {
            content_error (ct->c_file, ct, "unable to open for reading");
            return NOTOK;
        }
 
     if (! ct->c_fp) {
        if ((ct->c_fp = fopen (ct->c_file, "r")) == NULL) {
            content_error (ct->c_file, ct, "unable to open for reading");
            return NOTOK;
        }
-       own_ct_fp = 1;
+       own_ct_fp = true;
     }
 
     lseek (fd = fileno (ct->c_fp), (off_t) ct->c_begin, SEEK_SET);
     }
 
     lseek (fd = fileno (ct->c_fp), (off_t) ct->c_begin, SEEK_SET);
@@ -2330,7 +2331,7 @@ openExternal (CT ct, CT cb, CE ce, char **file, int *fd)
        goto ready_already;
     }
 
        goto ready_already;
     }
 
-    if (find_cache (ct, rcachesw, (int *) 0, cb->c_id,
+    if (find_cache(ct, rcachesw, NULL, cb->c_id,
                cachefile, sizeof(cachefile)) != NOTOK) {
        if ((ce->ce_fp = fopen (cachefile, "r"))) {
            ce->ce_file = mh_xstrdup(cachefile);
                cachefile, sizeof(cachefile)) != NOTOK) {
        if ((ce->ce_fp = fopen (cachefile, "r"))) {
            ce->ce_file = mh_xstrdup(cachefile);
@@ -2444,7 +2445,9 @@ InitFTP (CT ct)
 static int
 openFTP (CT ct, char **file)
 {
 static int
 openFTP (CT ct, char **file)
 {
-    int        cachetype, caching, fd;
+    int        cachetype;
+    bool caching;
+    int fd;
     int len, buflen;
     char *bp, *ftp, *user, *pass;
     char buffer[BUFSIZ], cachefile[BUFSIZ];
     int len, buflen;
     char *bp, *ftp, *user, *pass;
     char buffer[BUFSIZ], cachefile[BUFSIZ];
@@ -2529,14 +2532,14 @@ openFTP (CT ct, char **file)
     }
 
     ce->ce_unlink = (*file == NULL);
     }
 
     ce->ce_unlink = (*file == NULL);
-    caching = 0;
+    caching = false;
     cachefile[0] = '\0';
     if ((!e->eb_permission || strcasecmp (e->eb_permission, "read-write"))
            && find_cache (NULL, wcachesw, &cachetype, e->eb_content->c_id,
                cachefile, sizeof(cachefile)) != NOTOK) {
        if (*file == NULL) {
            ce->ce_unlink = 0;
     cachefile[0] = '\0';
     if ((!e->eb_permission || strcasecmp (e->eb_permission, "read-write"))
            && find_cache (NULL, wcachesw, &cachetype, e->eb_content->c_id,
                cachefile, sizeof(cachefile)) != NOTOK) {
        if (*file == NULL) {
            ce->ce_unlink = 0;
-           caching = 1;
+           caching = true;
        }
     }
 
        }
     }
 
@@ -2547,7 +2550,7 @@ openFTP (CT ct, char **file)
     else {
        char *tempfile;
        if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) {
     else {
        char *tempfile;
        if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) {
-           adios(NULL, "unable to create temporary file in %s",
+           die("unable to create temporary file in %s",
                  get_temp_dir());
        }
        ce->ce_file = mh_xstrdup(tempfile);
                  get_temp_dir());
        }
        ce->ce_file = mh_xstrdup(tempfile);
@@ -2559,7 +2562,7 @@ openFTP (CT ct, char **file)
     }
 
     {
     }
 
     {
-       int child_id, i, vecp;
+       int child_id, vecp;
        char *vec[9];
 
        vecp = 0;
        char *vec[9];
 
        vecp = 0;
@@ -2576,8 +2579,7 @@ openFTP (CT ct, char **file)
 
        fflush (stdout);
 
 
        fflush (stdout);
 
-       for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
-           sleep (5);
+       child_id = fork();
        switch (child_id) {
            case NOTOK:
                adios ("fork", "unable to");
        switch (child_id) {
            case NOTOK:
                adios ("fork", "unable to");
@@ -2588,7 +2590,7 @@ openFTP (CT ct, char **file)
                execvp (ftp, vec);
                fprintf (stderr, "unable to exec ");
                perror (ftp);
                execvp (ftp, vec);
                fprintf (stderr, "unable to exec ");
                perror (ftp);
-               _exit (-1);
+               _exit(1);
                /* NOTREACHED */
 
            default:
                /* NOTREACHED */
 
            default:
@@ -2655,7 +2657,7 @@ InitMail (CT ct)
 static int
 openMail (CT ct, char **file)
 {
 static int
 openMail (CT ct, char **file)
 {
-    int        child_id, fd, i, vecp;
+    int child_id, fd, vecp;
     int len, buflen;
     char *bp, buffer[BUFSIZ], *vec[7];
     struct exbody *e = ct->c_ctexbody;
     int len, buflen;
     char *bp, buffer[BUFSIZ], *vec[7];
     struct exbody *e = ct->c_ctexbody;
@@ -2711,8 +2713,7 @@ openMail (CT ct, char **file)
     vec[vecp++] = e->eb_body;
     vec[vecp] = NULL;
 
     vec[vecp++] = e->eb_body;
     vec[vecp] = NULL;
 
-    for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
-       sleep (5);
+    child_id = fork();
     switch (child_id) {
        case NOTOK:
            advise ("fork", "unable to");
     switch (child_id) {
        case NOTOK:
            advise ("fork", "unable to");
@@ -2722,7 +2723,7 @@ openMail (CT ct, char **file)
            execvp (mailproc, vec);
            fprintf (stderr, "unable to exec ");
            perror (mailproc);
            execvp (mailproc, vec);
            fprintf (stderr, "unable to exec ");
            perror (mailproc);
-           _exit (-1);
+           _exit(1);
            /* NOTREACHED */
 
        default:
            /* NOTREACHED */
 
        default:
@@ -2734,7 +2735,7 @@ openMail (CT ct, char **file)
     if (*file == NULL) {
        char *tempfile;
        if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) {
     if (*file == NULL) {
        char *tempfile;
        if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) {
-           adios(NULL, "unable to create temporary file in %s",
+           die("unable to create temporary file in %s",
                  get_temp_dir());
        }
        ce->ce_file = mh_xstrdup(tempfile);
                  get_temp_dir());
        }
        ce->ce_file = mh_xstrdup(tempfile);
@@ -2751,7 +2752,7 @@ openMail (CT ct, char **file)
 
     /* showproc is for mhshow and mhstore, though mhlist -debug
      * prints it, too. */
 
     /* showproc is for mhshow and mhstore, though mhlist -debug
      * prints it, too. */
-    mh_xfree(ct->c_showproc);
+    free(ct->c_showproc);
     ct->c_showproc = mh_xstrdup("true");
 
     fseek (ce->ce_fp, 0L, SEEK_SET);
     ct->c_showproc = mh_xstrdup("true");
 
     fseek (ce->ce_fp, 0L, SEEK_SET);
@@ -2778,7 +2779,9 @@ openURL (CT ct, char **file)
     CE ce = &ct->c_cefile;
     char *urlprog, *program;
     char buffer[BUFSIZ], cachefile[BUFSIZ];
     CE ce = &ct->c_cefile;
     char *urlprog, *program;
     char buffer[BUFSIZ], cachefile[BUFSIZ];
-    int fd, caching, cachetype;
+    int fd;
+    bool caching;
+    int cachetype;
     struct msgs_array args = { 0, 0, NULL};
     pid_t child_id;
 
     struct msgs_array args = { 0, 0, NULL};
     pid_t child_id;
 
@@ -2807,14 +2810,14 @@ openURL (CT ct, char **file)
     }
 
     ce->ce_unlink = (*file == NULL);
     }
 
     ce->ce_unlink = (*file == NULL);
-    caching = 0;
+    caching = false;
     cachefile[0] = '\0';
 
     if (find_cache(NULL, wcachesw, &cachetype, e->eb_content->c_id,
                   cachefile, sizeof(cachefile)) != NOTOK) {
        if (*file == NULL) {
            ce->ce_unlink = 0;
     cachefile[0] = '\0';
 
     if (find_cache(NULL, wcachesw, &cachetype, e->eb_content->c_id,
                   cachefile, sizeof(cachefile)) != NOTOK) {
        if (*file == NULL) {
            ce->ce_unlink = 0;
-           caching = 1;
+           caching = true;
        }
     }
 
        }
     }
 
@@ -2825,7 +2828,7 @@ openURL (CT ct, char **file)
     else {
        char *tempfile;
        if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) {
     else {
        char *tempfile;
        if ((tempfile = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) {
-           adios(NULL, "unable to create temporary file in %s",
+           die("unable to create temporary file in %s",
                  get_temp_dir());
        }
        ce->ce_file = mh_xstrdup(tempfile);
                  get_temp_dir());
        }
        ce->ce_file = mh_xstrdup(tempfile);
@@ -2850,7 +2853,7 @@ openURL (CT ct, char **file)
        execvp(program, args.msgs);
        fprintf(stderr, "Unable to exec ");
        perror(program);
        execvp(program, args.msgs);
        fprintf(stderr, "Unable to exec ");
        perror(program);
-       _exit(-1);
+       _exit(1);
        /* NOTREACHED */
 
     default:
        /* NOTREACHED */
 
     default:
@@ -2945,7 +2948,7 @@ get_leftover_mp_content (CT ct, int before /* or after */)
 {
     struct multipart *m = (struct multipart *) ct->c_ctparams;
     char *boundary;
 {
     struct multipart *m = (struct multipart *) ct->c_ctparams;
     char *boundary;
-    int found_boundary = 0;
+    bool found_boundary = false;
     int max = BUFSIZ;
     char *bufp = NULL;
     size_t buflen;
     int max = BUFSIZ;
     char *bufp = NULL;
     size_t buflen;
@@ -2990,11 +2993,11 @@ get_leftover_mp_content (CT ct, int before /* or after */)
 
         if (before) {
             if (! strcmp (bufp, boundary)) {
 
         if (before) {
             if (! strcmp (bufp, boundary)) {
-                found_boundary = 1;
+                found_boundary = true;
             }
         } else {
             if (! found_boundary  &&  ! strcmp (bufp, boundary)) {
             }
         } else {
             if (! found_boundary  &&  ! strcmp (bufp, boundary)) {
-                found_boundary = 1;
+                found_boundary = true;
                 continue;
             }
         }
                 continue;
             }
         }
@@ -3048,7 +3051,8 @@ get_leftover_mp_content (CT ct, int before /* or after */)
 
 
 char *
 
 
 char *
-ct_type_str (int type) {
+ct_type_str (int type)
+{
     switch (type) {
     case CT_APPLICATION:
         return "application";
     switch (type) {
     case CT_APPLICATION:
         return "application";
@@ -3073,7 +3077,8 @@ ct_type_str (int type) {
 
 
 char *
 
 
 char *
-ct_subtype_str (int type, int subtype) {
+ct_subtype_str (int type, int subtype)
+{
     switch (type) {
     case CT_APPLICATION:
         switch (subtype) {
     switch (type) {
     case CT_APPLICATION:
         switch (subtype) {
@@ -3128,7 +3133,8 @@ ct_subtype_str (int type, int subtype) {
 
 
 int
 
 
 int
-ct_str_type (const char *type) {
+ct_str_type (const char *type)
+{
     struct str2init *s2i;
 
     for (s2i = str2cts; s2i->si_key; ++s2i) {
     struct str2init *s2i;
 
     for (s2i = str2cts; s2i->si_key; ++s2i) {
@@ -3145,7 +3151,8 @@ ct_str_type (const char *type) {
 
 
 int
 
 
 int
-ct_str_subtype (int type, const char *subtype) {
+ct_str_subtype (int type, const char *subtype)
+{
     struct k2v *kv;
 
     switch (type) {
     struct k2v *kv;
 
     switch (type) {
@@ -3185,7 +3192,8 @@ ct_str_subtype (int type, const char *subtype) {
 
 /* Find the content type and InitFunc for the CT. */
 const struct str2init *
 
 /* Find the content type and InitFunc for the CT. */
 const struct str2init *
-get_ct_init (int type) {
+get_ct_init (int type)
+{
     const struct str2init *sp;
 
     for (sp = str2cts; sp->si_key; ++sp) {
     const struct str2init *sp;
 
     for (sp = str2cts; sp->si_key; ++sp) {
@@ -3198,7 +3206,8 @@ get_ct_init (int type) {
 }
 
 const char *
 }
 
 const char *
-ce_str (int encoding) {
+ce_str (int encoding)
+{
     switch (encoding) {
     case CE_BASE64:
         return "base64";
     switch (encoding) {
     case CE_BASE64:
         return "base64";
@@ -3221,7 +3230,8 @@ ce_str (int encoding) {
 
 /* Find the content type and InitFunc for the content encoding method. */
 const struct str2init *
 
 /* Find the content type and InitFunc for the content encoding method. */
 const struct str2init *
-get_ce_method (const char *method) {
+get_ce_method (const char *method)
+{
     struct str2init *sp;
 
     for (sp = str2ces; sp->si_key; ++sp) {
     struct str2init *sp;
 
     for (sp = str2ces; sp->si_key; ++sp) {
@@ -3275,7 +3285,9 @@ parse_header_attrs (const char *filename, const char *fieldname,
 
     while (*cp == ';') {
        char *dp, *vp, *up, *nameptr, *valptr, *charset = NULL, *lang = NULL;
 
     while (*cp == ';') {
        char *dp, *vp, *up, *nameptr, *valptr, *charset = NULL, *lang = NULL;
-       int encoded = 0, partial = 0, len = 0, index = 0;
+       bool encoded = false;
+        bool partial = false;
+        int len = 0, index = 0;
 
        cp++;
        while (isspace ((unsigned char) *cp))
 
        cp++;
        while (isspace ((unsigned char) *cp))
@@ -3325,11 +3337,11 @@ parse_header_attrs (const char *filename, const char *fieldname,
 
        for (vp = cp; vp < up; vp++) {
            if (*vp == '*' && vp < up - 1) {
 
        for (vp = cp; vp < up; vp++) {
            if (*vp == '*' && vp < up - 1) {
-               partial = 1;
+               partial = true;
                continue;
            }
             if (*vp == '*' && vp == up - 1) {
                continue;
            }
             if (*vp == '*' && vp == up - 1) {
-               encoded = 1;
+               encoded = true;
            } else if (partial) {
                if (isdigit((unsigned char) *vp))
                    index = *vp - '0' + index * 10;
            } else if (partial) {
                if (isdigit((unsigned char) *vp))
                    index = *vp - '0' + index * 10;
@@ -3402,7 +3414,7 @@ parse_header_attrs (const char *filename, const char *fieldname,
                     inform("missing language tag in message %s's %s: field\n"
                         "    (parameter %s)", filename, fieldname, nameptr);
                    free(nameptr);
                     inform("missing language tag in message %s's %s: field\n"
                         "    (parameter %s)", filename, fieldname, nameptr);
                    free(nameptr);
-                    mh_xfree(charset);
+                    free(charset);
                    return NOTOK;
                }
 
                    return NOTOK;
                }
 
@@ -3425,8 +3437,8 @@ parse_header_attrs (const char *filename, const char *fieldname,
                         inform("invalid encoded sequence in message %s's %s: field\n"
                             "    (parameter %s)", filename, fieldname, nameptr);
                        free(nameptr);
                         inform("invalid encoded sequence in message %s's %s: field\n"
                             "    (parameter %s)", filename, fieldname, nameptr);
                        free(nameptr);
-                        mh_xfree(charset);
-                        mh_xfree(lang);
+                        free(charset);
+                        free(lang);
                        return NOTOK;
                    }
                    vp += 2;
                        return NOTOK;
                    }
                    vp += 2;
@@ -3466,8 +3478,8 @@ bad_quote:
                         inform("invalid quoted-string in message %s's %s: field\n"
                             "    (parameter %s)", filename, fieldname, nameptr);
                        free(nameptr);
                         inform("invalid quoted-string in message %s's %s: field\n"
                             "    (parameter %s)", filename, fieldname, nameptr);
                        free(nameptr);
-                        mh_xfree(charset);
-                        mh_xfree(lang);
+                        free(charset);
+                        free(lang);
                        return NOTOK;
                    case '"':
                        break;
                        return NOTOK;
                    case '"':
                        break;
@@ -3574,9 +3586,9 @@ bad_quote:
             */
 
            if (index == 0 && encoded) {
             */
 
            if (index == 0 && encoded) {
-                mh_xfree(pp->charset);
+                free(pp->charset);
                pp->charset = charset;
                pp->charset = charset;
-                mh_xfree(pp->lang);
+                free(pp->lang);
                pp->lang = lang;
            }
        } else {
                pp->lang = lang;
            }
        } else {
@@ -3641,7 +3653,8 @@ bad_quote:
  */
 
 char *
  */
 
 char *
-content_charset (CT ct) {
+content_charset (CT ct)
+{
     char *ret_charset = NULL;
 
     ret_charset = get_param(ct->c_ctinfo.ci_first_pm, "charset", '?', 0);
     char *ret_charset = NULL;
 
     ret_charset = get_param(ct->c_ctinfo.ci_first_pm, "charset", '?', 0);
@@ -3675,7 +3688,7 @@ output_params(size_t initialwidth, PM params, int *offsetout, int external)
 
        if (strlen(params->pm_name) > CPERLIN) {
            inform("Parameter name \"%s\" is too long", params->pm_name);
 
        if (strlen(params->pm_name) > CPERLIN) {
            inform("Parameter name \"%s\" is too long", params->pm_name);
-            mh_xfree(paramout);
+            free(paramout);
            return NULL;
        }
 
            return NULL;
        }
 
@@ -3712,7 +3725,7 @@ output_params(size_t initialwidth, PM params, int *offsetout, int external)
                                 numchars, valoff);
 
            if (i == 0) {
                                 numchars, valoff);
 
            if (i == 0) {
-                mh_xfree(paramout);
+                free(paramout);
                return NULL;
            }
 
                return NULL;
            }
 
@@ -3775,7 +3788,7 @@ output_params(size_t initialwidth, PM params, int *offsetout, int external)
                             strlen(params->pm_value + valoff), valoff);
 
        if (i == 0) {
                             strlen(params->pm_value + valoff), valoff);
 
        if (i == 0) {
-            mh_xfree(paramout);
+            free(paramout);
            return NULL;
        }
 
            return NULL;
        }
 
@@ -3876,7 +3889,7 @@ param_len(PM pm, int index, size_t valueoff, int *encode, int *cont,
        if (! pm->pm_charset) {
            pm->pm_charset = mh_xstrdup(write_charset_8bit());
            if (strcasecmp(pm->pm_charset, "US-ASCII") == 0)
        if (! pm->pm_charset) {
            pm->pm_charset = mh_xstrdup(write_charset_8bit());
            if (strcasecmp(pm->pm_charset, "US-ASCII") == 0)
-               adios(NULL, "8-bit characters in parameter \"%s\", but "
+               die("8-bit characters in parameter \"%s\", but "
                      "local character set is US-ASCII", pm->pm_name);
        }
        if (! pm->pm_lang)
                      "local character set is US-ASCII", pm->pm_name);
        }
        if (! pm->pm_lang)
@@ -4130,7 +4143,8 @@ get_param(PM first, const char *name, char replace, int fetchonly)
  * necessary
  */
 
  * necessary
  */
 
-char *get_param_value(PM pm, char replace)
+char *
+get_param_value(PM pm, char replace)
 {
     static char buffer[4096];          /* I hope no parameters are larger */
     size_t bufsize = sizeof(buffer);
 {
     static char buffer[4096];          /* I hope no parameters are larger */
     size_t bufsize = sizeof(buffer);