]> granicus.if.org Git - graphviz/commitdiff
Add remainder of Glen Low's changes fo graphviz to use cgraph.
authorEmden Gansner <erg@research.att.com>
Thu, 29 Sep 2011 21:00:26 +0000 (17:00 -0400)
committerEmden Gansner <erg@research.att.com>
Thu, 29 Sep 2011 21:00:26 +0000 (17:00 -0400)
lib/dotgen/dotinit.c
lib/dotgen/dotsplines.c
lib/dotgen/fastgr.c
lib/dotgen/mincross.c
lib/dotgen/position.c
lib/dotgen/rank.c
lib/dotgen/sameport.c
lib/fdpgen/comp.c
lib/fdpgen/fdpinit.c
lib/fdpgen/layout.c

index 3c1b7e60910e620ae1de93c80da03986a982477e..0c45ee41a5775099aebb12a1238e748d80a8147f 100644 (file)
 #include "dot.h"
 #include "aspect.h"
 
+#ifdef WITH_CGRAPH
+static void
+dot_init_subg(graph_t * g)
+{
+    graph_t* subg;
+
+    if ((g != agroot(g)) && is_cluster(g))
+       agbindrec(g, "Agraphinfo_t", sizeof(Agraphinfo_t), TRUE);
+    for (subg = agfstsubg(g); subg; subg = agnxtsubg(subg)) {
+       dot_init_subg(subg);
+    }
+}
+#endif
+
+
 static void 
 dot_init_node(node_t * n)
 {
@@ -99,7 +114,7 @@ dot_cleanup_node(node_t * n)
 #ifndef WITH_CGRAPH
     memset(&(n->u), 0, sizeof(Agnodeinfo_t));
 #else /* WITH_CGRAPH */
-       agclean(agraphof(n), AGNODE,"Agnodeinfo_t");    
+    agdelrec(n, "Agnodeinfo_t");       
 #endif /* WITH_CGRAPH */
 }
 
@@ -111,11 +126,17 @@ static void free_virtual_edge_list(node_t * n)
     for (i = ND_in(n).size - 1; i >= 0; i--) {
        e = ND_in(n).list[i];
        delete_fast_edge(e);
+#ifdef WITH_CGRAPH
+       free(e->base.data);
+#endif
        free(e);
     }
     for (i = ND_out(n).size - 1; i >= 0; i--) {
        e = ND_out(n).list[i];
        delete_fast_edge(e);
+#ifdef WITH_CGRAPH
+       free(e->base.data);
+#endif
        free(e);
     }
 }
@@ -130,6 +151,9 @@ static void free_virtual_node_list(node_t * vn)
        if (ND_node_type(vn) == VIRTUAL) {
            free_list(ND_out(vn));
            free_list(ND_in(vn));
+#ifdef WITH_CGRAPH
+           free(vn->base.data);
+#endif
            free(vn);
        }
        vn = next_vn;
@@ -163,7 +187,7 @@ dot_cleanup_graph(graph_t * g)
 #ifndef WITH_CGRAPH
        memset(&(g->u), 0, sizeof(Agraphinfo_t));
 #else /* WITH_CGRAPH */
-       agclean(g,AGRAPH,"Agraphinfo_t");
+       agdelrec(g,"Agraphinfo_t");
 #endif /* WITH_CGRAPH */
 }
 
@@ -257,6 +281,10 @@ void dot_layout(Agraph_t * g)
     setEdgeType (g, ET_SPLINE);
     asp = setAspect (g, &aspect);
 
