]> granicus.if.org Git - graphviz/commitdiff
add framework for "dot -P"
authorellson <devnull@localhost>
Mon, 13 Oct 2008 21:15:32 +0000 (21:15 +0000)
committerellson <devnull@localhost>
Mon, 13 Oct 2008 21:15:32 +0000 (21:15 +0000)
cmd/dot/dot.c
lib/common/input.c
lib/gvc/gvc.h
lib/gvc/gvcproc.h
lib/gvc/gvplugin.c

index 4c17da1a6c06ef8d344fdcb357bf804827cdf13a..97fee127995d0e6aaea3a78f31da90645653c425 100644 (file)
@@ -167,11 +167,13 @@ int main(int argc, char **argv)
            /* Perform layout and cleanup */
            gvLayoutJobs(Gvc, G);  /* take layout engine from command line */
            gvFreeLayout(Gvc, G);
-
-           /* Delete graph */
-           agclose(G);
        }
-    } else {
+    }
+    else if ((G = gvPluginsGraph(Gvc))) {
+           gvLayoutJobs(Gvc, G);  /* take layout engine from command line */
+           gvRenderJobs(Gvc, G);
+    }
+    else {
        while ((G = gvNextInputGraph(Gvc))) {
            if (prev) {
                gvFreeLayout(Gvc, prev);
index 8918bcaaeaf29b19468fe8745d0ff550bf117fb6..4e628cc340b6273cbebc6d5cbdd687139d155704 100644 (file)
@@ -32,6 +32,7 @@ static char *genericItems = "\n\
  -lv         - Use external library 'v'\n\
  -ofile      - Write output to 'file'\n\
  -O          - Automatically generate an output filename based on the input filename with a .'format' appended. (Causes all -ofile options to be ignored.) \n\
+ -P          - Internally generate a graph of the current plugins. \n\
  -q[l]       - Set level of message suppression (=1)\n\
  -s[v]       - Scale input by 'v' (=72)\n\
  -y          - Invert y coordinate in output\n";
@@ -180,6 +181,30 @@ void global_def(const char *dcl,
     sym->fixed = 1;
 }
 
+static void gvg_init(GVC_t *gvc, graph_t *g, char *fn, int gidx)
+{
+    GVG_t *gvg;
+
+    gvg = zmalloc(sizeof(GVG_t));
+    if (!gvc->gvgs) 
+       gvc->gvgs = gvg;
+    else
+       gvc->gvg->next = gvg;
+    gvc->gvg = gvg;
+    gvg->gvc = gvc;
+    gvg->g = g;
+    gvg->input_filename = fn;
+    gvg->graph_index = gidx;
+}
+
+static graph_t *P_graph;
+
+graph_t *gvPluginsGraph(GVC_t *gvc)
+{
+    gvg_init(gvc, P_graph, "<internal>", 0);
+    return P_graph;
+}
+
 void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
 {
     char c;
@@ -275,6 +300,9 @@ void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
                     exit(1);
                 }
                break;
+           case 'P':
+               P_graph = gvplugin_graph(gvc);
+               break;
            case 'V':
                fprintf(stderr, "%s - %s version %s (%s)\n",
                        gvc->common.cmdname, gvc->common.info[0], 
@@ -441,7 +469,6 @@ graph_t *gvNextInputGraph(GVC_t *gvc)
     static char *fn;
     static FILE *fp;
     static int fidx, gidx;
-    GVG_t *gvg;
 
     while (!g) {
        if (!fp) {
@@ -465,16 +492,7 @@ graph_t *gvNextInputGraph(GVC_t *gvc)
        g = agread(fp);
 #endif
        if (g) {
-           gvg = zmalloc(sizeof(GVG_t));
-           if (!gvc->gvgs) 
-               gvc->gvgs = gvg;
-           else
-               gvc->gvg->next = gvg;
-           gvc->gvg = gvg;
-           gvg->gvc = gvc;
-           gvg->g = g;
-           gvg->input_filename = fn;
-           gvg->graph_index = gidx++;
+           gvg_init(gvc, g, fn, gidx++);
            break;
        }
        fp = NULL;
index 9d0f21cd1d1d1f8be7fa791e8f26f274816b708e..194cfe65066d8c3189d6e293d8703fd535f854c3 100644 (file)
@@ -70,6 +70,7 @@ extern char *gvcUsername(GVC_t*);
 /* parse command line args - minimally argv[0] sets layout engine */
 extern int gvParseArgs(GVC_t *gvc, int argc, char **argv);
 extern graph_t *gvNextInputGraph(GVC_t *gvc);
+extern graph_t *gvPluginsGraph(GVC_t *gvc);
 
 /* Compute a layout using a specified engine */
 extern int gvLayout(GVC_t *gvc, graph_t *g, const char *engine);
index a3ea7948018a43c9b6adfc7a0b974a617d26bf90..25d36ebe72419aa9c08fc5513c3925e47d3ae320 100644 (file)
@@ -43,6 +43,8 @@ extern "C" {
     extern void gvplugin_write_status(GVC_t * gvc);
     extern char *gvplugin_list(GVC_t * gvc, api_t api, const char *str);
 
+    extern Agraph_t * gvplugin_graph(GVC_t * gvc);
+
 /* job */
 
     extern void gvjobs_output_filename(GVC_t * gvc, const char *name);
index b9389e484d5db65ee1e138171da89d55c3b27cc8..fd113cf492ca3c69d6b2186814f937c218e5634d 100644 (file)
@@ -31,6 +31,8 @@
 #include        "gvcint.h"
 #include        "gvcproc.h"
 
+#include       "const.h"
+
 extern const int Demand_Loading;
 
 /*
@@ -454,3 +456,18 @@ void gvplugin_write_status(GVC_t * gvc)
     }
 
 }
+
+Agraph_t * gvplugin_graph(GVC_t * gvc)
+{
+    Agraph_t *g;
+    Agnode_t *n;
+
+    aginit();
+    /* set persistent attributes here */
+    agnodeattr(NULL, "label", NODENAME_ESC);
+
+    g = agopen("G", AGDIGRAPH);
+    n = agnode(g, "plugins graph under-construction");
+
+    return g;
+}