]> granicus.if.org Git - graphviz/commitdiff
Added agnodebefore() primitive
authorStephen C North <scnorth@gmail.com>
Sun, 10 May 2015 00:36:28 +0000 (20:36 -0400)
committerStephen C North <scnorth@gmail.com>
Sun, 10 May 2015 00:36:28 +0000 (20:36 -0400)
lib/cgraph/cgraph.h
lib/cgraph/main3.c
lib/cgraph/node.c

index 80b3a600be6408a41af0d7b3d5fafa290a10da90..b0b287fa1e920119eeeaa6c79a9113ccb193feee 100644 (file)
@@ -281,6 +281,7 @@ extern Agnode_t *aglstnode(Agraph_t * g);
 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,
index 7c196d6bd5aa7a63015d371046bb1b213f5878e3..f72a2ad08f0154ee610866c452adfb6545b53ed6 100644 (file)
@@ -1,24 +1,19 @@
 #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);
 }
index 3d9c483ba0c83d202e4304aad0617f9db40fee50..04ddf02e8f437df7890941c91d4b2570ecfd63fc 100644 (file)
@@ -330,3 +330,47 @@ Dtdisc_t Ag_subnode_seq_disc = {
     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;
+}