return a->name;
}
+//-------------------------------------------------
+bool ok(Agraph_t *g)
+{
+ if (!g)
+ return false;
+ return true;
+}
+bool ok(Agnode_t *n)
+{
+ if (!n)
+ return false;
+ return true;
+}
+bool ok(Agedge_t *e)
+{
+ if (!e)
+ return false;
+ return true;
+}
+bool ok(Agsym_t *a)
+{
+ if (!a)
+ return false;
+ return true;
+}
//-------------------------------------------------
Agraph_t *firstsubg(Agraph_t *g)
{
if (!g || !a)
return NULL;
g = g->root;
- i = a->index + 1;
+ for (i = 0; i < dtsize(g->univ->globattr->dict); i++)
+ if (a == g->univ->globattr->list[i])
+ break;
+ i++;
if (i > dtsize(g->univ->globattr->dict))
return NULL;
return g->univ->globattr->list[i];
if (!n || !a)
return NULL;
g = n->graph;
- i = a->index + 1;
+ for (i = 0; i < dtsize(g->univ->nodeattr->dict); i++)
+ if (a == g->univ->nodeattr->list[i])
+ break;
+ i++;
if (i > dtsize(g->univ->nodeattr->dict))
return NULL;
return g->univ->nodeattr->list[i];
if (!e || !a)
return NULL;
g = e->tail->graph;
- i = a->index + 1;
+ for (i = 0; i < dtsize(g->univ->edgeattr->dict); i++)
+ if (a == g->univ->edgeattr->list[i])
+ break;
+ i++;
if (i > dtsize(g->univ->edgeattr->dict))
return NULL;
return g->univ->edgeattr->list[i];
extern Agraph_t *rootof(Agraph_t *g);
/* iterators */
+extern bool ok(Agraph_t *g);
+extern bool ok(Agnode_t *n);
+extern bool ok(Agedge_t *e);
+extern bool ok(Agsym_t *a);
+
extern Agraph_t *firstsubg(Agraph_t *g);
extern Agraph_t *nextsubg(Agraph_t *g, Agraph_t *sg);
gv::rm $g
set g [gv::readgraph 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]} {
+ puts " [gv::nameof $a] [gv::set $n $a]"
+ }
+}
gv::layout $g dot
gv::writegraph $g hello.png png