int agmapnametoid(Agraph_t * g, int objtype, char *str, unsigned long *result, int createflag) { int rv; if (str && (str[0] != LOCALNAMEPREFIX)) { rv = AGDISC(g, id)->map(AGCLOS(g, id), objtype, str, result, createflag); if (rv) return rv; } /* either an internal ID, or disc. can't map strings */ if (str) { rv = aginternalmaplookup(g, objtype, str, result); if (rv) return rv; } else rv = 0; if (createflag) { /* get a new anonymous ID, and store in the internal map */ rv = AGDISC(g, id)->map(AGCLOS(g, id), objtype, NILstr, result, createflag); if (rv && str) aginternalmapinsert(g, objtype, str, *result); } return rv; }
char *agnameof(void *obj) { Agraph_t *g; char *rv; char buf[32]; /* perform internal lookup first */ g = agraphof(obj); if ((rv = aginternalmapprint(g, AGTYPE(obj), AGID(obj)))) return rv; if (AGDISC(g, id)->print) { if ((rv = AGDISC(g, id)->print(AGCLOS(g, id), AGTYPE(obj), AGID(obj)))) return rv; } if (AGTYPE(obj) != AGEDGE) sprintf(buf, "%c%ld", LOCALNAMEPREFIX, AGID(obj)); else buf[0] = 0; return agstrdup(g, buf); }
void agfreeid(Agraph_t * g, int objtype, unsigned long id) { (void) aginternalmapdelete(g, objtype, id); (AGDISC(g, id)->free) (AGCLOS(g, id), objtype, id); }
int agallocid(Agraph_t * g, int objtype, unsigned long request) { return AGDISC(g, id)->alloc(AGCLOS(g, id), objtype, request); }
static int ioput(Agraph_t * g, iochan_t * ofile, char *str) { return AGDISC(g, io)->putstr(ofile, str); }
/* * 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; }
/* register a graph object in an external namespace */ void agregister(Agraph_t * g, int objtype, void *obj) { AGDISC(g, id)->idregister(AGCLOS(g, id), objtype, obj); }
int agallocid(Agraph_t * g, int objtype, IDTYPE request) { return AGDISC(g, id)->alloc(AGCLOS(g, id), objtype, request); }