GVC_t *gvc;
-static void gvinit()
+Agraph_t *graph(char *name)
{
- gvc = gvContext();
+ if (!gvc)
+ gvc = gvContext();
+ return agopen(name, AGRAPH);
}
Agraph_t *digraph(char *name)
{
- Agraph_t *g;
-
if (!gvc)
- gvinit();
- g = agopen(name, AGDIGRAPH);
- GD_drawing(g) = NULL;
- return g;
+ gvc = gvContext();
+ return agopen(name, AGDIGRAPH);
}
-Agraph_t *digraphstrict(char *name)
+Agraph_t *strictgraph(char *name)
{
- Agraph_t *g;
-
if (!gvc)
- gvinit();
- g = agopen(name, AGDIGRAPHSTRICT);
- GD_drawing(g) = NULL;
- return g;
+ gvc = gvContext();
+ return agopen(name, AGRAPHSTRICT);
}
-Agraph_t *graph(char *name)
+Agraph_t *strictdigraph(char *name)
{
- Agraph_t *g;
-
if (!gvc)
- gvinit();
- g = agopen(name, AGRAPH);
- GD_drawing(g) = NULL;
- return g;
+ gvc = gvContext();
+ return agopen(name, AGDIGRAPHSTRICT);
}
-Agraph_t *graphstrict(char *name)
+Agraph_t *readstring(char *string)
{
- Agraph_t *g;
-
if (!gvc)
- gvinit();
- g = agopen(name, AGRAPHSTRICT);
- GD_drawing(g) = NULL;
- return g;
+ gvc = gvContext();
+ return agmemread(string);
}
-Agraph_t *stringgraph(char *graphstring)
+Agraph_t *read(FILE *f)
{
- Agraph_t *g;
-
if (!gvc)
- gvinit();
- g = agmemread(graphstring);
- GD_drawing(g) = NULL;
- return g;
+ gvc = gvContext();
+ return agread(f);
}
-Agraph_t *readgraph(char *filename)
+Agraph_t *read(char *filename)
{
FILE *f;
Agraph_t *g;
- if (!gvc)
- gvinit();
f = fopen(filename, "r");
+ if (!f)
+ return NULL;
g = agread(f);
fclose(f);
- GD_drawing(g) = NULL;
return g;
}
return agedge(t->graph, t, h);
}
+Agedge_t *edge(char *tname, Agnode_t *h)
+{
+ return agedge(h->graph, agnode(h->graph, tname), h);
+}
+
+Agedge_t *edge(Agnode_t *t, char *hname)
+{
+ return agedge(t->graph, t, agnode(t->graph, hname));
+}
+
+Agedge_t *edge(Agraph_t *g, char *tname, char *hname)
+{
+ return agedge(g, agnode(g, tname), agnode(g, hname));
+}
+
//-------------------------------------------------
char *set(Agraph_t *g, Agsym_t *a)
{
return val;
}
//-------------------------------------------------
+Agraph_t *findsubg(Agraph_t *g, char *name)
+{
+ if (!g || !name)
+ return NULL;
+ return agfindsubg(g, name);
+}
+
Agnode_t *findnode(Agraph_t *g, char *name)
{
if (!g || !name)
return agfindnode(g, name);
}
+Agedge_t *findedge(Agnode_t *t, Agnode_t *h)
+{
+ if (!t || !h)
+ return NULL;
+ return agfindedge(t->graph, t, h);
+}
+
Agsym_t *findattr(Agraph_t *g, char *name)
{
if (!g || !name)
e = agnxtout(g, e);
if (e)
return (e);
- n = agnxtnode(g, n);
+ n = agnxtnode(g, e->tail);
if (!n)
return NULL;
return agfstout(g, n);
}
+Agedge_t *firstedge(Agraph_t *g)
+{
+ return firstout(g);
+}
+
+Agedge_t *nextedge(Agraph_t *g, Agedge_t *e)
+{
+ return nextout(g, e);
+}
+
Agedge_t *firstout(Agnode_t *n)
{
if (!n)
{
if (!n || !e)
return NULL;
- return (agnxtout(n->graph, e));
+ return agnxtout(n->graph, e);
}
+Agnode_t *firsthead(Agnode_t *n)
+{
+ Agedge_t *e;
+
+ if (!n)
+ return NULL;
+ e = agfstout(n->graph, n);
+ if (!e)
+ return NULL;
+ return e->head;
+}
+
+Agnode_t *nexthead(Agnode_t *n, Agnode_t *h)
+{
+ Agedge_t *e;
+
+ if (!n || !h)
+ return NULL;
+ e = agfindedge(n->graph, n, h);
+ if (!e)
+ return NULL;
+ do {
+ e = agnxtout(n->graph, e);
+ if (!e)
+ return NULL;
+ } while (e->head == h);
+ return e->head;
+}
+
+Agedge_t *firstedge(Agnode_t *n)
+{
+ if (!n)
+ return NULL;
+ return agfstedge(n->graph, n);
+}
+
+Agedge_t *nextedge(Agnode_t *n, Agedge_t *e)
+{
+ if (!n || !e)
+ return NULL;
+ return agnxtedge(n->graph, e, n);
+}
+
Agedge_t *firstin(Agraph_t *g)
{
Agnode_t *n;
n = agfstnode(g);
if (!n)
return NULL;
- return(agfstin(g, n));
+ return agfstin(g, n);
}
Agedge_t *nextin(Agraph_t *g, Agedge_t *e)
n = agnxtnode(g, n);
if (!n)
return NULL;
- return (agfstin(g, n));
+ return agfstin(g, n);
}
Agedge_t *firstin(Agnode_t *n)
{
if (!n)
return NULL;
- return(agfstin(n->graph, n));
+ return agfstin(n->graph, n);
}
Agedge_t *nextin(Agnode_t *n, Agedge_t *e)
{
if (!n || !e)
return NULL;
- return (agnxtin(n->graph, e));
+ return agnxtin(n->graph, e);
+}
+
+Agnode_t *firsttail(Agnode_t *n)
+{
+ Agedge_t *e;
+
+ if (!n)
+ return NULL;
+ e = agfstin(n->graph, n);
+ if (!e)
+ return NULL;
+ return e->tail;
+}
+
+Agnode_t *nexttail(Agnode_t *n, Agnode_t *t)
+{
+ Agedge_t *e;
+
+ if (!n || !t)
+ return NULL;
+ e = agfindedge(n->graph, t, n);
+ if (!e)
+ return NULL;
+ do {
+ e = agnxtout(n->graph, e);
+ if (!e)
+ return NULL;
+ } while (e->tail == t);
+ return e->tail;
}
Agnode_t *firstnode(Agraph_t *g)
{
- return (agfstnode(g));
+ return agfstnode(g);
}
Agnode_t *nextnode(Agraph_t *g, Agnode_t *n)
{
- return (agnxtnode(g, n));
+ return agnxtnode(g, n);
}
Agnode_t *firstnode(Agedge_t *e)
{
if (!e)
return NULL;
- return (e->tail);
+ return e->tail;
}
Agnode_t *nextnode(Agedge_t *e, Agnode_t *n)
{
if (!e || n != e->tail)
return NULL;
- return (e->head);
+ return e->head;
}
Agsym_t *firstattr(Agraph_t *g)
%}
/* new graph objects */
-extern Agraph_t *stringgraph(char *graphstring); /* from dot-formatted string */
-extern Agraph_t *readgraph(char *filename); /* from dot-formatted file */
+extern Agraph_t *graph(char *name); /* new empty graph */
+extern Agraph_t *digraph(char *name); /* new empty digraph */
+extern Agraph_t *strictgraph(char *name); /* new empty strict graph */
+extern Agraph_t *strictdigraph(char *name); /* new empty strict digraph */
-extern Agraph_t *digraphstrict(char *name); /* new empty digraphstrict */
-extern Agraph_t *graphstrict(char *name); /* new empty graphstrict */
-extern Agraph_t *digraph(char *name); /* new empty digraph */
-extern Agraph_t *graph(char *name); /* new empty graph */
+extern Agraph_t *readstring(char *string); /* from dot-formatted string */
+extern Agraph_t *read(char *filename); /* from dot-formatted file */
+extern Agraph_t *read(FILE *f); /* from dot-formatted file */
-extern Agraph_t *graph(Agraph_t *g, char *name); /* add new empty subgraph to existing graph */
-extern Agnode_t *node(Agraph_t *g, char *name); /* add new node to existing graph */
-extern Agedge_t *edge(Agnode_t *t, Agnode_t *h); /* add new edge between existing nodes */
+extern Agraph_t *graph(Agraph_t *g, char *name);/* add subgraph to graph */
+extern Agnode_t *node(Agraph_t *g, char *name); /* add node to graph */
+extern Agedge_t *edge(Agnode_t *t, Agnode_t *h);/* add edge between existing nodes */
+
+extern Agedge_t *edge(Agnode_t *t, char *hname);/* add edge, existing tail, named head which will be induced if necessary */
+extern Agedge_t *edge(char *tname, Agnode_t *h);/* add edge, named tail which will be induced if necessary, existing head */
+
+extern Agedge_t *edge(Agraph_t *g, char *tname, char *hname);/* add edge between named nodes, induced as necessary */
/* set/get attribute of graph/node/edge */
extern char *set(Agraph_t *g, char *attr, char *val=NULL);
//extern char *nameof(Agedge_t *e);
extern char *nameof(Agsym_t *a);
-extern Agsym_t *findnode(Agraph_t *g, char *name);
+extern Agraph_t *findsubg(Agraph_t *g, char *name);
+extern Agnode_t *findnode(Agraph_t *g, char *name);
+extern Agedge_t *findedge(Agnode_t *t, Agnode_t *h);
extern Agsym_t *findattr(Agraph_t *g, char *name);
extern Agsym_t *findattr(Agnode_t *n, char *name);
extern Agraph_t *firstsupg(Agraph_t *g);
extern Agraph_t *nextsupg(Agraph_t *g, Agraph_t *sg);
+extern Agedge_t *firstedge(Agraph_t *g);
+extern Agedge_t *nextedge(Agraph_t *g, Agedge_t *e);
+
extern Agedge_t *firstout(Agraph_t *g);
extern Agedge_t *nextout(Agraph_t *g, Agedge_t *e);
+extern Agedge_t *firstedge(Agnode_t *n);
+extern Agedge_t *nextedge(Agnode_t *n, Agedge_t *e);
+
extern Agedge_t *firstout(Agnode_t *n);
extern Agedge_t *nextout(Agnode_t *n, Agedge_t *e);
+extern Agnode_t *firsthead(Agnode_t *n);
+extern Agnode_t *nexthead(Agnode_t *n, Agnode_t *h);
+
extern Agedge_t *firstin(Agraph_t *g);
extern Agedge_t *nextin(Agnode_t *n, Agedge_t *e);
extern Agedge_t *firstin(Agnode_t *n);
extern Agedge_t *nextin(Agraph_t *g, Agedge_t *e);
+extern Agnode_t *firsttail(Agnode_t *n);
+extern Agnode_t *nexttail(Agnode_t *n, Agnode_t *t);
+
extern Agnode_t *firstnode(Agraph_t *g);
extern Agnode_t *nextnode(Agraph_t *g, Agnode_t *n);
gv.rm(m);
gv.rm(g);
- g = gv.stringgraph("digraph G {a->b}");
+ g = gv.readstring("digraph G {a->b}");
gv.rm(g);
- g = gv.readgraph("hello.dot");
+ g = gv.read("hello.dot");
gv.layout(g,"dot");
gv.render(g,"png", "hello.png");
gv.rm(g);
gv.rm(m);
gv.rm(g);
- g = gv.stringgraph("digraph G {a->b}");
+ g = gv.readstring("digraph G {a->b}");
gv.rm(g);
- g = gv.readgraph("hello.dot");
+ g = gv.read("hello.dot");
gv.layout(g,"dot");
gv.render(g,"png","hello.png");
gv.rm(g);
#gv::rm $m;
#gv::rm $g;
#
-#$g = gv::stringgraph "digraph G {a->b}";
+#$g = gv::readstring "digraph G {a->b}";
#gv::rm $g;
#
-#$g = gv::readgraph "hello.dot";
+#$g = gv::read "hello.dot";
#gv::layout($g, "dot");
#gv::render($g, "png", "hello.png");
#gv::rm $g;
gv::rm $m;
gv::rm $g;
-$g = gv::stringgraph "digraph G {a->b}";
+$g = gv::readstring "digraph G {a->b}";
gv::rm $g;
-$g = gv::readgraph "hello.dot";
+$g = gv::read "hello.dot";
gv::layout($g, "dot");
gv::render($g, "png", "hello.png");
gv::rm $g;
gv.rm(n)
gv.rm(g)
-g = gv.stringgraph("digraph G {a->b}")
+g = gv.readstring("digraph G {a->b}")
gv.rm(g)
-g = gv.readgraph("hello.dot")
+g = gv.read("hello.dot")
gv.layout(g, "dot")
gv.render(g, "png", "hello.png")
gv.rm(g)
Gv.rm(m)
Gv.rm(g)
-g = Gv.stringgraph("digraph G {a->b}")
+g = Gv.readstring("digraph G {a->b}")
Gv.rm(g)
-g = Gv.readgraph("hello.dot")
+g = Gv.read("hello.dot")
Gv.layout(g, "dot")
Gv.render(g, "png", "hello.png")
Gv.rm(g)
gv::rm $m
gv::rm $g
-set g [gv::stringgraph "digraph G {a->b}"]
+set g [gv::readstring "digraph G {a->b}"]
gv::rm $g
-set g [gv::readgraph hello.dot]
+set g [gv::read hello.dot]
for {set n [gv::firstnode $g]} {[gv::ok $n]} {set n [gv::nextnode $g $n]} {
puts [gv::nameof $n]
for {set a [gv::firstattr $n]} {[gv::ok $a]} {set a [gv::nextattr $n $a]} {