]> granicus.if.org Git - graphviz/commitdiff
Partial fix for bug 1981 - still need to free virtual edges used in cluster skeletons
authorerg <devnull@localhost>
Fri, 18 Jun 2010 18:04:41 +0000 (18:04 +0000)
committererg <devnull@localhost>
Fri, 18 Jun 2010 18:04:41 +0000 (18:04 +0000)
lib/common/emit.c
lib/common/labels.c
lib/common/render.h
lib/dotgen/dotinit.c
lib/dotgen/flat.c

index b5d8dc2b990698fea00f426d3b3485e0d8ee1302..a1aa36cfa625e8e2890d1def1d18b471acc713d4 100644 (file)
@@ -2101,7 +2101,7 @@ static void
 freePara (exdot_op* op)
 {
     if (op->op.kind == xd_text)
-       free_textpara (op->para);
+       free_textpara (op->para, 1);
 }
 
 boxf xdotBB (Agraph_t* g)
index 787303e89357e1b498451d12777fee629a78837e..14b046295f327dcfe73f2ffbe3e2bd1c57450e99 100644 (file)
@@ -184,15 +184,27 @@ textlabel_t *make_label(void *obj, char *str, int kind, double fontsize, char *f
     return rv;
 }
 
-void free_textpara(textpara_t * tl)
+/* free_textpara:
+ * Free resources related to textpara_t.
+ * tl is an array of cnt textpara_t's.
+ * It is also assumed that the text stored in the str field
+ * is all stored in one large buffer shared by all of the textpara_t,
+ * so only the first one needs to free its tlp->str.
+ */
+void free_textpara(textpara_t * tl, int cnt)
 {
-    if (tl) {
-       if (tl->str)
-           free(tl->str);
-       if (tl->layout && tl->free_layout)
-           tl->free_layout (tl->layout);
-       free(tl);
+    int i;
+    textpara_t* tlp = tl;
+
+    if (!tl) return;
+    for (i = 0; i < cnt; i++) { 
+       if ((i == 0) && tlp->str)
+           free(tlp->str);
+       if (tlp->layout && tlp->free_layout)
+           tlp->free_layout (tlp->layout);
+       tlp++;
     }
+    free(tl);
 }
 
 void free_label(textlabel_t * p)
@@ -202,7 +214,7 @@ void free_label(textlabel_t * p)
        if (p->html) {
            free_html_label(p->u.html, 1);
        } else {
-           free_textpara(p->u.txt.para);
+           free_textpara(p->u.txt.para, p->u.txt.nparas);
        }
        free(p);
     }
index 61bbdf29eaef15f534add3b6387ae35a70ff2fa9..cf6fc37bd57f7f0b84a3adc5b0ce5424f62cf73c 100644 (file)
@@ -117,7 +117,7 @@ extern "C" {
     extern shape_desc *find_user_shape(const char *);
     extern void free_line(textpara_t *);
     extern void free_label(textlabel_t *);
-    extern void free_textpara(textpara_t * tl);
+    extern void free_textpara(textpara_t * tl, int);
     extern void getdouble(graph_t * g, char *name, double *result);
     extern splines *getsplinepoints(edge_t * e);
     extern void gv_fixLocale (int set);
index f89a5fccae116e028fd35a8294d07985675eb42c..0306b24e2dad771531f92f8fef619e481e7924ba 100644 (file)
@@ -150,12 +150,17 @@ dot_cleanup_graph(graph_t * g)
        GD_cluster_was_collapsed(clust) = FALSE;
        dot_cleanup(clust);
     }
+    if (GD_clust(g)) free (GD_clust(g));
+    if (GD_rankleader(g)) free (GD_rankleader(g));
 
     free_list(GD_comp(g));
-    if ((g == agroot(g)) && GD_rank(g)) {
+    if (GD_rank(g)) {
        for (i = GD_minrank(g); i <= GD_maxrank(g); i++)
-           free(GD_rank(g)[i].v);
-       free(GD_rank(g));
+           free(GD_rank(g)[i].av);
+       if (GD_minrank(g) == -1)
+           free(GD_rank(g)-1);
+       else
+           free(GD_rank(g));
     }
     if (g != agroot(g)) 
 #ifndef WITH_CGRAPH
index 1527a870f1a307fb308277fb4bad9a1c194d022c..6786d303818a3421745f8bc1955f6e96a0feb362 100644 (file)
@@ -197,8 +197,8 @@ static void abomination(graph_t * g)
     GD_rank(g) = rptr + 1;
     for (r = GD_maxrank(g); r >= 0; r--)
        GD_rank(g)[r] = GD_rank(g)[r - 1];
-    GD_rank(g)[r].n = GD_rank(g)[0].an = 0;
-    GD_rank(g)[r].v = GD_rank(g)[0].av = N_NEW(2, node_t *);
+    GD_rank(g)[r].n = GD_rank(g)[r].an = 0;
+    GD_rank(g)[r].v = GD_rank(g)[r].av = N_NEW(2, node_t *);
     GD_rank(g)[r].flat = NULL;
     GD_rank(g)[r].ht1 = GD_rank(g)[r].ht2 = 1;
     GD_rank(g)[r].pht1 = GD_rank(g)[r].pht2 = 1;