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);
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;
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.
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);
+}
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
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);
}