Exemple #1
0
Fichier : dtdisc.c Projet : att/ast
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;
}
Exemple #2
0
static int cnt(Dict_t * d, Dtlink_t ** set)
{
	int rv;
    dtrestore(d, *set);
    rv = dtsize(d);
    *set = dtextract(d);
	return rv;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}
Exemple #5
0
/* 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;
}
Exemple #6
0
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;
}
Exemple #7
0
/* 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;
}