]> granicus.if.org Git - graphviz/commitdiff
demo/modgraph.lua now demos built-in tred
authorJohn Ellson <john.ellson@comcast.net>
Sun, 18 Dec 2016 06:14:25 +0000 (01:14 -0500)
committerJohn Ellson <john.ellson@comcast.net>
Sun, 18 Dec 2016 06:14:25 +0000 (01:14 -0500)
cmd/tools/tred2.c
graphviz.spec.in
lib/common/types.h
lib/gvc/gvc.h
lib/gvc/gvtool_tred.c
tclpkg/gv/demo/modgraph.lua
tclpkg/gv/gv.cpp

index 088a48bd0dfc3f9d32467b17740d5411e2a60530..a11b4e22dec0912123599506bb0034c15985c06a 100644 (file)
@@ -87,20 +87,21 @@ int main(int argc, char **argv)
 {
     Agraph_t *g;
     ingraph_state ig;
+    int rc = 0;
 
     init(argc, argv);
     newIngraph(&ig, Files, gread);
 
     while ((g = nextGraph(&ig)) != 0) {
        if (agisdirected(g)) {
-            aginit(g, AGNODE, "info", sizeof(Agnodeinfo_t), TRUE);
-           gvToolTred(g);
+           if ((rc = gvToolTred(g)))
+                break;
             agwrite(g, stdout);
             fflush(stdout);
         }
        agclose(g);
     }
 
-    return 0;
+    return rc;
 }
 
index 5ba14a298d8241b421bb79fd767f1751743d6ba0..509196ffe022c13bf35f6e62b7dbb4ef4b58401a 100644 (file)
@@ -219,6 +219,7 @@ When used alone, this is intended for mimimalist web-server apps with no X11 on
 %endif
 %doc COPYING AUTHORS ChangeLog NEWS README
 %exclude %{_bindir}/dot_builtins
+%exclude %{_bindir}/tred2
 %{_bindir}/acyclic
 %{_bindir}/bcomps
 %{_bindir}/ccomps
index 8c9e0a305b1fdabb1e6500c80780ee211a240f42..933af78cda4754181ad15a876b06407b7e4f37ad 100644 (file)
@@ -406,7 +406,6 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind;
        char state;
        unsigned char gui_state; /* Node state for GUI ops */
        boolean clustnode;
-       int mark;           /* for tools like tred */
 
 #ifndef DOT_ONLY
        unsigned char pinned;
@@ -420,7 +419,7 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind;
        node_t *set;
 
        /* fast graph */
-       char node_type, onstack;
+       char node_type, mark, onstack;
        char ranktype, weight_class;
        node_t *next, *prev;
        elist in, out, flat_out, flat_in, other;
index 24cdada15bafbd2caa85cae6a1f6159323781102..3c9cb91af71cd096e1861d1b61204366e7f74b96 100644 (file)
@@ -116,7 +116,7 @@ extern void gvAddLibrary(GVC_t *gvc, gvplugin_library_t *lib);
 /** Perform a Transitive Reduction on a graph
  * @param g  graph to be transformed.
  */
-extern void gvToolTred(graph_t *g);
+extern int gvToolTred(graph_t *g);
 
 #undef extern
 
index d53e289a91e38eafa0e3e2d1975e0e7ddf7189f0..763a79d9add1b61e2a6b455c79fc833009372a6d 100644 (file)
 #include "cgraph.h"
 #include "gvc.h"
 
+typedef struct {
+    Agrec_t h;
+    int mark;
+} Agmarknodeinfo_t;
+
+#define MARK(n)  (((Agmarknodeinfo_t*)(n->base.data))->mark)
+
 #define agrootof(n) ((n)->root)
 
 static int dfs(Agnode_t * n, Agedge_t * link, int warn)
@@ -35,18 +42,18 @@ static int dfs(Agnode_t * n, Agedge_t * link, int warn)
     Agedge_t *f;
     Agraph_t *g = agrootof(n);
 
-    ND_mark(n) = 1;
+    MARK(n) = 1;
 
     for (e = agfstin(g, n); e; e = f) {
        f = agnxtin(g, e);
        if (e == link)
            continue;
-       if (ND_mark(agtail(e)))
+       if (MARK(agtail(e)))
            agdelete(g, e);
     }
 
     for (e = agfstout(g, n); e; e = agnxtout(g, e)) {
-       if (ND_mark(aghead(e))) {
+       if (MARK(aghead(e))) {
            if (!warn) {
                warn++;
                fprintf(stderr,
@@ -59,21 +66,24 @@ static int dfs(Agnode_t * n, Agedge_t * link, int warn)
            warn = dfs(aghead(e), AGOUT2IN(e), warn);
     }
 
-    ND_mark(n) = 0;
+    MARK(n) = 0;
     return warn;
 }
 
-void gvToolTred(Agraph_t * g)
+int gvToolTred(Agraph_t * g)
 {
     Agnode_t *n;
     int warn = 0;
 
     if (agisdirected(g)) {
+        aginit(g, AGNODE, "info", sizeof(Agmarknodeinfo_t), TRUE);
         for (n = agfstnode(g); n; n = agnxtnode(g, n)) {
            warn = dfs(n, NULL, warn);
         }
+        agclean(g, AGNODE, "info");
     } else {
        fprintf(stderr, "warning: %s is not a directed graph, not attempting tred\n",
                        agnameof(g));
     }
+    return 0;    // FIXME - return proper errors
 }
index 4cb83344ddb2fd5dff6584253f981ae8595730d3..f73d1f626b082f09fa00faac89d9062914ced4e7 100755 (executable)
@@ -23,8 +23,7 @@ gv.setv(E, 'arrowsize', '.4')
 
 for rec in modules do
 
-   -- note - Lua's "gfind" in 5.1 became "fmatch" in 5.2
-
+   -- note - Lua's "string.gfind" in 5.1 became "string.gmatch" in 5.2
 
    for mod, usedbylist in string.gmatch(rec, "([_%w]+) %w+ %w+ ([-,_%w]+)") do
       n = gv.node(G, mod)
@@ -36,5 +35,7 @@ for rec in modules do
    end
 end
 
+gv.tred(G)
+
 gv.layout(G, 'dot')
 gv.render(G, 'gtk')
index 097fc5b6ba445d734d732cbac12d56eb658bc766..1136b212423bf6473c8de36e35dc69e2b29dbffc 100644 (file)
@@ -950,11 +950,11 @@ bool write(Agraph_t *g, const char *filename)
 
 bool tred(Agraph_t *g)
 {
-    int err = 0;
+    int err;
 
     if (!g)
         return false;
-    gvToolTred(g);    // FIXME - gvToolTred should rteturn errors code
+    err = gvToolTred(g);
     return (! err);
 }