Dtdisc_t *dtdisc(Dt_t *dt, Dtdisc_t *disc, int type) { Dtdisc_t *old; Dtlink_t *list; if (!(old = dt->disc)) /* initialization call from dtopen() */ { dt->disc = disc; if (!(dt->memoryf = disc->memoryf)) dt->memoryf = dtmemory; return disc; } if (!disc) { /* only want to know current discipline */ return old; } if (old->eventf && (*old->eventf)(dt, DT_DISC, (void *)disc, old) < 0) return NULL; if ((type & (DT_SAMEHASH | DT_SAMECMP)) != (DT_SAMEHASH | DT_SAMECMP)) { list = dtextract(dt); /* grab the list of objects if any */ } else { list = NULL; } dt->disc = disc; if (!(dt->memoryf = disc->memoryf)) dt->memoryf = dtmemory; if (list) { /* reinsert extracted objects (with new discipline) */ dtrestore(dt, list); } return old; }
static int cnt(Dict_t * d, Dtlink_t ** set) { int rv; dtrestore(d, *set); rv = dtsize(d); *set = dtextract(d); return rv; }
Dtmethod_t *dtmethod(Dt_t *dt, Dtmethod_t *meth) { Dtlink_t *list; Dtdisc_t *disc = dt->disc; Dtmethod_t *oldmt = dt->meth; Dtdata_t *newdt, *olddt = dt->data; if (!meth || meth == oldmt) return oldmt; /* ask discipline if switching to new method is ok */ if (disc->eventf && (*disc->eventf)(dt, DT_METH, (void *)meth, disc) < 0) return NULL; list = dtextract(dt); /* extract elements out of dictionary */ /* try to create internal structure for new method */ if (dt->searchf == oldmt->searchf) { /* ie, not viewpathing */ dt->searchf = meth->searchf; } dt->meth = meth; dt->data = NULL; if ((*dt->meth->eventf)(dt, DT_OPEN, NULL) < 0) { newdt = NULL; } else { newdt = dt->data; } /* see what need to be done to data of the old method */ if (dt->searchf == meth->searchf) dt->searchf = oldmt->searchf; dt->meth = oldmt; dt->data = olddt; if (newdt) { // switch was successful, remove old data (void)(*dt->meth->eventf)(dt, DT_CLOSE, NULL); if (dt->searchf == oldmt->searchf) dt->searchf = meth->searchf; dt->meth = meth; dt->data = newdt; dtrestore(dt, list); return oldmt; } // Switch failed, restore dictionary to previous states. dtrestore(dt, list); return NULL; }
Agedge_t *agfstin(Agraph_t * g, Agnode_t * n) { Agsubnode_t *sn; Agedge_t *e = NILedge; sn = agsubrep(g, n); dtrestore(g->e_seq, sn->in_seq); e = (Agedge_t *) dtfirst(g->e_seq); sn->in_seq = dtextract(g->e_seq); return e; }
/* return first outedge of <n> */ Agedge_t *agfstout(Agraph_t * g, Agnode_t * n) { Agsubnode_t *sn; Agedge_t *e = NILedge; sn = agsubrep(g, n); if (sn) { dtrestore(g->e_seq, sn->out_seq); e = (Agedge_t *) dtfirst(g->e_seq); sn->out_seq = dtextract(g->e_seq); } return e; }
Agedge_t *agnxtin(Agraph_t * g, Agedge_t * e) { Agnode_t *n; Agsubnode_t *sn; Agedge_t *f; n = AGHEAD(e); sn = agsubrep(g, n); dtrestore(g->e_seq, sn->in_seq); f = (Agedge_t *) dtnext(g->e_seq, e); sn->in_seq = dtextract(g->e_seq); return f; }
/* return outedge that follows <e> of <n> */ Agedge_t *agnxtout(Agraph_t * g, Agedge_t * e) { Agnode_t *n; Agsubnode_t *sn; Agedge_t *f = NILedge; n = AGTAIL(e); sn = agsubrep(g, n); if (sn) { dtrestore(g->e_seq, sn->out_seq); f = (Agedge_t *) dtnext(g->e_seq, e); sn->out_seq = dtextract(g->e_seq); } return f; }