]> diplodocus.org Git - nmh/blobdiff - uip/mhfree.c
Dynamically allocate space for the output of fmt_scan(), using
[nmh] / uip / mhfree.c
index 29756876fdd11637a6cbafccd03d1a7191a05123..f2726d0fa88b3f46d22f356aa3ed2ae24fb7c99b 100644 (file)
@@ -30,6 +30,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);
 
 
 /*
@@ -103,6 +104,9 @@ free_content (CT ct)
        free (ct->c_descr);
     if (ct->c_dispo)
        free (ct->c_dispo);
+    if (ct->c_dispo_type)
+       free (ct->c_dispo_type);
+    free_pmlist (ct->c_dispo_first);
 
     if (ct->c_file) {
        if (ct->c_unlink)
@@ -150,7 +154,6 @@ free_header (CT ct)
 void
 free_ctinfo (CT ct)
 {
-    char **ap;
     CI ci;
 
     ci = &ct->c_ctinfo;
@@ -162,10 +165,7 @@ free_ctinfo (CT ct)
        free (ci->ci_subtype);
        ci->ci_subtype = NULL;
     }
-    for (ap = ci->ci_attrs; *ap; ap++) {
-       free (*ap);
-       *ap = NULL;
-    }
+    free_pmlist(ci->ci_first_pm);
     if (ci->ci_comment) {
        free (ci->ci_comment);
        ci->ci_comment = NULL;
@@ -253,6 +253,27 @@ free_external (CT ct)
 }
 
 
+static void
+free_pmlist (PM pm)
+{
+    PM pm2;
+
+    while (pm != NULL) {
+       if (pm->pm_name)
+           free (pm->pm_name);
+       if (pm->pm_value)
+           free (pm->pm_value);
+       if (pm->pm_charset)
+           free (pm->pm_charset);
+       if (pm->pm_lang)
+           free (pm->pm_lang);
+       pm2 = pm->pm_next;
+       free(pm);
+       pm = pm2;
+    }
+}
+
+
 /*
  * Free data structures related to encoding/decoding
  * Content-Transfer-Encodings.