extern Agnode_t *agprvnode(Agraph_t * g, Agnode_t * n);
extern Agsubnode_t *agsubrep(Agraph_t * g, Agnode_t * n);
+extern int agnodebefore(Agnode_t *u, Agnode_t *v); /* we have no shame */
/* edges */
extern Agedge_t *agedge(Agraph_t * g, Agnode_t * t, Agnode_t * h,
#include <stdio.h>
#include "cgraph.h"
-#include "bla.h"
int main(int argc, char **argv)
{
Agraph_t *g;
- Agnode_t *n;
- Agnoderef_t *nref;
- Agedge_t *e;
- Agedgeref_t *eref;
+ Agnode_t *u, *v;
+ int rv;
g = agread(stdin,0);
- for (nref = FIRSTNREF(g); nref; nref = NEXTNREF(nref)) {
- n = NODEOF(nref);
- fprintf(stderr,"%s\n",agnameof(n));
- for (eref = FIRSTOUTREF(g,nref); eref; eref = NEXTEREF(nref,eref)) {
- e = EDGEOF(nref,eref);
- fprintf(stderr,"\t %s ", agnameof(agtail(e)));
- fprintf(stderr,"-> %s\n", agnameof(aghead(e)));
- }
+ if (argc >= 3) {
+ u = agnode(g,argv[1],FALSE);
+ v = agnode(g,argv[2],FALSE);
+ rv = agnodebefore(u,v);
+ fprintf(stderr,"agnodebefore returns %d\n",rv);
+ fprintf(stderr,"dtsize %d\n",dtsize(g->n_seq));
}
- return 1;
+ agwrite(g,stdout);
}
agdictobjmem,
NIL(Dtevent_f)
};
+
+void agnodesetfinger(Agraph_t * g, Agnode_t * n, void *ignored)
+{
+ static Agsubnode_t template;
+ template.node = n;
+ dtsearch(g->n_seq,&template);
+ NOTUSED(ignored);
+}
+
+void agnoderenew(Agraph_t * g, Agnode_t * n, void *ignored)
+{
+ dtrenew(g->n_seq, dtfinger(g->n_seq));
+ NOTUSED(n);
+ NOTUSED(ignored);
+}
+
+int agnodebefore(Agnode_t *fst, Agnode_t *snd)
+{
+ Agraph_t *g;
+ Agnode_t *n, *nxt;
+
+
+ g = agroot(fst);
+ if (AGSEQ(fst) > AGSEQ(snd)) return SUCCESS;
+
+ /* move snd out of the way somewhere */
+ n = snd;
+ if (agapply (g, (Agobj_t *) n, (agobjfn_t) agnodesetfinger, n, FALSE) != SUCCESS) return FAILURE;
+ AGSEQ(snd) = (g->clos->seq[AGNODE] + 2);
+ if (agapply (g, (Agobj_t *) n, (agobjfn_t) agnoderenew, n, FALSE) != SUCCESS) return FAILURE;
+ n = agprvnode(g,snd);
+ do {
+ nxt = agprvnode(g,n);
+ if (agapply (g, (Agobj_t *) n, (agobjfn_t) agnodesetfinger, n, FALSE) != SUCCESS) return FAILURE;
+ AGSEQ(n) = AGSEQ(n) + 1;
+ if (agapply (g, (Agobj_t *) n, (agobjfn_t) agnoderenew, n, FALSE) != SUCCESS) return FAILURE;
+ if (n == fst) break;
+ n = nxt;
+ } while (n);
+ if (agapply (g, (Agobj_t *) snd, (agobjfn_t) agnodesetfinger, n, FALSE) != SUCCESS) return FAILURE;
+ AGSEQ(snd) = AGSEQ(fst) - 1;
+ if (agapply (g, (Agobj_t *) snd, (agobjfn_t) agnoderenew, snd, FALSE) != SUCCESS) return FAILURE;
+ return SUCCESS;
+}