]> diplodocus.org Git - nmh/blobdiff - uip/mhfree.c
Alter HasSuffixC()'s char * to be const.
[nmh] / uip / mhfree.c
index a0b09a063fc2a303b57b96ce8490eae559b976b6..dbb606f68eb06b7ad1ae9de1cad740d938a7425f 100644 (file)
@@ -9,7 +9,7 @@
  */
 
 #include <h/mh.h>
-#include <errno.h>
+#include <h/utils.h>
 #include <h/mime.h>
 #include <h/mhparse.h>
 
@@ -31,6 +31,7 @@ static void free_text (CT);
 static void free_multi (CT);
 static void free_partial (CT);
 static void free_external (CT);
+static void free_pmlist (PM *);
 
 
 /*
@@ -48,14 +49,10 @@ free_content (CT ct)
      */
     free_header (ct);
 
-    if (ct->c_partno)
-       free (ct->c_partno);
-
-    if (ct->c_vrsn)
-       free (ct->c_vrsn);
-
-    if (ct->c_ctline)
-       free (ct->c_ctline);
+    mh_xfree(ct->c_partno);
+    mh_xfree(ct->c_vrsn);
+    mh_xfree(ct->c_ctline);
+    ct->c_partno = ct->c_vrsn = ct->c_ctline = NULL;
 
     free_ctinfo (ct);
 
@@ -85,38 +82,38 @@ free_content (CT ct)
            break;
     }
 
-    if (ct->c_showproc)
-       free (ct->c_showproc);
-    if (ct->c_termproc)
-       free (ct->c_termproc);
-    if (ct->c_storeproc)
-       free (ct->c_storeproc);
+    mh_xfree(ct->c_showproc);
+    mh_xfree(ct->c_termproc);
+    mh_xfree(ct->c_storeproc);
+    ct->c_showproc = ct->c_termproc = ct->c_storeproc = NULL;
 
-    if (ct->c_celine)
-       free (ct->c_celine);
+    mh_xfree(ct->c_celine);
+    ct->c_celine = NULL;
 
     /* free structures for content encodings */
     free_encoding (ct, 1);
 
-    if (ct->c_id)
-       free (ct->c_id);
-    if (ct->c_descr)
-       free (ct->c_descr);
-    if (ct->c_dispo)
-       free (ct->c_dispo);
+    mh_xfree(ct->c_id);
+    mh_xfree(ct->c_descr);
+    mh_xfree(ct->c_dispo);
+    mh_xfree(ct->c_dispo_type);
+    ct->c_id = ct->c_descr = ct->c_dispo = ct->c_dispo_type = NULL;
+    free_pmlist (&ct->c_dispo_first);
 
     if (ct->c_file) {
        if (ct->c_unlink)
-           unlink (ct->c_file);
+           (void) m_unlink (ct->c_file);
        free (ct->c_file);
+       ct->c_file = NULL;
     }
-    if (ct->c_fp)
+    if (ct->c_fp) {
        fclose (ct->c_fp);
+       ct->c_fp = NULL;
+    }
 
-    if (ct->c_storage)
-       free (ct->c_storage);
-    if (ct->c_folder)
-       free (ct->c_folder);
+    mh_xfree(ct->c_storage);
+    mh_xfree(ct->c_folder);
+    ct->c_storage = ct->c_folder = NULL;
 
     free (ct);
 }
@@ -151,30 +148,16 @@ free_header (CT ct)
 void
 free_ctinfo (CT ct)
 {
-    char **ap;
     CI ci;
 
     ci = &ct->c_ctinfo;
-    if (ci->ci_type) {
-       free (ci->ci_type);
-       ci->ci_type = NULL;
-    }
-    if (ci->ci_subtype) {
-       free (ci->ci_subtype);
-       ci->ci_subtype = NULL;
-    }
-    for (ap = ci->ci_attrs; *ap; ap++) {
-       free (*ap);
-       *ap = NULL;
-    }
-    if (ci->ci_comment) {
-       free (ci->ci_comment);
-       ci->ci_comment = NULL;
-    }
-    if (ci->ci_magic) {
-       free (ci->ci_magic);
-       ci->ci_magic = NULL;
-    }
+    mh_xfree(ci->ci_type);
+    mh_xfree(ci->ci_subtype);
+    ci->ci_type = ci->ci_subtype = NULL;
+    free_pmlist(&ci->ci_first_pm);
+    mh_xfree(ci->ci_comment);
+    mh_xfree(ci->ci_magic);
+    ci->ci_comment = ci->ci_magic = NULL;
 }
 
 
