]> granicus.if.org Git - graphviz/commitdiff
dotgen -> cgraph
authorellson <devnull@localhost>
Tue, 21 Oct 2008 19:48:31 +0000 (19:48 +0000)
committerellson <devnull@localhost>
Tue, 21 Oct 2008 19:48:31 +0000 (19:48 +0000)
lib/dotgen/position.c
lib/dotgen/rank.c
lib/dotgen/sameport.c

index b03a6ca3c003f67487529a35a8074beb90f4c268..dbb3606b52d0b9530890c2e9959797e98653a441 100644 (file)
@@ -50,7 +50,7 @@ dumpNS (graph_t * g)
        el = ND_out(n);
        for (i = 0; i < el.size; i++) {
            e = el.list[i];
-           fprintf (stderr, "%s(%x) -> %s(%x) : %d\n", e->tail->name,e->tail, e->head->name, e->head,
+           fprintf (stderr, "%s(%x) -> %s(%x) : %d\n", agtail(e)->name,agtail(e), aghead(e)->name, aghead(e),
                ED_minlen(e));
        }
        n = ND_next(n); 
@@ -89,7 +89,7 @@ connectGraph (graph_t* g)
            tp = rp->v[i];
            if (ND_save_out(tp).list) {
                for (j = 0; (e = ND_save_out(tp).list[j]); j++) {
-                   if ((ND_rank(e->head) > r) || (ND_rank(e->tail) > r)) {
+                   if ((ND_rank(aghead(e)) > r) || (ND_rank(agtail(e)) > r)) {
                        found = TRUE;
                        break;
                    }
@@ -98,7 +98,7 @@ connectGraph (graph_t* g)
            }
            if (ND_save_in(tp).list) {
                for (j = 0; (e = ND_save_in(tp).list[j]); j++) {
-                   if ((ND_rank(e->tail) > r) || (ND_rank(e->head) > r)) {
+                   if ((ND_rank(agtail(e)) > r) || (ND_rank(aghead(e)) > r)) {
                        found = TRUE;
                        break;
                    }
@@ -160,7 +160,7 @@ static int go(node_t * u, node_t * v)
     if (u == v)
        return TRUE;
     for (i = 0; (e = ND_out(u).list[i]); i++) {
-       if (go(e->head, v))
+       if (go(aghead(e), v))
            return TRUE;
     }
     return FALSE;
@@ -176,8 +176,8 @@ edge_t *make_aux_edge(node_t * u, node_t * v, double len, int wt)
     edge_t *e;
 
     e = NEW(edge_t);
-    e->tail = u;
-    e->head = v;
+    agtail(e) = u;
+    aghead(e) = v;
     if (len > USHRT_MAX)
        largeMinlen (len);
     ED_minlen(e) = ROUND(len);
@@ -245,7 +245,7 @@ make_LR_constraints(graph_t * g)
                  */
                sw = 0;
                for (k = 0; (e = ND_other(u).list[k]); k++) {
-                   if (e->tail == e->head) {
+                   if (agtail(e) == aghead(e)) {
                        sw += selfRightSpace (e);
                    }
                }
@@ -262,33 +262,33 @@ make_LR_constraints(graph_t * g)
            if ((e = (edge_t*)ND_alg(u))) {
                e0 = ND_save_out(u).list[0];
                e1 = ND_save_out(u).list[1];
-               if (ND_order(e0->head) > ND_order(e1->head)) {
+               if (ND_order(aghead(e0)) > ND_order(aghead(e1))) {
                    ff = e0;
                    e0 = e1;
                    e1 = ff;
                }
                m0 = (ED_minlen(e) * GD_nodesep(g)) / 2;
-               m1 = m0 + ND_rw(e0->head) + ND_lw(e0->tail);
+               m1 = m0 + ND_rw(aghead(e0)) + ND_lw(agtail(e0));
                /* these guards are needed because the flat edges
                 * work very poorly with cluster layout */
-               if (canreach(e0->tail, e0->head) == FALSE)
-                   make_aux_edge(e0->head, e0->tail, m1,
+               if (canreach(agtail(e0), aghead(e0)) == FALSE)
+                   make_aux_edge(aghead(e0), agtail(e0), m1,
                        ED_weight(e));
-               m1 = m0 + ND_rw(e1->tail) + ND_lw(e1->head);
-               if (canreach(e1->head, e1->tail) == FALSE)
-                   make_aux_edge(e1->tail, e1->head, m1,
+               m1 = m0 + ND_rw(agtail(e1)) + ND_lw(aghead(e1));
+               if (canreach(aghead(e1), agtail(e1)) == FALSE)
+                   make_aux_edge(agtail(e1), aghead(e1), m1,
                        ED_weight(e));
            }
 
            /* position flat edge endpoints */
            for (k = 0; k < ND_flat_out(u).size; k++) {
                e = ND_flat_out(u).list[k];
-               if (ND_order(e->tail) < ND_order(e->head)) {
-                   t0 = e->tail;
-                   h0 = e->head;
+               if (ND_order(agtail(e)) < ND_order(aghead(e))) {
+                   t0 = agtail(e);
+                   h0 = aghead(e);
                } else {
-                   t0 = e->head;
-                   h0 = e->tail;
+                   t0 = aghead(e);
+                   h0 = agtail(e);
                }
 
                width = ND_rw(t0) + ND_lw(h0);
@@ -347,11 +347,11 @@ static void make_edge_pairs(graph_t * g)
                    m0 = width / 2 - 1;
                }
 #endif
-               make_aux_edge(sn, e->tail, m0 + 1, ED_weight(e));
-               make_aux_edge(sn, e->head, m1 + 1, ED_weight(e));
+               make_aux_edge(sn, agtail(e), m0 + 1, ED_weight(e));
+               make_aux_edge(sn, aghead(e), m1 + 1, ED_weight(e));
                ND_rank(sn) =
-                   MIN(ND_rank(e->tail) - m0 - 1,
-                       ND_rank(e->head) - m1 - 1);
+                   MIN(ND_rank(agtail(e)) - m0 - 1,
+                       ND_rank(aghead(e)) - m1 - 1);
            }
     }
 }
@@ -361,7 +361,7 @@ static void contain_clustnodes(graph_t * g)
     int c;
     edge_t     *e;
 
-    if (g != g->root) {
+    if (g != agroot(g)) {
        contain_nodes(g);
        if ((e = find_fast_edge(GD_ln(g),GD_rn(g))))    /* maybe from lrvn()?*/
            ED_weight(e) += 128;
@@ -379,9 +379,9 @@ static int vnode_not_related_to(graph_t * g, node_t * v)
     if (ND_node_type(v) != VIRTUAL)
        return FALSE;
     for (e = ND_save_out(v).list[0]; ED_to_orig(e); e = ED_to_orig(e));
-    if (agcontains(g, e->tail))
+    if (agcontains(g, agtail(e)))
        return FALSE;
-    if (agcontains(g, e->head))
+    if (agcontains(g, aghead(e)))
        return FALSE;
     return TRUE;
 }
@@ -408,16 +408,16 @@ static void keepout_othernodes(graph_t * g)
        if (v == NULL)
            continue;
        for (i = ND_order(v) - 1; i >= 0; i--) {
-           u = GD_rank(g->root)[r].v[i];
+           u = GD_rank(agroot(g))[r].v[i];
            /* can't use "is_a_vnode_of" because elists are swapped */
            if ((ND_node_type(u) == NORMAL) || vnode_not_related_to(g, u)) {
                make_aux_edge(u, GD_ln(g), CL_OFFSET + ND_rw(u), 0);
                break;
            }
        }
-       for (i = ND_order(v) + GD_rank(g)[r].n; i < GD_rank(g->root)[r].n;
+       for (i = ND_order(v) + GD_rank(g)[r].n; i < GD_rank(agroot(g))[r].n;
             i++) {
-           u = ND_rank(g->root)[r].v[i];
+           u = GD_rank(agroot(g))[r].v[i];
            if ((ND_node_type(u) == NORMAL) || vnode_not_related_to(g, u)) {
                make_aux_edge(GD_rn(g), u, CL_OFFSET + ND_lw(u), 0);
                break;
@@ -560,7 +560,7 @@ static void remove_aux_edges(graph_t * g)
        } else
            nprev = n;
     }
-    GD_nlist(g)->u.prev = NULL;
+    ND_prev(GD_nlist(g)) = NULL;
 }
 
 /* set_xcoords:
@@ -598,7 +598,7 @@ set_xcoords(graph_t * g)
 static void adjustEqual(graph_t * g, int delta)
 {
     int r, avail, half, deltop, delbottom;
-    graph_t *root = g->root;
+    graph_t *root = agroot(g);
     rank_t *rank = GD_rank(root);
     int maxr = GD_maxrank(g);
     int minr = GD_minrank(g);
@@ -635,7 +635,7 @@ static void adjustEqual(graph_t * g, int delta)
        int y = yoff;
        for (r = GD_maxrank(root) - 1; r >= GD_minrank(root); r--) {
            if (rank[r].n > 0)
-               rank[r].v[0]->u.coord.y += y;
+               ND_coord(rank[r].v[0]).y += y;
            y += yoff;
        }
        GD_ht2(g) += yoff;
@@ -654,7 +654,7 @@ static void adjustEqual(graph_t * g, int delta)
 static void adjustSimple(graph_t * g, int delta)
 {
     int r, bottom, deltop, delbottom;
-    graph_t *root = g->root;
+    graph_t *root = agroot(g);
     rank_t *rank = GD_rank(root);
     int maxr = GD_maxrank(g);
     int minr = GD_minrank(g);
@@ -664,7 +664,7 @@ static void adjustSimple(graph_t * g, int delta)
     if (delbottom > 0) {
        for (r = maxr; r >= minr; r--) {
            if (rank[r].n > 0)
-               rank[r].v[0]->u.coord.y += delbottom;
+               ND_coord(rank[r].v[0]).y += delbottom;
        }
        deltop = GD_ht2(g) + (delta-bottom) + delbottom - rank[minr].ht2;
     }
@@ -673,7 +673,7 @@ static void adjustSimple(graph_t * g, int delta)
     if (deltop > 0) {
        for (r = minr-1; r >= GD_minrank(root); r--) {
            if (rank[r].n > 0)
-               rank[r].v[0]->u.coord.y += deltop;
+               ND_coord(rank[r].v[0]).y += deltop;
        }
     }
     GD_ht2(g) += (delta - bottom);
@@ -692,7 +692,7 @@ static void adjustRanks(graph_t * g, int equal)
     int rht;                   /* height between top and bottom ranks */
     int delta, maxr, minr;
     int c, ht1, ht2;
-    rank_t *rank = GD_rank(g->root);
+    rank_t *rank = GD_rank(agroot(g));
 
     ht1 = GD_ht1(g);
     ht2 = GD_ht2(g);
@@ -709,7 +709,7 @@ static void adjustRanks(graph_t * g, int equal)
     GD_ht1(g) = ht1;
     GD_ht2(g) = ht2;
 
-    if ((g != g->root) && GD_label(g)) {
+    if ((g != agroot(g)) && GD_label(g)) {
        lht = MAX(GD_border(g)[LEFT_IX].y, GD_border(g)[RIGHT_IX].y);
        maxr = GD_maxrank(g);
        minr = GD_minrank(g);
@@ -724,7 +724,7 @@ static void adjustRanks(graph_t * g, int equal)
     }
 
     /* update the global ranks */
-    if (g != g->root) {
+    if (g != agroot(g)) {
        rank[GD_minrank(g)].ht2 = MAX(rank[GD_minrank(g)].ht2, GD_ht2(g));
        rank[GD_maxrank(g)].ht1 = MAX(rank[GD_maxrank(g)].ht1, GD_ht1(g));
     }
@@ -740,7 +740,7 @@ static int clust_ht(Agraph_t * g)
 {
     int c, ht1, ht2;
     graph_t *subg;
-    rank_t *rank = GD_rank(g->root);
+    rank_t *rank = GD_rank(agroot(g));
     int haveClustLabel = 0;
 
     ht1 = GD_ht1(g);
@@ -758,9 +758,9 @@ static int clust_ht(Agraph_t * g)
 
     /* account for a possible cluster label in clusters */
     /* room for root graph label is handled in dotneato_postprocess */
-    if ((g != g->root) && GD_label(g)) {
+    if ((g != agroot(g)) && GD_label(g)) {
        haveClustLabel = 1;
-       if (!GD_flip(g->root)) {
+       if (!GD_flip(agroot(g))) {
            ht1 += GD_border(g)[BOTTOM_IX].y;
            ht2 += GD_border(g)[TOP_IX].y;
        }
@@ -769,7 +769,7 @@ static int clust_ht(Agraph_t * g)
     GD_ht2(g) = ht2;
 
     /* update the global ranks */
-    if (g != g->root) {
+    if (g != agroot(g)) {
        rank[GD_minrank(g)].ht2 = MAX(rank[GD_minrank(g)].ht2, ht2);
        rank[GD_maxrank(g)].ht1 = MAX(rank[GD_maxrank(g)].ht1, ht1);
     }
@@ -801,7 +801,7 @@ static void set_ycoords(graph_t * g)
            /* have to look for high self-edge labels, too */
            if (ND_other(n).list)
                for (j = 0; (e = ND_other(n).list[j]); j++) {
-                   if (e->tail == e->head) {
+                   if (agtail(e) == aghead(e)) {
                        if (ED_label(e))
                            ht2 = MAX(ht2, ED_label(e)->dimen.y / 2);
                    }
@@ -830,13 +830,13 @@ static void set_ycoords(graph_t * g)
     /* make the initial assignment of ycoords to leftmost nodes by ranks */
     maxht = 0;
     r = GD_maxrank(g);
-    rank[r].v[0]->u.coord.y = rank[r].ht1;
+    (ND_coord(rank[r].v[0])).y = rank[r].ht1;
     while (--r >= GD_minrank(g)) {
        d0 = rank[r + 1].pht2 + rank[r].pht1 + GD_ranksep(g);   /* prim node sep */
        d1 = rank[r + 1].ht2 + rank[r].ht1 + CL_OFFSET; /* cluster sep */
        delta = MAX(d0, d1);
        if (rank[r].n > 0)      /* this may reflect some problem */
-           rank[r].v[0]->u.coord.y = rank[r + 1].v[0]->u.coord.y + delta;
+               (ND_coord(rank[r].v[0])).y = (ND_coord(rank[r + 1].v[0])).y + delta;
 #ifdef DEBUG
        else
            fprintf(stderr, "dot set_ycoords: rank %d is empty\n",
@@ -849,8 +849,8 @@ static void set_ycoords(graph_t * g)
     if (GD_exact_ranksep(g)) {
        for (r = GD_maxrank(g) - 1; r >= GD_minrank(g); r--)
            if (rank[r].n > 0)  /* this may reflect the same problem :-() */
-               rank[r].v[0]->u.coord.y =
-                   rank[r + 1].v[0]->u.coord.y + maxht;
+                       (ND_coord(rank[r].v[0])).y=
+                   (ND_coord(rank[r + 1].v[0])).y + maxht;
     }
 
     if (lbl && GD_flip(g))
@@ -858,7 +858,7 @@ static void set_ycoords(graph_t * g)
 
     /* copy ycoord assignment from leftmost nodes to others */
     for (n = GD_nlist(g); n; n = ND_next(n))
-       ND_coord(n).y = rank[ND_rank(n)].v[0]->u.coord.y;
+       ND_coord(n).y = (ND_coord(rank[ND_rank(n)].v[0])).y;
 }
 
 /* dot_compute_bb:
@@ -875,7 +875,7 @@ static void dot_compute_bb(graph_t * g, graph_t * root)
     node_t *v;
     pointf LL, UR;
 
-    if (g == g->root) {
+    if (g == agroot(g)) {
        LL.x = (double)(INT_MAX);
        UR.x = (double)(-INT_MAX);
        for (r = GD_minrank(g); r <= GD_maxrank(g); r++) {
@@ -900,17 +900,17 @@ static void dot_compute_bb(graph_t * g, graph_t * root)
        }
        offset = CL_OFFSET;
        for (c = 1; c <= GD_n_cluster(g); c++) {
-           x = (double)(GD_clust(g)[c]->u.bb.LL.x - offset);
+           x = (double)(GD_bb(GD_clust(g)[c]).LL.x - offset);
            LL.x = MIN(LL.x, x);
-           x = (double)(GD_clust(g)[c]->u.bb.UR.x + offset);
+           x = (double)(GD_bb(GD_clust(g)[c]).UR.x + offset);
            UR.x = MAX(UR.x, x);
        }
     } else {
        LL.x = (double)(ND_rank(GD_ln(g)));
        UR.x = (double)(ND_rank(GD_rn(g)));
     }
-    LL.y = (double)(ND_rank(root)[GD_maxrank(g)].v[0]->u.coord.y - GD_ht1(g));
-    UR.y = (double)(ND_rank(root)[GD_minrank(g)].v[0]->u.coord.y + GD_ht2(g));
+    LL.y = (double)(ND_coord(ND_rank(root)[GD_maxrank(g)].v[0]).y - GD_ht1(g));
+    UR.y = (double)(ND_coord(ND_rank(root)[GD_minrank(g)].v[0]).y + GD_ht2(g));
     GD_bb(g).LL = LL;
     GD_bb(g).UR = UR;
 }
@@ -1051,17 +1051,17 @@ static void set_aspect(graph_t * g, aspect_t* asp)
 
 static point resize_leaf(node_t * leaf, point lbound)
 {
-    dot_nodesize(leaf, GD_flip(leaf->graph));
+    dot_nodesize(leaf, GD_flip(agraphof(leaf)));
     ND_coord(leaf).y = lbound.y;
     ND_coord(leaf).x = lbound.x + ND_lw(leaf);
-    lbound.x = lbound.x + ND_lw(leaf) + ND_rw(leaf) + GD_nodesep(leaf->graph);
+    lbound.x = lbound.x + ND_lw(leaf) + ND_rw(leaf) + GD_nodesep(agraphof(leaf));
     return lbound;
 }
 
 static point place_leaf(node_t * leaf, point lbound, int order)
 {
     node_t *leader;
-    graph_t *g = leaf->graph;
+    graph_t *g = agraphof(leaf);
 
     leader = UF_find(leaf);
     if (leaf != leader)
@@ -1113,23 +1113,23 @@ static void do_leaves(graph_t * g, node_t * leader)
     lbound.y = ND_coord(leader).y;
     lbound = resize_leaf(leader, lbound);
     if (ND_out(leader).size > 0) {     /* in-edge leaves */
-       n = ND_out(leader).list[0]->head;
+       n = aghead(ND_out(leader).list[0]);
        j = ND_order(leader) + 1;
        for (e = agfstin(g, n); e; e = agnxtin(g, e)) {
-           if ((e->tail != leader) && (UF_find(e->tail) == leader)) {
-               lbound = place_leaf(e->tail, lbound, j++);
+           if ((agtail(e) != leader) && (UF_find(agtail(e)) == leader)) {
+               lbound = place_leaf(agtail(e), lbound, j++);
                unmerge_oneway(e);
-               elist_append(e, ND_in(e->head));
+               elist_append(e, ND_in(aghead(e)));
            }
        }
     } else {                   /* out edge leaves */
-       n = ND_in(leader).list[0]->tail;
+       n = agtail(ND_in(leader).list[0]);
        j = ND_order(leader) + 1;
        for (e = agfstout(g, n); e; e = agnxtout(g, e)) {
-           if ((e->head != leader) && (UF_find(e->head) == leader)) {
-               lbound = place_leaf(e->head, lbound, j++);
+           if ((aghead(e) != leader) && (UF_find(aghead(e)) == leader)) {
+               lbound = place_leaf(aghead(e), lbound, j++);
                unmerge_oneway(e);
-               elist_append(e, ND_out(e->tail));
+               elist_append(e, ND_out(agtail(e)));
            }
        }
     }
@@ -1161,7 +1161,7 @@ static void expand_leaves(graph_t * g)
            do_leaves(g, ND_outleaf(n));
        if (ND_other(n).list)
            for (i = 0; (e = ND_other(n).list[i]); i++) {
-               if ((d = ND_rank(e->head) - ND_rank(e->head)) == 0)
+               if ((d = ND_rank(aghead(e)) - ND_rank(aghead(e))) == 0)
                    continue;
                f = ED_to_orig(e);
                if (ports_eq(e, f) == FALSE) {
@@ -1195,12 +1195,12 @@ static void make_lrvn(graph_t * g)
 
     if (GD_ln(g))
        return;
-    ln = virtual_node(g->root);
+    ln = virtual_node(agroot(g));
     ND_node_type(ln) = SLACKNODE;
-    rn = virtual_node(g->root);
+    rn = virtual_node(agroot(g));
     ND_node_type(rn) = SLACKNODE;
 
-    if (GD_label(g) && (g != g->root) && !GD_flip(g->root)) {
+    if (GD_label(g) && (g != agroot(g)) && !GD_flip(agroot(g))) {
        int w = MAX(GD_border(g)[BOTTOM_IX].x, GD_border(g)[TOP_IX].x);
        make_aux_edge(ln, rn, w, 0);
     }
@@ -1227,7 +1227,7 @@ static void contain_nodes(graph_t * g)
        v = GD_rank(g)[r].v[0];
        if (v == NULL) {
            agerr(AGERR, "contain_nodes clust %s rank %d missing node\n",
-                 g->name, r);
+                 agnameof(g), r);
            continue;
        }
        make_aux_edge(ln, v,
index 747a3df8461b860fb6903c591bdbe32f63e31c24..3a8132ed0719a8cda420132037596a4a1c2bf026 100644 (file)
@@ -131,10 +131,10 @@ collapse_rankset(graph_t * g, graph_t * subg, int kind)
        }
        switch (kind) {
        case SOURCERANK:
-           GD_minset(g)->u.ranktype = kind;
+           ND_ranktype(GD_minset(g)) = kind;
            break;
        case SINKRANK:
-           GD_maxset(g)->u.ranktype = kind;
+           ND_ranktype(GD_maxset(g)) = kind;
            break;
        }
     }
@@ -189,9 +189,13 @@ node_induce(graph_t * par, graph_t * g)
     }
 
     for (n = agfstnode(g); n; n = agnxtnode(g, n)) {
-       for (e = agfstout(g->root, n); e; e = agnxtout(g->root, e)) {
-           if (agcontains(g, e->head))
+       for (e = agfstout(agroot(g), n); e; e = agnxtout(agroot(g), e)) {
+           if (agcontains(g, aghead(e)))
+#ifndef WITH_CGRAPH
                aginsert(g, e);
+#else /* WITH_CGRAPH */
+               agsubedge(g,e,1);
+#endif /* WITH_CGRAPH */
        }
     }
 }
@@ -270,15 +274,20 @@ static void
 collapse_sets(graph_t *rg, graph_t *g)
 {
     int c;
-    graph_t *mg, *subg;
-    node_t *mn, *n;
-    edge_t *me;
+    graph_t  *subg;
+    node_t *n;
 
+#ifndef WITH_CGRAPH
+    graph_t *mg;
+    node_t *mn;
+    edge_t *me;
     mg = g->meta_node->graph;
     for (me = agfstout(mg, g->meta_node); me; me = agnxtout(mg, me)) {
        mn = me->head;
        subg = agusergraph(mn);
-
+#else /* WITH_CGRAPH */
+    for (subg = agfstsubg(g); subg; subg = agnxtsubg(subg)) {
+#endif /* WITH_CGRAPH */
        c = rank_set_class(subg);
        if (c) {
            if ((c == CLUSTER) && CL_type == LOCAL)
@@ -286,7 +295,7 @@ collapse_sets(graph_t *rg, graph_t *g)
            else
                collapse_rankset(rg, subg, c);
        }
-       else collapse_sets(rg,subg);
+       else collapse_sets(rg, subg);
 
        /* mark nodes with ordered edges so their leaves are not collapsed */
        if (agget(subg, "ordering"))
@@ -298,7 +307,9 @@ collapse_sets(graph_t *rg, graph_t *g)
 static void 
 find_clusters(graph_t * g)
 {
-    graph_t *mg, *subg;
+    graph_t *subg;
+#ifndef WITH_CGRAPH
+    graph_t *mg;
     node_t *mn;
     edge_t *me;
 
@@ -306,7 +317,9 @@ find_clusters(graph_t * g)
     for (me = agfstout(mg, g->meta_node); me; me = agnxtout(mg, me)) {
        mn = me->head;
        subg = agusergraph(mn);
-
+#else /* WITH_CGRAPH */
+    for (subg = agfstsubg(subg); subg; subg = agnxtsubg(subg)) {
+#endif /* WITH_CGRAPH */
        if (GD_set_type(subg) == CLUSTER)
            collapse_cluster(g, subg);
     }
@@ -317,8 +330,8 @@ set_minmax(graph_t * g)
 {
     int c;
 
-    GD_minrank(g) += GD_leader(g)->u.rank;
-    GD_maxrank(g) += GD_leader(g)->u.rank;
+    GD_minrank(g) += ND_rank(GD_leader(g));
+    GD_maxrank(g) += ND_rank(GD_leader(g));
     for (c = 1; c <= GD_n_cluster(g); c++)
        set_minmax(GD_clust(g)[c]);
 }
@@ -342,16 +355,16 @@ minmax_edges(graph_t * g)
        GD_maxset(g) = UF_find(GD_maxset(g));
 
     if ((n = GD_maxset(g))) {
-       slen.y = (GD_maxset(g)->u.ranktype == SINKRANK);
+       slen.y = (ND_ranktype(GD_maxset(g)) == SINKRANK);
        while ((e = ND_out(n).list[0])) {
-           assert(e->head == UF_find(e->head));
+           assert(aghead(e) == UF_find(aghead(e)));
            reverse_edge(e);
        }
     }
     if ((n = GD_minset(g))) {
-       slen.x = (GD_minset(g)->u.ranktype == SOURCERANK);
+       slen.x = (ND_ranktype(GD_minset(g)) == SOURCERANK);
        while ((e = ND_in(n).list[0])) {
-           assert(e->tail == UF_find(e->tail));
+           assert(agtail(e) == UF_find(agtail(e)));
            reverse_edge(e);
        }
     }
@@ -427,7 +440,7 @@ static void expand_ranksets(graph_t * g, aspect_t* asp)
                UF_singleton(n);
            n = agnxtnode(g, n);
        }
-       if (g == g->root) {
+       if (g == agroot(g)) {
            if (CL_type == LOCAL) {
                for (c = 1; c <= GD_n_cluster(g); c++)
                    set_minmax(GD_clust(g)[c]);
@@ -571,7 +584,7 @@ void dot_rank(graph_t * g, aspect_t* asp)
 
 int is_cluster(graph_t * g)
 {
-    return (strncmp(g->name, "cluster", 7) == 0);
+    return (strncmp(agnameof(g), "cluster", 7) == 0);
 }
 
 #ifdef OBSOLETE
@@ -598,11 +611,11 @@ potential_leaf(graph_t * g, edge_t * e, node_t * leaf)
 
     if ((ED_tail_port(e).p.x) || (ED_head_port(e).p.x))
        return;
-    if ((ED_minlen(e) != 1) || (ND_order(e->tail) > 0))
+    if ((ED_minlen(e) != 1) || (ND_order(agtail(e)) > 0))
        return;
-    par = ((leaf != e->head) ? e->head : e->tail);
+    par = ((leaf != aghead(e)) ? aghead(e) : agtail(e));
     ND_ranktype(leaf) = LEAFSET;
-    if (par == e->tail)
+    if (par == agtail(e))
        GD_outleaf(par) = merge_leaves(g, GD_outleaf(par), leaf);
     else
        GD_inleaf(par) = merge_leaves(g, GD_inleaf(par), leaf);
index da99396dbc69c59a42ac4c3428e9bd9d328454be..a01c7c1bafb38b87d17ffd53a71e5557989be213 100644 (file)
@@ -44,18 +44,31 @@ void dot_sameports(graph_t * g)
     same_t same[MAXSAME];
     int i;
 
+#ifndef WITH_CGRAPH
     E_samehead = agfindattr(g->proto->e, "samehead");
     E_sametail = agfindattr(g->proto->e, "sametail");
+#else /* WITH_CGRAPH */
+    E_samehead = agattr(g, AGEDGE, "samehead",(char*)0);
+    E_sametail = agattr(g, AGEDGE, "sametail",(char*)0);
+#endif /* WITH_CGRAPH */
     if (!(E_samehead || E_sametail))
        return;
     for (n = agfstnode(g); n; n = agnxtnode(g, n)) {
        n_same = 0;
        for (e = agfstedge(g, n); e; e = agnxtedge(g, e, n)) {
-           if (e->head == n && E_samehead &&
+           if (aghead(e) == n && E_samehead &&
+#ifndef WITH_CGRAPH
                (id = agxget(e, E_samehead->index))[0])
+#else /* WITH_CGRAPH */
+               (id = agxget(e, E_sametail->index))[0])
+#endif /* WITH_CGRAPH */
                sameedge(same, n, e, id);
-           else if (e->tail == n && E_sametail &&
-                    (id = agxget(e, E_sametail->index))[0])
+           else if (agtail(e) == n && E_sametail &&
+#ifndef WITH_CGRAPH
+               (id = agxget(e, E_sametail->index))[0])
+#else /* WITH_CGRAPH */
+               (id = agxget(e, E_sametail))[0])
+#endif /* WITH_CGRAPH */
                sameedge(same, n, e, id);
        }
        for (i = 0; i < n_same; i++) {
@@ -79,7 +92,7 @@ static void sameedge(same_t * same, node_t * n, edge_t * e, char *id)
        }
     if (++n_same > MAXSAME) {
        agerr(AGERR, "too many same{head,tail} groups for node %s\n",
-             n->name);
+             agnameof(n));
        return;
     }
     alloc_elist(1, same[i].l);
@@ -89,7 +102,7 @@ static void sameedge(same_t * same, node_t * n, edge_t * e, char *id)
     same[i].arr_len = 0;
   set_arrow:
     arrow_flags(e, &sflag, &eflag);
-    if ((flag = e->head == n ? eflag : sflag))
+    if ((flag = aghead(e) == n ? eflag : sflag))
        same[i].arr_len =
            /* only consider arrows if there's exactly one arrow */
            (++same[i].n_arr == 1) ? arrow_length(e, flag) : 0;
@@ -121,10 +134,10 @@ static void sameport(node_t * u, elist * l, double arr_len)
        bring the angles within PI of each other. av(a,b)!=av(a,b+2*PI) */
     for (i = 0; i < l->size; i++) {
        e = l->list[i];
-       if (e->head == u)
-           v = e->tail;
+       if (aghead(e) == u)
+           v = agtail(e);
        else
-           v = e->head;
+           v = aghead(e);
        x1 = ND_coord(v).x - ND_coord(u).x;
        y1 = ND_coord(v).y - ND_coord(u).y;
        r = hypot(x1, y1);
@@ -138,7 +151,7 @@ static void sameport(node_t * u, elist * l, double arr_len)
     /* (x1,y1),(x2,y2) is a segment that must cross the node boundary */
     x1 = ND_coord(u).x;
     y1 = ND_coord(u).y;        /* center of node */
-    r = MAX(ND_lw(u) + ND_rw(u), ND_ht(u) + GD_ranksep(u->graph));     /* far away */
+    r = MAX(ND_lw(u) + ND_rw(u), ND_ht(u) + GD_ranksep(agraphof(u)));  /* far away */
     x2 = x * r + ND_coord(u).x;
     y2 = y * r + ND_coord(u).y;
     {                          /* now move (x1,y1) to the node boundary */
@@ -214,31 +227,31 @@ nodes and maintaining equal separation when specified
        for (; e; e = ED_to_virt(e)) {  /* assign to all virt edges of e */
            for (f = e; f;
                 f = ED_edge_type(f) == VIRTUAL &&
-                ND_node_type(f->head) == VIRTUAL &&
-                ND_out(f->head).size == 1 ?
-                ND_out(f->head).list[0] : NULL) {
-               if (f->head == u)
+                ND_node_type(aghead(f)) == VIRTUAL &&
+                ND_out(aghead(f)).size == 1 ?
+                ND_out(aghead(f)).list[0] : NULL) {
+               if (aghead(f) == u)
                    ED_head_port(f) = prt;
-               if (f->tail == u)
+               if (agtail(f) == u)
                    ED_tail_port(f) = prt;
            }
            for (f = e; f;
                 f = ED_edge_type(f) == VIRTUAL &&
-                ND_node_type(f->tail) == VIRTUAL &&
-                ND_in(f->tail).size == 1 ?
-                ND_in(f->tail).list[0] : NULL) {
-               if (f->head == u)
+                ND_node_type(agtail(f)) == VIRTUAL &&
+                ND_in(agtail(f)).size == 1 ?
+                ND_in(agtail(f)).list[0] : NULL) {
+               if (aghead(f) == u)
                    ED_head_port(f) = prt;
-               if (f->tail == u)
+               if (agtail(f) == u)
                    ED_tail_port(f) = prt;
            }
        }
 #else
        for (; e; e = ED_to_virt(e)) {  /* assign to all virt edges of e */
-           if (e->head == u)
+           if (aghead(e) == u)
                ED_head_port(e) =
                    arr_port.defined && !eflag ? arr_prt : prt;
-           if (e->tail == u)
+           if (agtail(e) == u)
                ED_tail_port(e) =
                    arr_port.defined && !sflag ? arr_prt : prt;
        }