+#ifdef WITH_CGRAPH
+    dot_init_subg(g);
+#endif
+
     dot_init_node_edge(g);
 
     do {
index 73cd4430a9e44af5440c5127463490da4f803be9..0b77b77474d94e524f4c87ab8fb24287d01ff555 100644 (file)
 #else /* WITH_CGRAPH */
 #define MAKEFWDEDGE(new, old) { \
        edge_t *newp; \
+       Agedgeinfo_t *info; \
        newp = new; \
+       info = (Agedgeinfo_t*)newp->base.data; \
+       *info = *(Agedgeinfo_t*)old->base.data; \
        *newp = *old; \
+       newp->base.data = (Agrec_t*)info; \
        AGTAIL(newp) = AGHEAD(old); \
        AGHEAD(newp) = AGTAIL(old); \
        ED_tail_port(newp) = ED_head_port(old); \
@@ -264,14 +268,19 @@ static void _dot_splines(graph_t * g, int normalize)
 {
     int i, j, k, n_nodes, n_edges, ind, cnt;
     node_t *n;
+#ifndef WITH_CGRAPH
     edge_t fwdedgea, fwdedgeb;
+#else
+    Agedgeinfo_t fwdedgeai, fwdedgebi;
+    Agedgepair_t fwdedgea, fwdedgeb;
+#endif
     edge_t *e, *e0, *e1, *ea, *eb, *le0, *le1, **edges;
     path *P;
     spline_info_t sd;
-#ifndef WITH_CGRAPH
-    int et = EDGE_TYPE(g);
-#else /* WITH_CGRAPH */
     int et = EDGE_TYPE(g);
+#ifdef WITH_CGRAPH
+    fwdedgea.out.base.data = (Agrec_t*)&fwdedgeai;
+    fwdedgeb.out.base.data = (Agrec_t*)&fwdedgebi;
 #endif /* WITH_CGRAPH */
 
     if (et == ET_NONE) return; 
@@ -387,8 +396,13 @@ static void _dot_splines(graph_t * g, int normalize)
        ea = (ED_tail_port(e0).defined
              || ED_head_port(e0).defined) ? e0 : le0;
        if (ED_tree_index(ea) & BWDEDGE) {
+#ifndef WITH_CGRAPH
            MAKEFWDEDGE(&fwdedgea, ea);
            ea = &fwdedgea;
+#else
+           MAKEFWDEDGE(&fwdedgea.out, ea);
+           ea = &fwdedgea.out;
+#endif
        }
        for (cnt = 1; i < n_edges; cnt++, i++) {
            if (le0 != (le1 = getmainedge((e1 = edges[i]))))
@@ -397,8 +411,13 @@ static void _dot_splines(graph_t * g, int normalize)
            eb = (ED_tail_port(e1).defined
                  || ED_head_port(e1).defined) ? e1 : le1;
            if (ED_tree_index(eb) & BWDEDGE) {
+#ifndef WITH_CGRAPH
                MAKEFWDEDGE(&fwdedgeb, eb);
                eb = &fwdedgeb;
+#else
+               MAKEFWDEDGE(&fwdedgeb.out, eb);
+               eb = &fwdedgeb.out;
+#endif
            }
            if (portcmp(ED_tail_port(ea), ED_tail_port(eb)))
                break;
@@ -465,10 +484,18 @@ finish :
        for (n = agfstnode(g); n; n = agnxtnode(g, n)) {
            if (E_headlabel) {
                for (e = agfstin(g, n); e; e = agnxtin(g, e))
+#ifndef WITH_CGRAPH
                    if (ED_head_label(e)) {
                        if (place_portlabel(e, TRUE))
                            updateBB(g, ED_head_label(e));
                    }
+#else
+                   if (ED_head_label(AGMKOUT(e))) {
+                       place_portlabel(AGMKOUT(e), TRUE);
+                       updateBB(g, ED_head_label(AGMKOUT(e)));
+                   }
+#endif
+
            }
            if (E_taillabel) {
                for (e = agfstout(g, n); e; e = agnxtout(g, e)) {
@@ -569,10 +596,20 @@ setflags(edge_t *e, int hint1, int hint2, int f3)
  */
 static int edgecmp(edge_t** ptr0, edge_t** ptr1)
 {
+#ifndef WITH_CGRAPH
     edge_t fwdedgea, fwdedgeb, *e0, *e1, *ea, *eb, *le0, *le1;
+#else
+    Agedgeinfo_t fwdedgeai, fwdedgebi;
+    Agedgepair_t fwdedgea, fwdedgeb;
+    edge_t *e0, *e1, *ea, *eb, *le0, *le1;
+#endif
     int et0, et1, v0, v1, rv;
     double t0, t1;
 
+#ifdef WITH_CGRAPH
+    fwdedgea.out.base.data = (Agrec_t*)&fwdedgeai;
+    fwdedgeb.out.base.data = (Agrec_t*)&fwdedgebi;
+#endif
     e0 = (edge_t *) * ptr0;
     e1 = (edge_t *) * ptr1;
     et0 = ED_tree_index(e0) & EDGETYPEMASK;
@@ -603,13 +640,23 @@ static int edgecmp(edge_t** ptr0, edge_t** ptr1)
 
     ea = (ED_tail_port(e0).defined || ED_head_port(e0).defined) ? e0 : le0;
     if (ED_tree_index(ea) & BWDEDGE) {
+#ifndef WITH_CGRAPH
        MAKEFWDEDGE(&fwdedgea, ea);
        ea = &fwdedgea;
+#else
+       MAKEFWDEDGE(&fwdedgea.out, ea);
+       ea = &fwdedgea.out;
+#endif
     }
     eb = (ED_tail_port(e1).defined || ED_head_port(e1).defined) ? e1 : le1;
     if (ED_tree_index(eb) & BWDEDGE) {
+#ifndef WITH_CGRAPH
        MAKEFWDEDGE(&fwdedgeb, eb);
        eb = &fwdedgeb;
+#else
+       MAKEFWDEDGE(&fwdedgeb.out, eb);
+       eb = &fwdedgeb.out;
+#endif
     }
     if ((rv = portcmp(ED_tail_port(ea), ED_tail_port(eb))))
        return rv;
@@ -657,14 +704,11 @@ cloneGraph (graph_t* g)
     auxg = agopen ("auxg", AG_IS_DIRECTED(g)?AGDIGRAPH:AGRAPH);
     agraphattr(auxg, "rank", "");
 #else /* WITH_CGRAPH */
-//    auxg = agopen ("auxg", AG_IS_DIRECTED(g)?AGDIGRAPH:AGRAPH);
-
-       if (agisdirected(g))
-               auxg = agopen ("auxg",Agdirected, NIL(Agdisc_t *));
-       else
-               auxg = agopen ("auxg",Agundirected, NIL(Agdisc_t *));
-
-
+    if (agisdirected(g))
+       auxg = agopen ("auxg",Agdirected, NIL(Agdisc_t *));
+    else
+       auxg = agopen ("auxg",Agundirected, NIL(Agdisc_t *));
+    agbindrec(auxg, "Agraphinfo_t", sizeof(Agraphinfo_t), TRUE);
     agattr(auxg, AGRAPH, "rank", "");
 #endif /* WITH_CGRAPH */
     GD_drawing(auxg) = NEW(layout_t);
@@ -1440,7 +1484,13 @@ static void
 make_flat_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt, int et)
 {
     node_t *tn, *hn;
+#ifndef WITH_CGRAPH
     edge_t fwdedge, *e;
+#else
+    Agedgeinfo_t fwdedgei;
+    Agedgepair_t fwdedge;
+    edge_t *e;
+#endif
     int j, i, r;
     double stepx, stepy, vspace;
     int tside, hside, pn;
@@ -1448,11 +1498,20 @@ make_flat_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt, i
     pathend_t tend, hend;
     graph_t* g;
 
+#ifdef WITH_CGRAPH
+    fwdedge.out.base.data = (Agrec_t*)&fwdedgei;
+#endif
+
     /* Get sample edge; normalize to go from left to right */
     e = edges[ind];
     if (ED_tree_index(e) & BWDEDGE) {
+#ifndef WITH_CGRAPH
        MAKEFWDEDGE(&fwdedge, e);
        e = &fwdedge;
+#else
+       MAKEFWDEDGE(&fwdedge.out, e);
+       e = &fwdedge.out;
+#endif
     }
     if (ED_adjacent(edges[ind])) {
        make_flat_adj_edges (P, edges, ind, cnt, e, et);
@@ -1635,7 +1694,13 @@ make_regular_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt
 {
     graph_t *g;
     node_t *tn, *hn;
+#ifndef WITH_CGRAPH
     edge_t fwdedgea, fwdedgeb, fwdedge, *e, *fe, *le, *segfirst;
+#else
+    Agedgeinfo_t fwdedgeai, fwdedgebi, fwdedgei;
+    Agedgepair_t fwdedgea, fwdedgeb, fwdedge;
+    edge_t *e, *fe, *le, *segfirst;
+#endif /* WITH_CGRAPH */
     pointf *ps;
     pathend_t tend, hend;
     boxf b;
@@ -1646,6 +1711,12 @@ make_regular_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt
     static int numpts2;
     int pointn;
 
+#ifdef WITH_CGRAPH
+    fwdedgea.out.base.data = (Agrec_t*)&fwdedgeai;
+    fwdedgeb.out.base.data = (Agrec_t*)&fwdedgebi;
+    fwdedge.out.base.data = (Agrec_t*)&fwdedgei;
+#endif /* WITH_CGRAPH */
+
     if (!pointfs) {
        pointfs = N_GNEW(NUMPTS, pointf);
        pointfs2 = N_GNEW(NUMPTS, pointf);
@@ -1657,22 +1728,32 @@ make_regular_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt
     g = agraphof(agtail(e));
     hackflag = FALSE;
     if (ABS(ND_rank(agtail(e)) - ND_rank(aghead(e))) > 1) {
+#ifndef WITH_CGRAPH
        fwdedgea = *e;
+#else /* WITH_CGRAPH */
+       fwdedgeai = *(Agedgeinfo_t*)e->base.data;
+       fwdedgea.out = *e;
+       fwdedgea.out.base.data = (Agrec_t*)&fwdedgeai;
+#endif /* WITH_CGRAPH */
        if (ED_tree_index(e) & BWDEDGE) {
-           MAKEFWDEDGE(&fwdedgeb, e);
 #ifndef WITH_CGRAPH
+           MAKEFWDEDGE(&fwdedgeb, e);
            fwdedgea.tail = aghead(e);
            fwdedgea.u.tail_port = ED_head_port(e);
 #else /* WITH_CGRAPH */
-           agtail(&fwdedgea) = aghead(e);
-           ED_tail_port(&fwdedgea) = ED_head_port(e);
+           MAKEFWDEDGE(&fwdedgeb.out, e);
+           agtail(&fwdedgea.out) = aghead(e);
+           ED_tail_port(&fwdedgea.out) = ED_head_port(e);
 #endif /* WITH_CGRAPH */
        } else {
-           fwdedgeb = *e;
 #ifndef WITH_CGRAPH
+           fwdedgeb = *e;
            fwdedgea.tail = e->tail;
 #else /* WITH_CGRAPH */
-           agtail(&fwdedgea) = agtail(e);
+           fwdedgebi = *(Agedgeinfo_t*)e->base.data;
+           fwdedgeb.out = *e;
+           fwdedgeb.out.base.data = (Agrec_t*)&fwdedgebi;
+           agtail(&fwdedgea.out) = agtail(e);
 #endif /* WITH_CGRAPH */
        }
        le = getmainedge(e);
@@ -1684,19 +1765,25 @@ make_regular_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt
        fwdedgea.u.edge_type = VIRTUAL;
        fwdedgea.u.head_port.p.x = fwdedgea.u.head_port.p.y = 0;
        fwdedgea.u.to_orig = e;
+       e = &fwdedgea;
 #else /* WITH_CGRAPH */
-       aghead(&fwdedgea) = aghead(le);
-       ED_head_port(&fwdedgea).defined = FALSE;
-       ED_edge_type(&fwdedgea) = VIRTUAL;
-       ED_head_port(&fwdedgea).p.x = ED_head_port(&fwdedgea).p.y = 0;
-       ED_to_orig(&fwdedgea) = e;
+       aghead(&fwdedgea.out) = aghead(le);
+       ED_head_port(&fwdedgea.out).defined = FALSE;
+       ED_edge_type(&fwdedgea.out) = VIRTUAL;
+       ED_head_port(&fwdedgea.out).p.x = ED_head_port(&fwdedgea.out).p.y = 0;
+       ED_to_orig(&fwdedgea.out) = e;
+       e = &fwdedgea.out;
 #endif /* WITH_CGRAPH */
-       e = &fwdedgea;
        hackflag = TRUE;
     } else {
        if (ED_tree_index(e) & BWDEDGE) {
+#ifndef WITH_CGRAPH
            MAKEFWDEDGE(&fwdedgea, e);
            e = &fwdedgea;
+#else
+           MAKEFWDEDGE(&fwdedgea.out, e);
+           e = &fwdedgea.out;
+#endif
        }
     }
     fe = e;
@@ -1786,8 +1873,11 @@ make_regular_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt
        }
        boxes[boxn++] = rank_box(sp, g, ND_rank(tn));
        b = hend.nb = maximal_bbox(sp, hn, e, NULL);
-       endpath(P, hackflag ? &fwdedgeb : e, REGULAREDGE, &hend,
-               spline_merge(aghead(e)));
+#ifndef WITH_CGRAPH
+       endpath(P, hackflag ? &fwdedgeb : e, REGULAREDGE, &hend, spline_merge(aghead(e)));
+#else
+       endpath(P, hackflag ? &fwdedgeb.out : e, REGULAREDGE, &hend, spline_merge(aghead(e)));
+#endif
        b.UR.y = hend.boxes[hend.boxn - 1].UR.y;
        b.LL.y = hend.boxes[hend.boxn - 1].LL.y;
        b = makeregularend(b, TOP,
@@ -1817,7 +1907,11 @@ make_regular_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt
            pointfs[pointn++] = ps[i];
        }
        recover_slack(segfirst, P);
+#ifndef WITH_CGRAPH
        hn = hackflag ? aghead(&fwdedgeb) : aghead(e);
+#else
+       hn = hackflag ? aghead(&fwdedgeb.out) : aghead(e);
+#endif
     }
 
     /* make copies of the spline points, one per multi-edge */
@@ -1840,8 +1934,13 @@ make_regular_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt
     for (j = 1; j < cnt; j++) {
        e = edges[ind + j];
        if (ED_tree_index(e) & BWDEDGE) {
+#ifndef WITH_CGRAPH
            MAKEFWDEDGE(&fwdedge, e);
            e = &fwdedge;
+#else
+           MAKEFWDEDGE(&fwdedge.out, e);
+           e = &fwdedge.out;
+#endif
        }
        for (i = 1; i < pointn - 1; i++)
            pointfs[i].x += sp->Multisep;
index f883ac803f1d947e6af7acc6e1c664b69387550c..2eb380fac67c66e4023d1e30ad1d70a6625f50b8 100644 (file)
@@ -166,8 +166,11 @@ edge_t *new_virtual_edge(node_t * u, node_t * v, edge_t * orig)
 #ifndef WITH_CGRAPH
     e = NEW(edge_t);
 #else /* WITH_CGRAPH */
-    e=agedge(agraphof(orig),u,v,"",1);
-    agbindrec(e, "Agedgeinfo_t", sizeof(Agedgeinfo_t), TRUE);  //graph custom data
+    Agedgepair_t* e2 = NEW(Agedgepair_t);
+    AGTYPE(&(e2->in)) = AGINEDGE;
+    AGTYPE(&(e2->out)) = AGOUTEDGE;
+    e2->out.base.data = NEW(Agedgeinfo_t);
+    e = &(e2->out);
 #endif /* WITH_CGRAPH */
     agtail(e) = u;
     aghead(e) = v;
@@ -175,6 +178,9 @@ edge_t *new_virtual_edge(node_t * u, node_t * v, edge_t * orig)
 
     if (orig) {
        AGID(e) = AGID(orig);
+#ifdef WITH_CGRAPH
+       AGID(&(e2->in)) = AGID(orig);
+#endif
        ED_count(e) = ED_count(orig);
        ED_xpenalty(e) = ED_xpenalty(orig);
        ED_weight(e) = ED_weight(orig);
@@ -247,6 +253,9 @@ node_t *virtual_node(graph_t * g)
     n->graph = g;
 #else /* WITH_CGRAPH */
 //  agnameof(n) = "virtual";
+    AGTYPE(n) = AGNODE;
+    n->root = g;
+    n->base.data = NEW(Agnodeinfo_t);
     n->root = g;
 #endif /* WITH_CGRAPH */
     ND_node_type(n) = VIRTUAL;
index 7d23f8d7aff15f28b74ef51e32d3759334fd19bb..3d9327c31f56d6d2d33a7684c2c67d228ec9cfda 100644 (file)
@@ -742,6 +742,9 @@ static void cleanup2(graph_t * g, int nc)
                for (j = 0; (e = ND_flat_out(v).list[j]); j++)
                    if (ED_edge_type(e) == FLATORDER) {
                        delete_flat_edge(e);
+#ifdef WITH_CGRAPH
+                       free(e->base.data);
+#endif
                        free(e);
                        j--;
                    }
index ab0b0ddf9c99472f3c1aac611ae307ff6f5edff5..3e5c9c92268a7e6dc2fc95d174f14dc324c8003b 100644 (file)
@@ -172,7 +172,16 @@ edge_t *make_aux_edge(node_t * u, node_t * v, double len, int wt)
 {
     edge_t *e;
 
+#ifndef WITH_CGRAPH
     e = NEW(edge_t);
+#else
+    Agedgepair_t* e2 = NEW(Agedgepair_t);
+    AGTYPE(&(e2->in)) = AGINEDGE;
+    AGTYPE(&(e2->out)) = AGOUTEDGE;
+    e2->out.base.data = NEW(Agedgeinfo_t);
+    e = &(e2->out);
+#endif /* WITH_CGRAPH */
+
     agtail(e) = u;
     aghead(e) = v;
     if (len > USHRT_MAX)
@@ -543,8 +552,12 @@ static void remove_aux_edges(graph_t * g)
     edge_t *e;
 
     for (n = GD_nlist(g); n; n = ND_next(n)) {
-       for (i = 0; (e = ND_out(n).list[i]); i++)
+       for (i = 0; (e = ND_out(n).list[i]); i++) {
+#ifdef WITH_CGRAPH
+           free(e->base.data);
+#endif
            free(e);
+       }
        free_list(ND_out(n));
        free_list(ND_in(n));
        ND_out(n) = ND_save_out(n);
@@ -559,6 +572,9 @@ static void remove_aux_edges(graph_t * g)
                ND_next(nprev) = nnext;
            else
                GD_nlist(g) = nnext;
+#ifdef WITH_CGRAPH
+           free(n->base.data);
+#endif
            free(n);
        } else
            nprev = n;
@@ -1119,10 +1135,15 @@ static void do_leaves(graph_t * g, node_t * leader)
        n = aghead(ND_out(leader).list[0]);
        j = ND_order(leader) + 1;
        for (e = agfstin(g, n); e; e = agnxtin(g, e)) {
-           if ((agtail(e) != leader) && (UF_find(agtail(e)) == leader)) {
-               lbound = place_leaf(agtail(e), lbound, j++);
-               unmerge_oneway(e);
-               elist_append(e, ND_in(aghead(e)));
+#ifndef WITH_CGRAPH
+           edge_t *e1 = e;
+#else
+           edge_t *e1 = AGMKOUT(e);
+#endif
+           if ((agtail(e1) != leader) && (UF_find(agtail(e1)) == leader)) {
+               lbound = place_leaf(agtail(e1), lbound, j++);
+               unmerge_oneway(e1);
+               elist_append(e1, ND_in(aghead(e1)));
            }
        }
     } else {                   /* out edge leaves */
index 6cf5d812d7793143855d412073ddd6f7c00a9241..7d9d9219bea7955d3afb3b23c0b37a2c938341a6 100644 (file)
@@ -61,6 +61,7 @@ cleanup1(graph_t * g)
             */
            if (f && (e == ED_to_orig(f))) {
                edge_t *e1, *f1;
+#ifndef WITH_CGRAPH
                for (e1 = agfstout(g, n); e1; e1 = agnxtout(g, e1)) {
                    if (e != e1) {
                        f1 = ED_to_virt(e1);
@@ -69,6 +70,20 @@ cleanup1(graph_t * g)
                        }
                    }
                }
+#else
+               node_t *n1;
+               for (n1 = agfstnode(g); n1; n1 = agnxtnode(g, n1)) {
+                   for (e1 = agfstout(g, n1); e1; e1 = agnxtout(g, e1)) {
+                       if (e != e1) {
+                           f1 = ED_to_virt(e1);
+                           if (f1 && (f == f1)) {
+                               ED_to_virt(e1) = NULL;
+                           }
+                       }
+                   }
+               }
+               free(f->base.data);
+#endif
                free(f);
            }
            ED_to_virt(e) = NULL;
@@ -637,7 +652,11 @@ collapse_leaves(graph_t * g)
            continue;
        if (agfstout(g, n) == NULL) {
            if ((e = agfstin(g, n)) && (agnxtin(g, e) == NULL)) {
+#ifndef WITH_CGRAPH
                potential_leaf(g, e, n);
+#else
+               potential_leaf(g, AGMKOUT(e), n);
+#endif
                continue;
            }
        }
index 56e59414dbe484b46bb17a604b137703e268b6cf..5adc75273185cce6896d41c34cf2bbd4080d6446 100644 (file)
@@ -57,7 +57,7 @@ void dot_sameports(graph_t * g)
 #ifndef WITH_CGRAPH
                (id = agxget(e, E_samehead->index))[0])
 #else /* WITH_CGRAPH */
-               (id = agxget(e, E_sametail))[0])
+               (id = agxget(e, E_samehead))[0])
 #endif /* WITH_CGRAPH */
                sameedge(same, n, e, id);
            else if (agtail(e) == n && E_sametail &&
index 046acd40d8b33596f6ef285b851b0b2c17f95017..bea7b6f9c31ad4620330b4b416f9e8c1df56577e 100644 (file)
@@ -89,7 +89,7 @@ graph_t **findCComp(graph_t * g, int *cnt, int *pinned)
        subg = agsubg(g, name);
 #else /* WITH_CGRAPH */
        subg = agsubg(g, name,1);
-       agbindrec(subg, "Agraphinfo_t", sizeof(Agraphinfo_t), TRUE);    //node custom data
+       agbindrec(subg, "Agraphinfo_t", sizeof(Agraphinfo_t), TRUE);
 #endif /* WITH_CGRAPH */
        GD_alg(subg) = (void *) NEW(gdata);
        PORTS(subg) = pp;
@@ -114,7 +114,7 @@ graph_t **findCComp(graph_t * g, int *cnt, int *pinned)
            subg = agsubg(g, name);
 #else /* WITH_CGRAPH */
            subg = agsubg(g, name,1);
-               agbindrec(subg, "Agraphinfo_t", sizeof(Agraphinfo_t), TRUE);    //node custom data
+               agbindrec(subg, "Agraphinfo_t", sizeof(Agraphinfo_t), TRUE);
 #endif /* WITH_CGRAPH */
            GD_alg(subg) = (void *) NEW(gdata);
        }
index cdc3bfd71b9a1247205c6bf491e92d1a8f955da7..ca56716ca8e2243af73a2b60869c0110a7ed2fa1 100644 (file)
@@ -149,7 +149,7 @@ static void cleanup_subgs(graph_t * g)
 #ifndef WITH_CGRAPH
        memset(&(g->u), 0, sizeof(Agraphinfo_t));
 #else /* WITH_CGRAPH */
-       agclean(g, AGRAPH , "Agraphinfo_t");                            
+       agdelrec(g, "Agraphinfo_t");                            
 #endif /* WITH_CGRAPH */
 }
 
index 6e5ed5215593482d665500588d36ab522b9f878b..b15e7497366e9ad9c1ae97e2858714781dfff4fe 100644 (file)
@@ -205,6 +205,9 @@ static void freeDeriveNode(node_t * n)
 {
     free(ND_alg(n));
     free(ND_pos(n));
+#ifdef WITH_CGRAPH
+    agdelrec(n, "Agnodeinfo_t");
+#endif
 }
 
 static void freeGData(graph_t * g)
@@ -221,14 +224,23 @@ static void freeDerivedGraph(graph_t * g, graph_t ** cc)
 
     while ((cg = *cc++)) {
        freeGData(cg);
+#ifdef WITH_CGRAPH
+       agdelrec(cg, "Agraphinfo_t");
+#endif
     }
     if (PORTS(g))
        free(PORTS(g));
     freeGData(g);
+#ifdef WITH_CGRAPH
+    agdelrec(dg, "Agraphinfo_t");
+#endif
     for (dn = agfstnode(g); dn; dn = dnxt) {
        dnxt = agnxtnode(g, dn);
        for (e = agfstout(g, dn); e; e = agnxtout(g, e)) {
            free (ED_to_virt(e));
+#ifdef WITH_CGRAPH
+           agdelrec(e, "Agedgeinfo_t");
+#endif
        }
        freeDeriveNode(dn);
     }
@@ -473,7 +485,7 @@ static graph_t *deriveGraph(graph_t * g, layout_info * infop)
     dg = agopen(name, AGRAPHSTRICT);
 #else /* WITH_CGRAPH */
     dg = agopen("derived", Agstrictdirected,NIL(Agdisc_t *));
-    agbindrec(dg, "Agraphinfo_t", sizeof(Agraphinfo_t), TRUE); //node custom data
+    agbindrec(dg, "Agraphinfo_t", sizeof(Agraphinfo_t), TRUE);
 #endif /* WITH_CGRAPH */
     GD_alg(dg) = (void *) NEW(gdata);  /* freed in freeDeriveGraph */
 #ifdef DEBUG
@@ -570,7 +582,7 @@ static graph_t *deriveGraph(graph_t * g, layout_info * infop)
                de = agedge(dg, hd, tl);
 #else /* WITH_CGRAPH */
                de = agedge(dg, hd, tl, NULL,1);
-               agbindrec(de, "Agedgeinfo_t", sizeof(Agedgeinfo_t), TRUE);      //node custom data
+           agbindrec(de, "Agedgeinfo_t", sizeof(Agedgeinfo_t), TRUE);
 #endif /* WITH_CGRAPH */
            ED_dist(de) = ED_dist(e);
            ED_factor(de) = ED_factor(e);
@@ -612,6 +624,7 @@ static graph_t *deriveGraph(graph_t * g, layout_info * infop)
                    de = agedge(dg, dn, m);
 #else /* WITH_CGRAPH */
                    de = agedge(dg, dn, m, NULL,1);
+               agbindrec(de, "Agedgeinfo_t", sizeof(Agedgeinfo_t), TRUE);
 #endif /* WITH_CGRAPH */
                ED_dist(de) = ED_dist(pp->e);
                ED_factor(de) = ED_factor(pp->e);
@@ -1100,10 +1113,8 @@ mkClusters (graph_t * g, clist_t* pclist, graph_t* parent)
 
     for (subg = agfstsubg(g); subg; subg = agnxtsubg(subg))
        {
-//     for (me = agfstout(mg, g->meta_node); me; me = agnxtout(mg, me)) {
-//     mn = aghead(me);
-//     subg = agusergraph(mn);
        if (!strncmp(agnameof(subg), "cluster", 7)) {
+           agbindrec(subg, "Agraphinfo_t", sizeof(Agraphinfo_t), TRUE);
 #endif /* WITH_CGRAPH */
            GD_alg(subg) = (void *) NEW(gdata); /* freed in cleanup_subgs */
            GD_ndim(subg) = GD_ndim(parent);