1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
#include "cghdr.h"
static void agflatten_elist(Dict_t * d, Dtlink_t ** lptr, int flag)
{
dtrestore(d, *lptr);
dtmethod(d, flag? Dtlist : Dtoset);
*lptr = dtextract(d);
}
void agflatten_edges(Agraph_t * g, Agnode_t * n, int flag)
{
Agsubnode_t *sn;
Dtlink_t **tmp;
sn = agsubrep(g,n);
tmp = &(sn->out_seq); /* avoiding - "dereferencing type-punned pointer will break strict-aliasing rules" */
agflatten_elist(g->e_seq, tmp, flag);
tmp = &(sn->in_seq);
agflatten_elist(g->e_seq, tmp, flag);
}
void agflatten(Agraph_t * g, int flag)
{
Agnode_t *n;
if (flag) {
if (g->desc.flatlock == FALSE) {
dtmethod(g->n_seq,Dtlist);
for (n = agfstnode(g); n; n = agnxtnode(g,n))
agflatten_edges(g, n, flag);
g->desc.flatlock = TRUE;
}
} else {
if (g->desc.flatlock) {
dtmethod(g->n_seq,Dtoset);
for (n = agfstnode(g); n; n = agnxtnode(g,n))
agflatten_edges(g, n, flag);
g->desc.flatlock = FALSE;
}
}
}
void agnotflat(Agraph_t * g)
{
if (g->desc.flatlock)
agerr(AGERR, "flat lock broken");
}
|