]> granicus.if.org Git - graphviz/commitdiff
Adds feature for graph postaction setting
authorStephen C North <scnorth@gmail.com>
Tue, 17 Dec 2019 17:05:48 +0000 (12:05 -0500)
committerStephen C North <scnorth@gmail.com>
Tue, 17 Dec 2019 17:05:48 +0000 (12:05 -0500)
lib/cgraph/cgraph.h
lib/cgraph/io.c
lib/common/input.c

index adc58d75024e323bd23b90a91f8f2c40d5e85032..36df70dc7ec6f47acd2bb9597858420942f0ceaf 100644 (file)
@@ -257,6 +257,7 @@ CGRAPH_API Agraph_t *agopen(char *name, Agdesc_t desc, Agdisc_t * disc);
 CGRAPH_API int agclose(Agraph_t * g);
 CGRAPH_API Agraph_t *agread(void *chan, Agdisc_t * disc);
 CGRAPH_API Agraph_t *agmemread(const char *cp);
+CGRAPH_API Agraph_t *agmemconcat(Agraph_t *g, const char *cp);
 CGRAPH_API void agreadline(int);
 CGRAPH_API void agsetfile(char *);
 CGRAPH_API Agraph_t *agconcat(Agraph_t * g, void *chan, Agdisc_t * disc);
index 51b7a1296bd19087cb1d1f36486dbec30afd42b9..5b17dc91a6a5cc4ba0349c7dbe5330256b31d9db 100644 (file)
@@ -128,7 +128,7 @@ memiofread(void *chan, char *buf, int bufsize)
 
 static Agiodisc_t memIoDisc = {memiofread, 0, 0};
 
-Agraph_t *agmemread(const char *cp)
+Agraph_t *agmemread0(Agraph_t *arg_g, const char *cp)
 {
     Agraph_t* g;
     rdr_t rdr;
@@ -143,7 +143,8 @@ Agraph_t *agmemread(const char *cp)
     disc.mem = &AgMemDisc;
     disc.id = &AgIdDisc;
     disc.io = &memIoDisc;  
-    g = agread (&rdr, &disc);
+    if (arg_g) g = agconcat(arg_g, &rdr, &disc);
+    else g = agread (&rdr, &disc);
     /* Null out filename and reset line number 
      * The name may have been set with a ppDirective, and
      * we want to reset line_num.
@@ -152,3 +153,12 @@ Agraph_t *agmemread(const char *cp)
     return g;
 }
 
+Agraph_t *agmemread(const char *cp)
+{
+    return agmemread0(0, cp);
+}
+
+Agraph_t *agmemconcat(Agraph_t *g, const char *cp)
+{
+    return agmemread0(g, cp);
+}
index f8a6b3446be23417c42a1e836d1c2b018a500c56..4e1a8d16a10437f8cdf234351bc103c77ac79069 100644 (file)
@@ -662,6 +662,13 @@ void graph_init(graph_t * g, boolean use_rankdir)
     int rankdir;
     GD_drawing(g) = NEW(layout_t);
 
+    /* reparseable input */
+    if ((p = agget(g, "postaction"))) {   /* requires a graph wrapper for yyparse */
+        char *buf = gmalloc(strlen("digraph {  }") + strlen(p) + 1);
+        sprintf(buf,"%s { %s }",agisdirected(g)?"digraph":"graph",p);
+        agmemconcat(g, buf);
+    }
+
     /* set this up fairly early in case any string sizes are needed */
     if ((p = agget(g, "fontpath")) || (p = getenv("DOTFONTPATH"))) {
        /* overide GDFONTPATH in local environment if dot
@@ -839,7 +846,6 @@ void graph_init(graph_t * g, boolean use_rankdir)
     GD_drawing(g)->xdots = init_xdot (g);
 
     /* initialize id, if any */
-
     if ((p = agget(g, "id")) && *p)
        GD_drawing(g)->id = strdup_and_subst_obj(p, g);
 }