/* isIn: * Return 1 if object objp is in subgraph gp. */ int isIn(Agraph_t * gp, Agobj_t * objp) { if (!sameG(gp, objp, "isIn", 0)) return 0; switch (AGTYPE(objp)) { case AGRAPH: return (agparent((Agraph_t *) objp) == gp); case AGNODE: return (agidnode(gp, AGID(objp), 0) != 0); default: return (agsubedge(gp, (Agedge_t *) objp, 0) != 0); } }
/* * initialize dictionaries, set seq, invoke init method of new graph */ Agraph_t *agopen1(Agraph_t * g) { Agraph_t *par; g->n_seq = agdtopen(g, &Ag_obj_seq_disc, Dttree); g->n_id = agdtopen(g, &Ag_obj_id_disc, Dttree); g->e_seq = agdtopen(g, &Ag_obj_seq_disc, Dttree); g->e_id = agdtopen(g, &Ag_edge_disc, Dttree); g->g_dict = agdtopen(g, &Ag_obj_id_disc, Dttree); par = agparent(g); if (par) { AGSEQ(g) = agnextseq(par, AGRAPH); dtinsert(par->g_dict, g); } /* else AGSEQ=0 */ if (g->desc.has_attrs) agraphattr_init(g, FALSE); agmethod_init(g, g); return g; }
/* * initialize dictionaries, set seq, invoke init method of new graph */ Agraph_t *agopen1(Agraph_t * g) { Agraph_t *par; g->n_seq = agdtopen(g, &Ag_subnode_seq_disc, Dttree); g->n_id = agdtopen(g, &Ag_subnode_id_disc, Dttree); g->e_seq = agdtopen(g, g == agroot(g)? &Ag_mainedge_seq_disc : &Ag_subedge_seq_disc, Dttree); g->e_id = agdtopen(g, g == agroot(g)? &Ag_mainedge_id_disc : &Ag_subedge_id_disc, Dttree); g->g_dict = agdtopen(g, &Ag_subgraph_id_disc, Dttree); par = agparent(g); if (par) { AGSEQ(g) = agnextseq(par, AGRAPH); dtinsert(par->g_dict, g); } /* else AGSEQ=0 */ if (!par || par->desc.has_attrs) agraphattr_init(g); agmethod_init(g, g); return g; }
/* * Close a graph or subgraph, freeing its storage. */ int agclose(Agraph_t * g) { Agraph_t *subg, *next_subg, *par; Agnode_t *n, *next_n; agflatten(g, FALSE); par = agparent(g); if ((par == NILgraph) && (AGDISC(g, mem)->close)) { /* free entire heap */ agmethod_delete(g, g); /* invoke user callbacks */ agfreeid(g, AGRAPH, AGID(g)); AGDISC(g, mem)->close(AGCLOS(g, mem)); /* whoosh */ return SUCCESS; } for (subg = agfstsubg(g); subg; subg = next_subg) { next_subg = agnxtsubg(subg); agclose(subg); } for (n = agfstnode(g); n; n = next_n) { next_n = agnxtnode(n); agdelnode(n); } aginternalmapclose(g); agmethod_delete(g, g); assert(dtsize(g->n_id) == 0); agdtclose(g, g->n_id); assert(dtsize(g->n_seq) == 0); agdtclose(g, g->n_seq); assert(dtsize(g->e_id) == 0); agdtclose(g, g->e_id); assert(dtsize(g->e_seq) == 0); agdtclose(g, g->e_seq); assert(dtsize(g->g_dict) == 0); agdtclose(g, g->g_dict); if (g->desc.has_attrs) agraphattr_delete(g); agrecclose((Agobj_t *) g); agfreeid(g, AGRAPH, AGID(g)); if (par) { agdelsubg(par, g); agfree(par, g); } else { Agmemdisc_t *memdisc; void *memclos, *clos; while (g->clos->cb) agpopdisc(g, g->clos->cb->f); AGDISC(g, id)->close(AGCLOS(g, id)); agstrclose(g); memdisc = AGDISC(g, mem); memclos = AGCLOS(g, mem); clos = g->clos; (memdisc->free) (memclos, g); (memdisc->free) (memclos, clos); } return SUCCESS; }