#pragma prototyped
#include <aghdr.h>
#ifdef DMALLOC
#include "dmalloc.h"
#endif
static Agobj_t *subnode_search(Agraph_t *sub, Agobj_t *n)
{
if (agraphof(n) == sub) return n;
return (Agobj_t*)agsubnode(sub,(Agnode_t*)n,FALSE);
}
static Agobj_t *subedge_search(Agraph_t *sub, Agobj_t *e)
{
if (agraphof(e) == sub) return e;
return (Agobj_t*)agsubedge(sub,(Agedge_t*)e,FALSE);
}
static Agobj_t *subgraph_search(Agraph_t *sub, Agobj_t *g)
{
NOTUSED(g);
return (Agobj_t*)sub;
}
static void rec_apply(Agraph_t *g, Agobj_t *obj, agobjfn_t fn, void *arg,
agobjsearchfn_t objsearch, int preorder)
{
Agraph_t *sub;
Agobj_t *subobj;
if (preorder) fn(obj,arg);
for (sub = agfstsubg(g); sub; sub = agnxtsubg(sub)) {
if ((subobj = objsearch(sub,obj)))
rec_apply(sub,subobj,fn,arg,objsearch,preorder);
}
if (NOT(preorder)) fn(obj,arg);
}
int agapply(Agraph_t *g, Agobj_t* obj, agobjfn_t fn, void *arg, int preorder)
{
Agobj_t *subobj;
agobjsearchfn_t objsearch;
switch(AGTYPE(obj)) {
case AGRAPH: objsearch = subgraph_search; break;
case AGNODE: objsearch = subnode_search; break;
case AGOUTEDGE: case AGINEDGE: objsearch = subedge_search; break;
default: abort();
}
if ((subobj = objsearch(g,obj))) {
rec_apply(g,subobj,fn,arg,objsearch,preorder);
return SUCCESS;
}
else return FAILURE;
}