@@ -186,7 +169,7 @@ free_text (CT ct)
     if (!(t = (struct text *) ct->c_ctparams))
        return;
 
-    free ((char *) t);
+    free(t);
     ct->c_ctparams = NULL;
 }
 
@@ -200,19 +183,19 @@ free_multi (CT ct)
     if (!(m = (struct multipart *) ct->c_ctparams))
        return;
 
-    if (m->mp_start)
-       free (m->mp_start);
-    if (m->mp_stop)
-       free (m->mp_stop);
+    mh_xfree(m->mp_start);
+    mh_xfree(m->mp_stop);
+    free (m->mp_content_before);
+    free (m->mp_content_after);
        
     for (part = m->mp_parts; part; part = next) {
        next = part->mp_next;
        free_content (part->mp_part);
-       free ((char *) part);
+       free(part);
     }
     m->mp_parts = NULL;
 
-    free ((char *) m);
+    free(m);
     ct->c_ctparams = NULL;
 }
 
@@ -225,10 +208,9 @@ free_partial (CT ct)
     if (!(p = (struct partial *) ct->c_ctparams))
        return;
 
-    if (p->pm_partid)
-       free (p->pm_partid);
+    mh_xfree(p->pm_partid);
 
-    free ((char *) p);
+    free(p);
     ct->c_ctparams = NULL;
 }
 
@@ -242,14 +224,33 @@ free_external (CT ct)
        return;
 
     free_content (e->eb_content);
-    if (e->eb_body)
-       free (e->eb_body);
-
-    free ((char *) e);
+    mh_xfree(e->eb_body);
+    mh_xfree(e->eb_url);
+    free(e);
     ct->c_ctparams = NULL;
 }
 
 
+static void
+free_pmlist (PM *p)
+{
+    PM pm = *p, pm2;
+
+    while (pm != NULL) {
+        mh_xfree(pm->pm_name);
+        mh_xfree(pm->pm_value);
+        mh_xfree(pm->pm_charset);
+        mh_xfree(pm->pm_lang);
+       pm2 = pm->pm_next;
+       free(pm);
+       pm = pm2;
+    }
+
+    if (*p)
+       *p = NULL;
+}
+
+
 /*
  * Free data structures related to encoding/decoding
  * Content-Transfer-Encodings.
@@ -258,10 +259,7 @@ free_external (CT ct)
 void
 free_encoding (CT ct, int toplevel)
 {
-    CE ce;
-
-    if (!(ce = ct->c_cefile))
-       return;
+    CE ce = &ct->c_cefile;
 
     if (ce->ce_fp) {
        fclose (ce->ce_fp);
@@ -270,15 +268,12 @@ free_encoding (CT ct, int toplevel)
 
     if (ce->ce_file) {
        if (ce->ce_unlink)
-           unlink (ce->ce_file);
+           (void) m_unlink (ce->ce_file);
        free (ce->ce_file);
        ce->ce_file = NULL;
     }
 
-    if (toplevel) {
-       free ((char *) ce);
-       ct->c_cefile = NULL;
-    } else {
+    if (! toplevel) {
        ct->c_ceopenfnx = NULL;
     }
 }
@@ -289,9 +284,10 @@ freects_done (int status)
 {
     CT *ctp;
 
-    if ((ctp = cts))
-       for (; *ctp; ctp++)
-           free_content (*ctp);
+    for (ctp = cts; ctp && *ctp; ctp++)
+       free_content (*ctp);
+
+    free (cts);
 
     exit (status);
 }