/* clone: * Create new object of type AGTYPE(obj) with all of its * attributes and substructure. * If obj is an edge, end nodes are cloned if necessary. * If obj is a graph, if g is null, create a clone top-level * graph. Otherwise, create a clone subgraph of g. * Assume obj != NULL. */ Agobj_t *clone(Agraph_t * g, Agobj_t * obj) { Agobj_t *nobj = 0; Agedge_t *e; Agnode_t *h; Agnode_t *t; int kind = AGTYPE(obj); char *name; if ((kind != AGRAPH) && !g) { exerror("NULL graph with non-graph object in clone()"); return 0; } switch (kind) { case AGNODE: /* same as copy node */ name = agnameof(obj); nobj = (Agobj_t *) openNode(g, name); if (nobj) copyAttr(obj, nobj); break; case AGRAPH: name = agnameof(obj); if (g) nobj = (Agobj_t *) openSubg(g, name); else nobj = (Agobj_t *) openG(name, ((Agraph_t *) obj)->desc); if (nobj) { copyAttr(obj, nobj); cloneGraph((Agraph_t *) nobj, (Agraph_t *) obj); } break; case AGINEDGE: case AGOUTEDGE: e = (Agedge_t *) obj; t = (Agnode_t *) clone(g, OBJ(agtail(e))); h = (Agnode_t *) clone(g, OBJ(aghead(e))); name = agnameof (AGMKOUT(e)); nobj = (Agobj_t *) openEdge(g, t, h, name); if (nobj) copyAttr(obj, nobj); break; } return nobj; }
/* compOf: * Return connected component of node. */ Agraph_t *compOf(Agraph_t * g, Agnode_t * n) { Agraph_t *cg; Agnode_t *np; static int id; char name[64]; if (!(n = agidnode(g, AGID(n), 0))) return 0; /* n not in g */ for (np = agfstnode(g); np; np = agnxtnode(g, np)) CCUNMARK(np); sprintf(name, "_cc_%d", id++); cg = openSubg(g, name); cc_dfs(g, cg, n); return cg; }
/* copy: * Create new object of type AGTYPE(obj) with all of its * attributes. * If obj is an edge, only create end nodes if necessary. * If obj is a graph, if g is null, create a top-level * graph. Otherwise, create a subgraph of g. * Assume obj != NULL. */ Agobj_t *copy(Agraph_t * g, Agobj_t * obj) { Agobj_t *nobj = 0; Agedge_t *e; Agnode_t *h; Agnode_t *t; int kind = AGTYPE(obj); char *name = agnameof(obj); if ((kind != AGRAPH) && !g) { error(ERROR_FATAL, "NULL graph with non-graph object in copy()"); return 0; } switch (kind) { case AGNODE: nobj = (Agobj_t *) openNode(g, name); break; case AGRAPH: if (g) nobj = (Agobj_t *) openSubg(g, name); else nobj = (Agobj_t *) openG(name, ((Agraph_t *) obj)->desc); break; case AGEDGE: e = (Agedge_t *) obj; t = openNode(g, agnameof(agtail(e))); h = openNode(g, agnameof(aghead(e))); nobj = (Agobj_t *) openEdge(t, h, name); break; } if (nobj) copyAttr(obj, nobj); return nobj; }