From: erg Date: Fri, 18 Jun 2010 18:04:41 +0000 (+0000) Subject: Partial fix for bug 1981 - still need to free virtual edges used in cluster skeletons X-Git-Tag: LAST_LIBGRAPH~32^2~1306 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d8028bd6ae2657ddc7a02732eb42eb977f9ada4d;p=graphviz Partial fix for bug 1981 - still need to free virtual edges used in cluster skeletons --- diff --git a/lib/common/emit.c b/lib/common/emit.c index b5d8dc2b9..a1aa36cfa 100644 --- a/lib/common/emit.c +++ b/lib/common/emit.c @@ -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) diff --git a/lib/common/labels.c b/lib/common/labels.c index 787303e89..14b046295 100644 --- a/lib/common/labels.c +++ b/lib/common/labels.c @@ -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); } diff --git a/lib/common/render.h b/lib/common/render.h index 61bbdf29e..cf6fc37bd 100644 --- a/lib/common/render.h +++ b/lib/common/render.h @@ -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); diff --git a/lib/dotgen/dotinit.c b/lib/dotgen/dotinit.c index f89a5fcca..0306b24e2 100644 --- a/lib/dotgen/dotinit.c +++ b/lib/dotgen/dotinit.c @@ -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 diff --git a/lib/dotgen/flat.c b/lib/dotgen/flat.c index 1527a870f..6786d3038 100644 --- a/lib/dotgen/flat.c +++ b/lib/dotgen/flat.c @@ -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;