]> granicus.if.org Git - graphviz/commitdiff
Fixes for stability; large graphs
authornorth <devnull@localhost>
Mon, 15 Feb 2010 20:25:46 +0000 (20:25 +0000)
committernorth <devnull@localhost>
Mon, 15 Feb 2010 20:25:46 +0000 (20:25 +0000)
lib/cgraph/edge.c
lib/cgraph/graph.c
lib/cgraph/mem.c
lib/cgraph/node.c
lib/cgraph/rec.c

index 8ea11cf4b17b9ef0433f18e6048fca160ce05b6c..75dd75f4a4c2483baadf548d4741892693d62331 100644 (file)
@@ -31,9 +31,11 @@ Agedge_t *agfstout(Agraph_t * g, Agnode_t * n)
     Agedge_t *e = NILedge;
 
     sn = agsubrep(g, n);
-    dtrestore(g->e_seq, sn->out_seq);
-    e = (Agedge_t *) dtfirst(g->e_seq);
-    sn->out_seq = dtextract(g->e_seq);
+    if (sn) {
+               dtrestore(g->e_seq, sn->out_seq);
+               e = (Agedge_t *) dtfirst(g->e_seq);
+               sn->out_seq = dtextract(g->e_seq);
+       }
     return e;
 }
 
@@ -42,13 +44,15 @@ Agedge_t *agnxtout(Agraph_t * g, Agedge_t * e)
 {
     Agnode_t *n;
     Agsubnode_t *sn;
-    Agedge_t *f;
+    Agedge_t *f = NILedge;
 
     n = AGTAIL(e);
     sn = agsubrep(g, n);
-    dtrestore(g->e_seq, sn->out_seq);
-    f = (Agedge_t *) dtnext(g->e_seq, e);
-    sn->out_seq = dtextract(g->e_seq);
+    if (sn) {
+               dtrestore(g->e_seq, sn->out_seq);
+               f = (Agedge_t *) dtnext(g->e_seq, e);
+               sn->out_seq = dtextract(g->e_seq);
+       }
     return f;
 }
 
@@ -58,9 +62,11 @@ Agedge_t *agfstin(Agraph_t * g, Agnode_t * n)
     Agedge_t *e = NILedge;
 
     sn = agsubrep(g, n);
-    dtrestore(g->e_seq, sn->in_seq);
-    e = (Agedge_t *) dtfirst(g->e_seq);
-    sn->in_seq = dtextract(g->e_seq);
+       if (sn) {
+               dtrestore(g->e_seq, sn->in_seq);
+               e = (Agedge_t *) dtfirst(g->e_seq);
+               sn->in_seq = dtextract(g->e_seq);
+       }
     return e;
 }
 
@@ -68,14 +74,16 @@ Agedge_t *agnxtin(Agraph_t * g, Agedge_t * e)
 {
     Agnode_t *n;
     Agsubnode_t *sn;
-    Agedge_t *f;
+    Agedge_t *f = NILedge;
 
     n = AGHEAD(e);
     sn = agsubrep(g, n);
-    dtrestore(g->e_seq, sn->in_seq);
-    f = (Agedge_t *) dtnext(g->e_seq, e);
-    sn->in_seq = dtextract(g->e_seq);
-    return f;
+       if (sn) {
+               dtrestore(g->e_seq, sn->in_seq);
+               f = (Agedge_t *) dtnext(g->e_seq, e);
+               sn->in_seq = dtextract(g->e_seq);
+       }
+       return f;
 }
 
 Agedge_t *agfstedge(Agraph_t * g, Agnode_t * n)
@@ -167,8 +175,10 @@ static void ins(Dict_t * d, Dtlink_t ** set, Agedge_t * e)
 
 static void del(Dict_t * d, Dtlink_t ** set, Agedge_t * e)
 {
+    void *x;
     dtrestore(d, *set);
-    dtdelete(d, e);
+    x = dtdelete(d, e);
+    assert(x);
     *set = dtextract(d);
 }
 
index 0d071d93045dcfe4d0f291dc80e3d1951840008a..2685d4a6ffbe6bb4f295e01ae7bc209e7239e954 100644 (file)
@@ -229,8 +229,10 @@ int agdegree(Agraph_t * g, Agnode_t * n, int want_in, int want_out)
     int rv = 0;
 
     sn = agsubrep(g, n);
-    if (want_out) rv += cnt(g->e_seq,&(sn->out_seq));
-    if (want_in) rv += cnt(g->e_seq,&(sn->in_seq));
+    if (sn) {
+       if (want_out) rv += cnt(g->e_seq,&(sn->out_seq));
+       if (want_in) rv += cnt(g->e_seq,&(sn->in_seq));
+    }
        return rv;
 }
 
