]> granicus.if.org Git - graphviz/commitdiff
Fix bug 1964 aka b2045. Basically, we give a warning if a cluster is defined twice.
authorEmden Gansner <erg@research.att.com>
Wed, 29 Feb 2012 19:36:54 +0000 (14:36 -0500)
committerEmden Gansner <erg@research.att.com>
Wed, 29 Feb 2012 19:36:54 +0000 (14:36 -0500)
This is only a problem with libgraph.

lib/common/types.h
lib/dotgen/dotinit.c
lib/dotgen/rank.c

index be431abd16b16d90832214990af394f806172a33..6960050670439fc7d4ee5a16ce6ec11a64f78aca 100644 (file)
@@ -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)
index 8bbb472167eb66b3673a5e22eb24908f286f0d1a..c960c79e99f9670ddb3ce7c129a744965b7b5c03 100644 (file)
@@ -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
index 5571207ef4dce4d1a1ceb1c196829eef70184804..be959359f7c5a4e7f626536cd4e7de14063993fa 100644 (file)
@@ -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;