/* cloneG: */ Agraph_t *cloneG(Agraph_t * g, char* name) { Agraph_t* ng; if (!name || (*name == '\0')) name = agnameof (g); ng = openG(name, g->desc); if (ng) { copyAttr((Agobj_t*)g, (Agobj_t*)ng); cloneGraph(ng, g); } return ng; }
/* 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; }
/* 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; }