index eb52d662c9264d2912658b4ea7b31903dfb56067..7d5e7434a7c66f4c5571bf18eafea3ee6989e289 100644 (file)
@@ -35,7 +35,7 @@ static void *memalloc(void *heap, size_t request)
 {
     void *rv;
     rv = vmalloc((Vmalloc_t *) heap, request);
-    memset(rv, 0, request);
+    if (rv) memset(rv, 0, request);
     return rv;
 }
 
index a989e094265bacefcd22ff73cc579034468be795..b8a4d0b00c9d5bf98cbab65c76f0e9f6294caf61 100644 (file)
@@ -49,7 +49,7 @@ Agnode_t *agnxtnode(Agraph_t * g, Agnode_t * n)
 {
     Agsubnode_t *sn;
     sn = agsubrep(g, n);
-    sn = ((Agsubnode_t *) dtnext(g->n_seq, sn));
+    if (sn) sn = ((Agsubnode_t *) dtnext(g->n_seq, sn));
     return sn ? sn->node : NILnode;
 }
 
@@ -64,7 +64,7 @@ Agnode_t *agprvnode(Agraph_t * g, Agnode_t * n)
 {
     Agsubnode_t *sn;
     sn = agsubrep(g, n);
-    sn = ((Agsubnode_t *) dtprev(g->n_seq, sn));
+    if (sn) sn = ((Agsubnode_t *) dtprev(g->n_seq, sn));
     return sn ? sn->node : NILnode;
 }
 
@@ -90,11 +90,17 @@ static Agnode_t *newnode(Agraph_t * g, unsigned long id, unsigned long seq)
 static void installnode(Agraph_t * g, Agnode_t * n)
 {
     Agsubnode_t *sn;
+    int osize;
+
+    assert(dtsize(g->n_id) == dtsize(g->n_seq));
+    osize = dtsize(g->n_id);
     if (g == agroot(g)) sn = &(n->mainsub);
     else sn = agalloc(g, sizeof(Agsubnode_t));
     sn->node = n;
     dtinsert(g->n_id, sn);
     dtinsert(g->n_seq, sn);
+    assert(dtsize(g->n_id) == dtsize(g->n_seq));
+    assert(dtsize(g->n_id) == osize + 1);
 }
 
 static void installnodetoroot(Agraph_t * g, Agnode_t * n)
@@ -158,6 +164,7 @@ Agnode_t *agnode(Agraph_t * g, char *name, int cflag)
        n = newnode(g, id, agnextseq(g, AGNODE));
        installnodetoroot(g, n);
        initnode(g, n);
+       assert(agsubrep(g,n));
        return n;
     }
 
@@ -264,18 +271,22 @@ Agnode_t *agsubnode(Agraph_t * g, Agnode_t * n0, int cflag)
 
 int agsubnodeidcmpf(Dict_t * d, void *arg0, void *arg1, Dtdisc_t * disc)
 {
+    long       v;
     Agsubnode_t *sn0, *sn1;
     sn0 = (Agsubnode_t *) arg0;
     sn1 = (Agsubnode_t *) arg1;
-    return (AGID(sn0->node) - AGID(sn1->node));
+    v = (AGID(sn0->node) - AGID(sn1->node));
+    return ((v==0)?0:(v<0?-1:1));
 }
 
 int agsubnodeseqcmpf(Dict_t * d, void *arg0, void *arg1, Dtdisc_t * disc)
 {
     Agsubnode_t *sn0, *sn1;
+    long       v;
     sn0 = (Agsubnode_t *) arg0;
     sn1 = (Agsubnode_t *) arg1;
-    return (AGSEQ(sn0->node) - AGSEQ(sn1->node));
+    v = (AGSEQ(sn0->node) - AGSEQ(sn1->node));
+    return ((v==0)?0:(v<0?-1:1));
 }
 
 Dtdisc_t Ag_subnode_id_disc = {
index 2a007f4183add5e1215978e5bfdc73920a6774cb..b1cc321418a90934a5f3b313ec71ebfdc63c535d 100644 (file)
@@ -203,7 +203,7 @@ void aginit(Agraph_t * g, int kind, char *rec_name, int rec_size, int mtf)
     Agnode_t *n;
     Agedge_t *e;
     Agraph_t *s;
-       int              rec;
+       int              rec;   /* if recursive on subgraphs */
 
        rec = (rec_size < 0);
        if (rec) rec_size = -rec_size;