]> granicus.if.org Git - graphviz/commitdiff
Remove aborts from dotgen.
authorEmden Gansner <erg@research.att.com>
Wed, 4 Jan 2012 16:32:58 +0000 (11:32 -0500)
committerEmden Gansner <erg@research.att.com>
Wed, 4 Jan 2012 16:32:58 +0000 (11:32 -0500)
lib/dotgen/conc.c
lib/dotgen/mincross.c

index 9cd3b6100b7c27227406295814ed998c95eff691..ccabde01a70046f6e733f48241260133d3aa1bca 100644 (file)
  */
 
 #include       "dot.h"
-
+#include       <setjmp.h>
 
 #define                UP              0
 #define                DOWN    1
 
+static jmp_buf jbuf;
+
 static boolean samedir(edge_t * e, edge_t * f)
 {
     edge_t *e0, *f0;
@@ -157,8 +159,11 @@ static void rebuild_vlists(graph_t * g)
 
     for (r = GD_minrank(g); r <= GD_maxrank(g); r++) {
        lead = GD_rankleader(g)[r];
-       if (GD_rank(agroot(g))[r].v[ND_order(lead)] != lead)
-           abort();
+       if (GD_rank(agroot(g))[r].v[ND_order(lead)] != lead) {
+           agerr(AGERR, "rebuiltd_vlists: rank lead %s not in order %d of rank %d\n", 
+               agnameof(lead), ND_order(lead), r);
+           longjmp(jbuf, 1);
+       }
        GD_rank(g)[r].v =
            GD_rank(agroot(g))[r].v + ND_order((GD_rankleader(g)[r]));
        maxi = -1;
@@ -229,6 +234,10 @@ void dot_concentrate(graph_t * g)
        }
        r--;
     }
+    if (setjmp(jbuf)) {
+       agerr(AGPREV, "concentrate=true may not work correctly.\n");
+       return;
+    }
     for (c = 1; c <= GD_n_cluster(g); c++)
        rebuild_vlists(GD_clust(g)[c]);
 }
index 7315f402126d7c27603298045577d023a98a154a..06a16951984f32b278d966d13f10552f7ae8e54c 100644 (file)
@@ -1086,9 +1086,9 @@ void install_in_rank(graph_t * g, node_t * n)
     r = ND_rank(n);
     i = GD_rank(g)[r].n;
     if (GD_rank(g)[r].an <= 0) {
-       agerr(AGERR, "install_in_rank %s %s rank %d i = %d an = 0\n",
-             agnameof(g), agnameof(n), r, i);
-       abort();
+       agerr(AGERR, "install_in_rank, line %d: %s %s rank %d i = %d an = 0\n",
+             __LINE__, agnameof(g), agnameof(n), r, i);
+       return;
     }
 
     GD_rank(g)[r].v[i] = n;
@@ -1105,13 +1105,22 @@ void install_in_rank(graph_t * g, node_t * n)
        assert(v != NULL);
     }
 #endif
-    if (ND_order(n) > GD_rank(Root)[r].an)
-       abort();
-    if ((r < GD_minrank(g)) || (r > GD_maxrank(g)))
-       abort();
+    if (ND_order(n) > GD_rank(Root)[r].an) {
+       agerr(AGERR, "install_in_rank, line %d: ND_order(%s) [%d] > GD_rank(Root)[%d].an [%d]\n",
+             __LINE__, agnameof(n), ND_order(n), r, GD_rank(Root)[r].an);
+       return;
+    }
+    if ((r < GD_minrank(g)) || (r > GD_maxrank(g))) {
+       agerr(AGERR, "install_in_rank, line %d: rank %d not in rank range [%d,%d]\n",
+             __LINE__, r, GD_minrank(g), GD_maxrank(g));
+       return;
+    }
     if (GD_rank(g)[r].v + ND_order(n) >
-       GD_rank(g)[r].av + GD_rank(Root)[r].an)
-       abort();
+       GD_rank(g)[r].av + GD_rank(Root)[r].an) {
+       agerr(AGERR, "install_in_rank, line %d: GD_rank(g)[%d].v + ND_order(%s) [%d] > GD_rank(g)[%d].av + GD_rank(Root)[%d].an [%d]\n",
+             __LINE__, r, agnameof(n),GD_rank(g)[r].v + ND_order(n), r, r, GD_rank(g)[r].av+GD_rank(Root)[r].an);
+       return;
+    }
 }
 
 /*     install nodes in ranks. the initial ordering ensure that series-parallel