From: Emden Gansner Date: Wed, 29 Feb 2012 19:36:54 +0000 (-0500) Subject: Fix bug 1964 aka b2045. Basically, we give a warning if a cluster is defined twice. X-Git-Tag: LAST_LIBGRAPH~32^2~466^2~8 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a08f242d0105298d5c54a7b0e3b8d4e4713b7d19;p=graphviz Fix bug 1964 aka b2045. Basically, we give a warning if a cluster is defined twice. This is only a problem with libgraph. --- diff --git a/lib/common/types.h b/lib/common/types.h index be431abd1..696005067 100644 --- a/lib/common/types.h +++ b/lib/common/types.h @@ -303,8 +303,8 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind; graph_t **clust; /* clusters are in clust[1..n_cluster] !!! */ node_t *nlist; rank_t *rank; -#ifdef WITH_CGRAPH graph_t *parent; /* containing cluster (not parent subgraph) */ +#ifdef WITH_CGRAPH int level; /* cluster nesting level (not node level!) */ node_t *minrep, *maxrep; /* set leaders for min and max rank */ #endif @@ -324,7 +324,6 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind; boolean has_sinkrank; #endif unsigned char showboxes; - boolean cluster_was_collapsed; fontname_kind fontnames; /* to override mangling in SVG */ int nodesep, ranksep; @@ -353,7 +352,6 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind; #define GD_border(g) (((Agraphinfo_t*)AGDATA(g))->border) #define GD_cl_cnt(g) (((Agraphinfo_t*)AGDATA(g))->cl_nt) #define GD_clust(g) (((Agraphinfo_t*)AGDATA(g))->clust) -#define GD_cluster_was_collapsed(g) (((Agraphinfo_t*)AGDATA(g))->cluster_was_collapsed) #define GD_comp(g) (((Agraphinfo_t*)AGDATA(g))->comp) #define GD_exact_ranksep(g) (((Agraphinfo_t*)AGDATA(g))->exact_ranksep) #define GD_expanded(g) (((Agraphinfo_t*)AGDATA(g))->expanded) @@ -412,7 +410,6 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind; #define GD_cl_cnt(g) (g)->u.cl_cnt #define GD_cleanup(g) (g)->u.cleanup #define GD_clust(g) (g)->u.clust -#define GD_cluster_was_collapsed(g) (g)->u.cluster_was_collapsed #define GD_comp(g) (g)->u.comp #define GD_dist(g) (g)->u.dist #define GD_drawing(g) (g)->u.drawing @@ -431,6 +428,7 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind; #define GD_installed(g) (g)->u.installed #define GD_label(g) (g)->u.label #define GD_leader(g) (g)->u.leader +#define GD_parent(g) (g)->u.parent #define GD_rankdir(g) ((g)->u.rankdir & 0x3) #define GD_flip(g) (GD_rankdir(g) & 1) #define GD_realrankdir(g) ((g)->u.rankdir >> 2) diff --git a/lib/dotgen/dotinit.c b/lib/dotgen/dotinit.c index 8bbb47216..c960c79e9 100644 --- a/lib/dotgen/dotinit.c +++ b/lib/dotgen/dotinit.c @@ -169,7 +169,7 @@ dot_cleanup_graph(graph_t * g) int c; for (c = 1; c <= GD_n_cluster(g); c++) { clust = GD_clust(g)[c]; - GD_cluster_was_collapsed(clust) = FALSE; + GD_parent(clust) = NULL; dot_cleanup(clust); } #else diff --git a/lib/dotgen/rank.c b/lib/dotgen/rank.c index 5571207ef..be959359f 100644 --- a/lib/dotgen/rank.c +++ b/lib/dotgen/rank.c @@ -272,9 +272,14 @@ cluster_leader(graph_t * clust) static void collapse_cluster(graph_t * g, graph_t * subg) { - if (GD_cluster_was_collapsed(subg)) + if (GD_parent(subg)) { +#ifndef WITH_CGRAPH + agerr(AGWARN, "Cluster %s is multiply defined in %s and %s - this may cause problems.\n", subg->name, + g->name, GD_parent(subg)->name); +#endif return; - GD_cluster_was_collapsed(subg) = TRUE; + } + GD_parent(subg) = g; node_induce(g, subg); if (agfstnode(subg) == NULL) return;