]> granicus.if.org Git - graphviz/commitdiff
clang-format tclpkg/gv/gv.cpp
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Thu, 2 Sep 2021 02:07:22 +0000 (19:07 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Tue, 7 Sep 2021 14:20:21 +0000 (07:20 -0700)
tclpkg/gv/gv.cpp

index cb00a55d588c9cba847d035bf743f28aea25169f..aa944d9b6600d61fec55e2d31537cd09280ec402 100644 (file)
@@ -1,5 +1,5 @@
 /*************************************************************************
- * Copyright (c) 2011 AT&T Intellectual Property 
+ * Copyright (c) 2011 AT&T Intellectual Property
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,8 +8,8 @@
  * Contributors: Details at https://graphviz.org
  *************************************************************************/
 
-#include <cstring>
 #include <cstdlib>
+#include <cstring>
 #include <gvc/gvc.h>
 #include <string>
 
@@ -19,835 +19,726 @@ extern void gv_channel_writer_init(GVC_t *gvc);
 extern void gv_writer_reset(GVC_t *gvc);
 }
 
-#define agfindattr(x,s) agattrsym(x,s)
-#define agraphattr(g,n,s) agattr(g,AGRAPH,n,s)
-#define agnodeattr(g,n,s) agattr(g,AGNODE,n,s)
-#define agedgeattr(g,n,s) agattr(g,AGEDGE,n,s)
+#define agfindattr(x, s) agattrsym(x, s)
+#define agraphattr(g, n, s) agattr(g, AGRAPH, n, s)
+#define agnodeattr(g, n, s) agattr(g, AGNODE, n, s)
+#define agedgeattr(g, n, s) agattr(g, AGEDGE, n, s)
 
 static char emptystring[] = {'\0'};
 
 static GVC_t *gvc;
 
 static void gv_init(void) {
-    /* list of builtins, enable demand loading */
-    gvc = gvContextPlugins(lt_preloaded_symbols, DEMAND_LOADING);
+  // list of builtins, enable demand loading
+  gvc = gvContextPlugins(lt_preloaded_symbols, DEMAND_LOADING);
 }
 
-Agraph_t *graph(char *name)
-{
-    if (!gvc)
-        gv_init();
-    return agopen(name, Agundirected, 0);
+Agraph_t *graph(char *name) {
+  if (!gvc)
+    gv_init();
+  return agopen(name, Agundirected, 0);
 }
 
-Agraph_t *digraph(char *name)
-{
-    if (!gvc)
-        gv_init();
-    return agopen(name, Agdirected, 0);
+Agraph_t *digraph(char *name) {
+  if (!gvc)
+    gv_init();
+  return agopen(name, Agdirected, 0);
 }
 
-Agraph_t *strictgraph(char *name)
-{
-    if (!gvc)
-        gv_init();
-    return agopen(name, Agstrictundirected, 0);
+Agraph_t *strictgraph(char *name) {
+  if (!gvc)
+    gv_init();
+  return agopen(name, Agstrictundirected, 0);
 }
 
-Agraph_t *strictdigraph(char *name)
-{
-    if (!gvc)
-        gv_init();
-    return agopen(name, Agstrictdirected, 0);
+Agraph_t *strictdigraph(char *name) {
+  if (!gvc)
+    gv_init();
+  return agopen(name, Agstrictdirected, 0);
 }
 
-Agraph_t *readstring(char *string)
-{
-    if (!gvc)
-        gv_init();
-    return agmemread(string);
+Agraph_t *readstring(char *string) {
+  if (!gvc)
+    gv_init();
+  return agmemread(string);
 }
 
-Agraph_t *read(FILE *f)
-{
-    if (!gvc)
-        gv_init();
-    return agread(f, nullptr);
+Agraph_t *read(FILE *f) {
+  if (!gvc)
+    gv_init();
+  return agread(f, nullptr);
 }
 
-Agraph_t *read(const char *filename)
-{
-    FILE *f = fopen(filename, "r");
-    if (!f)
-        return nullptr;
-    if (!gvc)
-        gv_init();
-    Agraph_t *g = agread(f, nullptr);
-    fclose(f);
-    return g;
+Agraph_t *read(const char *filename) {
+  FILE *f = fopen(filename, "r");
+  if (!f)
+    return nullptr;
+  if (!gvc)
+    gv_init();
+  Agraph_t *g = agread(f, nullptr);
+  fclose(f);
+  return g;
 }
 
 //-------------------------------------------------
-Agraph_t *graph(Agraph_t *g, char *name)
-{
-    if (!gvc)
-        gv_init();
-    return agsubg(g, name, 1);
+Agraph_t *graph(Agraph_t *g, char *name) {
+  if (!gvc)
+    gv_init();
+  return agsubg(g, name, 1);
 }
 
-Agnode_t *node(Agraph_t *g, char *name)
-{
-    if (!gvc)
-        return nullptr;
-    return agnode(g, name, 1);
+Agnode_t *node(Agraph_t *g, char *name) {
+  if (!gvc)
+    return nullptr;
+  return agnode(g, name, 1);
 }
 
-Agedge_t *edge(Agraph_t* g, Agnode_t *t, Agnode_t *h)
-{
-    if (!gvc || !t || !h || !g)
-        return nullptr;
-    // edges from/to the protonode are not permitted
-    if (AGTYPE(t) == AGRAPH || AGTYPE(h) == AGRAPH)
-       return nullptr;
-    return agedge(g, t, h, nullptr, 1);
+Agedge_t *edge(Agraph_t *g, Agnode_t *t, Agnode_t *h) {
+  if (!gvc || !t || !h || !g)
+    return nullptr;
+  // edges from/to the protonode are not permitted
+  if (AGTYPE(t) == AGRAPH || AGTYPE(h) == AGRAPH)
+    return nullptr;
+  return agedge(g, t, h, nullptr, 1);
 }
 
-Agedge_t *edge(Agnode_t *t, Agnode_t *h)
-{
-    return edge(agraphof(t), t, h);
-}
+Agedge_t *edge(Agnode_t *t, Agnode_t *h) { return edge(agraphof(t), t, h); }
 
 // induce tail if necessary
-Agedge_t *edge(char *tname, Agnode_t *h)
-{
-    return edge(node(agraphof(h), tname), h);
+Agedge_t *edge(char *tname, Agnode_t *h) {
+  return edge(node(agraphof(h), tname), h);
 }
 
 // induce head if necessary
-Agedge_t *edge(Agnode_t *t, char *hname)
-{
-    return edge(t, node(agraphof(t), hname));
+Agedge_t *edge(Agnode_t *t, char *hname) {
+  return edge(t, node(agraphof(t), hname));
 }
 
 // induce tail/head if necessary
-Agedge_t *edge(Agraph_t *g, char *tname, char *hname)
-{
-    return edge(g, node(g, tname), node(g, hname));
+Agedge_t *edge(Agraph_t *g, char *tname, char *hname) {
+  return edge(g, node(g, tname), node(g, hname));
 }
 
 //-------------------------------------------------
-static char* myagxget(void *obj, Agsym_t *a)
-{
-    if (!obj || !a)
-        return emptystring;
-    char *val = agxget(obj, a);
-    if (!val)
-        return emptystring;
-    if (strcmp(a->name, "label") == 0 && aghtmlstr(val)) {
-        size_t len = strlen(val);
-        auto hs = reinterpret_cast<char*>(malloc(len + 3));
-        hs[0] = '<';
-        strcpy(hs+1, val);
-        hs[len+1] = '>';
-        hs[len+2] = '\0';
-        return hs;
-    }
-    return val;
-}
-char *getv(Agraph_t *g, Agsym_t *a)
-{
-    return myagxget(g, a);
-}
-char *getv(Agraph_t *g, char *attr)
-{
-    if (!g || !attr)
-        return nullptr;
-    Agsym_t *a = agfindattr(agroot(g), attr);
-    return myagxget(g, a);
-}
-static void myagxset(void *obj, Agsym_t *a, char *val)
-{
-    if (strcmp(a->name, "label") == 0 && val[0] == '<') {
-        size_t len = strlen(val);
-        if (val[len-1] == '>') {
-            std::string hs(val + 1, len - 2);
-            val = agstrdup_html(agraphof(obj), hs.c_str());
-        }
+static char *myagxget(void *obj, Agsym_t *a) {
+  if (!obj || !a)
+    return emptystring;
+  char *val = agxget(obj, a);
+  if (!val)
+    return emptystring;
+  if (strcmp(a->name, "label") == 0 && aghtmlstr(val)) {
+    size_t len = strlen(val);
+    auto hs = reinterpret_cast<char *>(malloc(len + 3));
+    hs[0] = '<';
+    strcpy(hs + 1, val);
+    hs[len + 1] = '>';
+    hs[len + 2] = '\0';
+    return hs;
+  }
+  return val;
+}
+char *getv(Agraph_t *g, Agsym_t *a) { return myagxget(g, a); }
+char *getv(Agraph_t *g, char *attr) {
+  if (!g || !attr)
+    return nullptr;
+  Agsym_t *a = agfindattr(agroot(g), attr);
+  return myagxget(g, a);
+}
+static void myagxset(void *obj, Agsym_t *a, char *val) {
+  if (strcmp(a->name, "label") == 0 && val[0] == '<') {
+    size_t len = strlen(val);
+    if (val[len - 1] == '>') {
+      std::string hs(val + 1, len - 2);
+      val = agstrdup_html(agraphof(obj), hs.c_str());
     }
-    agxset(obj, a, val);
+  }
+  agxset(obj, a, val);
 }
-char *setv(Agraph_t *g, Agsym_t *a, char *val)
-{
-    if (!g || !a || !val)
-        return nullptr;
-    myagxset(g, a, val);
-    return val;
+char *setv(Agraph_t *g, Agsym_t *a, char *val) {
+  if (!g || !a || !val)
+    return nullptr;
+  myagxset(g, a, val);
+  return val;
 }
-char *setv(Agraph_t *g, char *attr, char *val)
-{
-    if (!g || !attr || !val)
-        return nullptr;
-    Agsym_t *a = agfindattr(agroot(g), attr);
-    if (!a)
-        a = agraphattr(g->root, attr, emptystring);
-    myagxset(g, a, val);
-    return val;
+char *setv(Agraph_t *g, char *attr, char *val) {
+  if (!g || !attr || !val)
+    return nullptr;
+  Agsym_t *a = agfindattr(agroot(g), attr);
+  if (!a)
+    a = agraphattr(g->root, attr, emptystring);
+  myagxset(g, a, val);
+  return val;
 }
 //-------------------------------------------------
-char *getv(Agnode_t *n, Agsym_t *a)
-{
-    if (!n || !a)
-        return nullptr;
-    if (AGTYPE(n) == AGRAPH) // protonode   
-       return nullptr;   // FIXME ??
-    return myagxget(n, a);
-}
-char *getv(Agnode_t *n, char *attr)
-{
-    if (!n || !attr)
-        return nullptr;
-    if (AGTYPE(n) == AGRAPH) // protonode   
-       return nullptr;   // FIXME ??
-    Agraph_t *g = agroot(agraphof(n));
-    Agsym_t *a = agattr(g, AGNODE, attr, nullptr);
-    return myagxget(n, a);
-}
-char *setv(Agnode_t *n, Agsym_t *a, char *val)
-{
-    if (!n || !a || !val)
-        return nullptr;
-    if (AGTYPE(n) == AGRAPH) // protonode   
-       return nullptr;   // FIXME ??
-    myagxset(n, a, val);
-    return val;
+char *getv(Agnode_t *n, Agsym_t *a) {
+  if (!n || !a)
+    return nullptr;
+  if (AGTYPE(n) == AGRAPH) // protonode
+    return nullptr;        // FIXME ??
+  return myagxget(n, a);
+}
+char *getv(Agnode_t *n, char *attr) {
+  if (!n || !attr)
+    return nullptr;
+  if (AGTYPE(n) == AGRAPH) // protonode
+    return nullptr;        // FIXME ??
+  Agraph_t *g = agroot(agraphof(n));
+  Agsym_t *a = agattr(g, AGNODE, attr, nullptr);
+  return myagxget(n, a);
+}
+char *setv(Agnode_t *n, Agsym_t *a, char *val) {
+  if (!n || !a || !val)
+    return nullptr;
+  if (AGTYPE(n) == AGRAPH) // protonode
+    return nullptr;        // FIXME ??
+  myagxset(n, a, val);
+  return val;
 }
-char *setv(Agnode_t *n, char *attr, char *val)
-{
+char *setv(Agnode_t *n, char *attr, char *val) {
 
-    if (!n || !attr || !val)
-        return nullptr;
-    if (AGTYPE(n) == AGRAPH) { // protonode   
-       auto g = reinterpret_cast<Agraph_t*>(n);
-       (void)agattr(g, AGNODE, attr, val); // create default attribute in pseudo protonode
-           // FIXME? - deal with html in "label" attributes
-       return val;
-    }
-    Agraph_t *g = agroot(agraphof(n));
-    Agsym_t *a = agattr(g, AGNODE, attr, nullptr);
-    if (!a)
-        a = agnodeattr(g, attr, emptystring);
-    myagxset(n, a, val);
+  if (!n || !attr || !val)
+    return nullptr;
+  if (AGTYPE(n) == AGRAPH) { // protonode
+    auto g = reinterpret_cast<Agraph_t *>(n);
+    (void)agattr(g, AGNODE, attr,
+                 val); // create default attribute in pseudo protonode
+                       // FIXME? - deal with html in "label" attributes
     return val;
+  }
+  Agraph_t *g = agroot(agraphof(n));
+  Agsym_t *a = agattr(g, AGNODE, attr, nullptr);
+  if (!a)
+    a = agnodeattr(g, attr, emptystring);
+  myagxset(n, a, val);
+  return val;
 }
 //-------------------------------------------------
-char *getv(Agedge_t *e, Agsym_t *a)
-{
-    if (!e || !a)
-        return nullptr;
-    if (AGTYPE(e) == AGRAPH) // protoedge   
-       return nullptr;   // FIXME ??
-    return myagxget(e, a);
-}
-char *getv(Agedge_t *e, char *attr)
-{
-    if (!e || !attr)
-        return nullptr;
-    if (AGTYPE(e) == AGRAPH) // protoedge   
-       return nullptr;   // FIXME ??
-    Agraph_t *g = agraphof(agtail(e));
-    Agsym_t *a = agattr(g, AGEDGE, attr, nullptr);
-    return myagxget(e, a);
-}
-char *setv(Agedge_t *e, Agsym_t *a, char *val)
-{
-    if (!e || !a || !val)
-        return nullptr;
-    if (AGTYPE(e) == AGRAPH) // protoedge   
-       return nullptr;   // FIXME ??
-    myagxset(e, a, val);
-    return val;
+char *getv(Agedge_t *e, Agsym_t *a) {
+  if (!e || !a)
+    return nullptr;
+  if (AGTYPE(e) == AGRAPH) // protoedge
+    return nullptr;        // FIXME ??
+  return myagxget(e, a);
 }
-char *setv(Agedge_t *e, char *attr, char *val)
-{
-    if (!e || !attr || !val)
-        return nullptr;
-    if (AGTYPE(e) == AGRAPH) { // protoedge   
-       auto g = reinterpret_cast<Agraph_t*>(e);
-       (void)agattr(g, AGEDGE, attr, val); // create default attribute in pseudo protoedge
-           // FIXME? - deal with html in "label" attributes
-       return val;
-    }
-    Agraph_t *g = agroot(agraphof(agtail(e)));
-    Agsym_t *a = agattr(g, AGEDGE, attr, nullptr);
-    if (!a)
-        a = agattr(g, AGEDGE, attr, emptystring);
-    myagxset(e, a, val);
+char *getv(Agedge_t *e, char *attr) {
+  if (!e || !attr)
+    return nullptr;
+  if (AGTYPE(e) == AGRAPH) // protoedge
+    return nullptr;        // FIXME ??
+  Agraph_t *g = agraphof(agtail(e));
+  Agsym_t *a = agattr(g, AGEDGE, attr, nullptr);
+  return myagxget(e, a);
+}
+char *setv(Agedge_t *e, Agsym_t *a, char *val) {
+  if (!e || !a || !val)
+    return nullptr;
+  if (AGTYPE(e) == AGRAPH) // protoedge
+    return nullptr;        // FIXME ??
+  myagxset(e, a, val);
+  return val;
+}
+char *setv(Agedge_t *e, char *attr, char *val) {
+  if (!e || !attr || !val)
+    return nullptr;
+  if (AGTYPE(e) == AGRAPH) { // protoedge
+    auto g = reinterpret_cast<Agraph_t *>(e);
+    (void)agattr(g, AGEDGE, attr,
+                 val); // create default attribute in pseudo protoedge
+                       // FIXME? - deal with html in "label" attributes
     return val;
+  }
+  Agraph_t *g = agroot(agraphof(agtail(e)));
+  Agsym_t *a = agattr(g, AGEDGE, attr, nullptr);
+  if (!a)
+    a = agattr(g, AGEDGE, attr, emptystring);
+  myagxset(e, a, val);
+  return val;
 }
 //-------------------------------------------------
-Agraph_t *findsubg(Agraph_t *g, char *name)
-{
-    if (!g || !name)
-        return nullptr;
-    return agsubg(g, name, 0);
+Agraph_t *findsubg(Agraph_t *g, char *name) {
+  if (!g || !name)
+    return nullptr;
+  return agsubg(g, name, 0);
 }
 
-Agnode_t *findnode(Agraph_t *g, char *name)
-{
-    if (!g || !name)
-        return nullptr;
-    return agnode(g, name, 0);
+Agnode_t *findnode(Agraph_t *g, char *name) {
+  if (!g || !name)
+    return nullptr;
+  return agnode(g, name, 0);
 }
 
-Agedge_t *findedge(Agnode_t *t, Agnode_t *h)
-{
-    if (!t || !h)
-        return nullptr;
-    if (AGTYPE(t) == AGRAPH || AGTYPE(h) == AGRAPH)
-       return nullptr;
-    return agfindedge(agraphof(t), t, h);
+Agedge_t *findedge(Agnode_t *t, Agnode_t *h) {
+  if (!t || !h)
+    return nullptr;
+  if (AGTYPE(t) == AGRAPH || AGTYPE(h) == AGRAPH)
+    return nullptr;
+  return agfindedge(agraphof(t), t, h);
 }
 
-Agsym_t *findattr(Agraph_t *g, char *name)
-{
-    if (!g || !name)
-        return nullptr;
-    return agfindattr(g, name);
+Agsym_t *findattr(Agraph_t *g, char *name) {
+  if (!g || !name)
+    return nullptr;
+  return agfindattr(g, name);
 }
 
-Agsym_t *findattr(Agnode_t *n, char *name)
-{
-    if (!n || !name)
-        return nullptr;
-    return agfindattr(n, name);
+Agsym_t *findattr(Agnode_t *n, char *name) {
+  if (!n || !name)
+    return nullptr;
+  return agfindattr(n, name);
 }
 
-Agsym_t *findattr(Agedge_t *e, char *name)
-{
-    if (!e || !name)
-        return nullptr;
-    return agfindattr(e, name);
+Agsym_t *findattr(Agedge_t *e, char *name) {
+  if (!e || !name)
+    return nullptr;
+  return agfindattr(e, name);
 }
 
 //-------------------------------------------------
 
-Agnode_t *headof(Agedge_t *e)
-{
-    if (!e)
-        return nullptr;
-    if (AGTYPE(e) == AGRAPH)
-       return nullptr;
-    return aghead(e);
+Agnode_t *headof(Agedge_t *e) {
+  if (!e)
+    return nullptr;
+  if (AGTYPE(e) == AGRAPH)
+    return nullptr;
+  return aghead(e);
 }
 
-Agnode_t *tailof(Agedge_t *e)
-{
-    if (!e)
-        return nullptr;
-    if (AGTYPE(e) == AGRAPH)
-       return nullptr;
-    return agtail(e);
+Agnode_t *tailof(Agedge_t *e) {
+  if (!e)
+    return nullptr;
+  if (AGTYPE(e) == AGRAPH)
+    return nullptr;
+  return agtail(e);
 }
 
-Agraph_t *graphof(Agraph_t *g)
-{
-    if (!g || g == g->root)
-        return nullptr;
-    return agroot(g);
+Agraph_t *graphof(Agraph_t *g) {
+  if (!g || g == g->root)
+    return nullptr;
+  return agroot(g);
 }
 
-Agraph_t *graphof(Agedge_t *e)
-{
-    if (!e)
-        return nullptr;
-    if (AGTYPE(e) == AGRAPH)
-       return reinterpret_cast<Agraph_t*>(e); // graph of protoedge is itself recast
-    return agraphof(agtail(e));
+Agraph_t *graphof(Agedge_t *e) {
+  if (!e)
+    return nullptr;
+  if (AGTYPE(e) == AGRAPH)
+    return reinterpret_cast<Agraph_t *>(
+        e); // graph of protoedge is itself recast
+  return agraphof(agtail(e));
 }
 
-Agraph_t *graphof(Agnode_t *n)
-{
-    if (!n)
-        return nullptr;
-    if (AGTYPE(n) == AGRAPH)
-       return reinterpret_cast<Agraph_t*>(n); // graph of protonode is itself recast
-    return agraphof(n);
+Agraph_t *graphof(Agnode_t *n) {
+  if (!n)
+    return nullptr;
+  if (AGTYPE(n) == AGRAPH)
+    return reinterpret_cast<Agraph_t *>(
+        n); // graph of protonode is itself recast
+  return agraphof(n);
 }
 
-Agraph_t *rootof(Agraph_t *g)
-{
-    if (!g)
-        return nullptr;
-    return agroot(g);
+Agraph_t *rootof(Agraph_t *g) {
+  if (!g)
+    return nullptr;
+  return agroot(g);
 }
 
 //-------------------------------------------------
-Agnode_t *protonode(Agraph_t *g)
-{
-    return reinterpret_cast<Agnode_t*>(g); // gross abuse of the type system!
+Agnode_t *protonode(Agraph_t *g) {
+  return reinterpret_cast<Agnode_t *>(g); // gross abuse of the type system!
 }
 
-Agedge_t *protoedge(Agraph_t *g)
-{
-    return reinterpret_cast<Agedge_t*>(g); // gross abuse of the type system!
+Agedge_t *protoedge(Agraph_t *g) {
+  return reinterpret_cast<Agedge_t *>(g); // gross abuse of the type system!
 }
 
 //-------------------------------------------------
-char *nameof(Agraph_t *g)
-{
-    if (!g)
-        return nullptr;
-    return agnameof(g);
-}
-char *nameof(Agnode_t *n)
-{
-    if (!n)
-        return nullptr;
-    if (AGTYPE(n) == AGRAPH)
-       return nullptr;
-    return agnameof(n);
-}
-char *nameof(Agsym_t *a)
-{
-    if (!a)
-        return nullptr;
-    return a->name;
+char *nameof(Agraph_t *g) {
+  if (!g)
+    return nullptr;
+  return agnameof(g);
+}
+char *nameof(Agnode_t *n) {
+  if (!n)
+    return nullptr;
+  if (AGTYPE(n) == AGRAPH)
+    return nullptr;
+  return agnameof(n);
+}
+char *nameof(Agsym_t *a) {
+  if (!a)
+    return nullptr;
+  return a->name;
 }
 
 //-------------------------------------------------
-bool ok(Agraph_t *g)
-{
-    return g != nullptr;
-}
-bool ok(Agnode_t *n)
-{
-    return n != nullptr;
+bool ok(Agraph_t *g) { return g != nullptr; }
+bool ok(Agnode_t *n) { return n != nullptr; }
+bool ok(Agedge_t *e) { return e != nullptr; }
+bool ok(Agsym_t *a) { return a != nullptr; }
+//-------------------------------------------------
+Agraph_t *firstsubg(Agraph_t *g) {
+  if (!g)
+    return nullptr;
+  return agfstsubg(g);
 }
-bool ok(Agedge_t *e)
-{
-    return e != nullptr;
+
+Agraph_t *nextsubg(Agraph_t *g, Agraph_t *sg) {
+
+  if (!g || !sg)
+    return nullptr;
+  return agnxtsubg(sg);
 }
-bool ok(Agsym_t *a)
-{
-    return a != nullptr;
+
+Agraph_t *firstsupg(Agraph_t *g) { return g->parent; }
+
+Agraph_t *nextsupg(Agraph_t *, Agraph_t *) { return nullptr; }
+
+Agedge_t *firstout(Agraph_t *g) {
+  if (!g)
+    return nullptr;
+  for (Agnode_t *n = agfstnode(g); n; n = agnxtnode(g, n)) {
+    Agedge_t *e = agfstout(g, n);
+    if (e)
+      return e;
+  }
+  return nullptr;
 }
-//-------------------------------------------------
-Agraph_t *firstsubg(Agraph_t *g)
-{
-    if (!g)
-        return nullptr;
-    return agfstsubg(g);
+
+Agedge_t *nextout(Agraph_t *g, Agedge_t *e) {
+  if (!g || !e)
+    return nullptr;
+  Agedge_t *ne = agnxtout(g, e);
+  if (ne)
+    return (ne);
+  for (Agnode_t *n = agnxtnode(g, agtail(e)); n; n = agnxtnode(g, n)) {
+    ne = agfstout(g, n);
+    if (ne)
+      return ne;
+  }
+  return nullptr;
 }
 
-Agraph_t *nextsubg(Agraph_t *g, Agraph_t *sg)
-{
+Agedge_t *firstedge(Agraph_t *g) { return firstout(g); }
 
-    if (!g || !sg)
-        return nullptr;
-    return agnxtsubg(sg);
+Agedge_t *nextedge(Agraph_t *g, Agedge_t *e) { return nextout(g, e); }
+
+Agedge_t *firstout(Agnode_t *n) {
+  if (!n)
+    return nullptr;
+  return agfstout(agraphof(n), n);
 }
 
-Agraph_t *firstsupg(Agraph_t *g)
-{
-    return g->parent;
+Agedge_t *nextout(Agnode_t *n, Agedge_t *e) {
+  if (!n || !e)
+    return nullptr;
+  return agnxtout(agraphof(n), e);
 }
 
-Agraph_t *nextsupg(Agraph_t*, Agraph_t*)
-{
+Agnode_t *firsthead(Agnode_t *n) {
+  if (!n)
+    return nullptr;
+  Agedge_t *e = agfstout(agraphof(n), n);
+  if (!e)
     return nullptr;
+  return aghead(e);
 }
 
-Agedge_t *firstout(Agraph_t *g)
-{
-    if (!g)
-        return nullptr;
-    for (Agnode_t *n = agfstnode(g); n; n = agnxtnode(g, n)) {
-       Agedge_t *e = agfstout(g, n);
-       if (e) return e;
-    }
+Agnode_t *nexthead(Agnode_t *n, Agnode_t *h) {
+  if (!n || !h)
+    return nullptr;
+  Agraph_t *g = agraphof(n);
+  Agedge_t *e = agfindedge(g, n, h);
+  if (!e)
     return nullptr;
+  do {
+    e = agnxtout(g, AGMKOUT(e));
+    if (!e)
+      return nullptr;
+  } while (aghead(e) == h);
+  return aghead(e);
 }
 
-Agedge_t *nextout(Agraph_t *g, Agedge_t *e)
-{
-    if (!g || !e)
-        return nullptr;
-    Agedge_t *ne = agnxtout(g, e);
-    if (ne)
-        return (ne);
-    for (Agnode_t *n = agnxtnode(g, agtail(e)); n; n = agnxtnode(g, n)) {
-       ne = agfstout(g, n);
-       if (ne) return ne;
-    }
+Agedge_t *firstedge(Agnode_t *n) {
+  if (!n)
     return nullptr;
+  return agfstedge(agraphof(n), n);
 }
 
-Agedge_t *firstedge(Agraph_t *g)
-{
-    return firstout(g);
-} 
+Agedge_t *nextedge(Agnode_t *n, Agedge_t *e) {
+  if (!n || !e)
+    return nullptr;
+  return agnxtedge(agraphof(n), e, n);
+}
 
-Agedge_t *nextedge(Agraph_t *g, Agedge_t *e)
-{
-    return nextout(g, e);
-} 
+Agedge_t *firstin(Agraph_t *g) {
+  if (!g)
+    return nullptr;
+  Agnode_t *n = agfstnode(g);
+  if (!n)
+    return nullptr;
+  return agfstin(g, n);
+}
 
-Agedge_t *firstout(Agnode_t *n)
-{
-    if (!n)
-        return nullptr;
-    return agfstout(agraphof(n), n);
+Agedge_t *nextin(Agraph_t *g, Agedge_t *e) {
+  if (!g || !e)
+    return nullptr;
+  Agedge_t *ne = agnxtin(g, e);
+  if (ne)
+    return (ne);
+  Agnode_t *n = agnxtnode(g, aghead(e));
+  if (!n)
+    return nullptr;
+  return agfstin(g, n);
 }
 
-Agedge_t *nextout(Agnode_t *n, Agedge_t *e)
-{
-    if (!n || !e)
-        return nullptr;
-    return agnxtout(agraphof(n), e);
+Agedge_t *firstin(Agnode_t *n) {
+  if (!n)
+    return nullptr;
+  return agfstin(agraphof(n), n);
 }
 
-Agnode_t *firsthead(Agnode_t *n)
-{
-    if (!n)
-        return nullptr;
-    Agedge_t *e = agfstout(agraphof(n), n);
-    if (!e)
-        return nullptr;
-    return aghead(e);
+Agedge_t *nextin(Agnode_t *n, Agedge_t *e) {
+  if (!n || !e)
+    return nullptr;
+  return agnxtin(agraphof(n), e);
 }
 
-Agnode_t *nexthead(Agnode_t *n, Agnode_t *h)
-{
-    if (!n || !h)
-        return nullptr;
-    Agraph_t *g = agraphof(n);
-    Agedge_t *e = agfindedge(g, n, h);
+Agnode_t *firsttail(Agnode_t *n) {
+  if (!n)
+    return nullptr;
+  Agedge_t *e = agfstin(agraphof(n), n);
+  if (!e)
+    return nullptr;
+  return agtail(e);
+}
+
+Agnode_t *nexttail(Agnode_t *n, Agnode_t *t) {
+  if (!n || !t)
+    return nullptr;
+  Agraph_t *g = agraphof(n);
+  Agedge_t *e = agfindedge(g, t, n);
+  if (!e)
+    return nullptr;
+  do {
+    e = agnxtin(g, AGMKIN(e));
     if (!e)
-        return nullptr;
-    do {
-        e = agnxtout(g, AGMKOUT(e));
-        if (!e)
-            return nullptr;
-    } while (aghead(e) == h);
-    return aghead(e);
-}
-
-Agedge_t *firstedge(Agnode_t *n)
-{
-    if (!n)
-        return nullptr;
-    return agfstedge(agraphof(n), n);
-} 
-
-Agedge_t *nextedge(Agnode_t *n, Agedge_t *e)
-{
-    if (!n || !e)
-        return nullptr;
-    return agnxtedge(agraphof(n), e, n); 
-} 
-
-Agedge_t *firstin(Agraph_t *g)
-{
-    if (!g)
-        return nullptr;
-    Agnode_t *n = agfstnode(g);
-    if (!n)
-        return nullptr;
-    return agfstin(g, n);
-}
-
-Agedge_t *nextin(Agraph_t *g, Agedge_t *e)
-{
-    if (!g || !e)
-        return nullptr;
-    Agedge_t *ne = agnxtin(g, e);
-    if (ne)
-        return (ne);
-    Agnode_t *n = agnxtnode(g, aghead(e));
-    if (!n)
-        return nullptr;
-    return agfstin(g, n);
+      return nullptr;
+  } while (agtail(e) == t);
+  return agtail(e);
 }
 
-Agedge_t *firstin(Agnode_t *n)
-{
-    if (!n)
-        return nullptr;
-    return agfstin(agraphof(n), n);
+Agnode_t *firstnode(Agraph_t *g) {
+  if (!g)
+    return nullptr;
+  return agfstnode(g);
 }
 
-Agedge_t *nextin(Agnode_t *n, Agedge_t *e)
-{
-    if (!n || !e)
-        return nullptr;
-    return agnxtin(agraphof(n), e);
+Agnode_t *nextnode(Agraph_t *g, Agnode_t *n) {
+  if (!g || !n)
+    return nullptr;
+  return agnxtnode(g, n);
 }
 
-Agnode_t *firsttail(Agnode_t *n)
-{
-    if (!n)
-        return nullptr;
-    Agedge_t *e = agfstin(agraphof(n), n);
-    if (!e)
-        return nullptr;
-    return agtail(e);
+Agnode_t *firstnode(Agedge_t *e) {
+  if (!e)
+    return nullptr;
+  return agtail(e);
 }
 
-Agnode_t *nexttail(Agnode_t *n, Agnode_t *t)
-{
-    if (!n || !t)
-        return nullptr;
-    Agraph_t *g = agraphof(n);
-    Agedge_t *e = agfindedge(g, t, n);
-    if (!e)
-        return nullptr;
-    do {
-        e = agnxtin(g, AGMKIN(e));
-        if (!e)
-            return nullptr;
-    } while (agtail(e) == t);
-    return agtail(e);
+Agnode_t *nextnode(Agedge_t *e, Agnode_t *n) {
+  if (!e || n != agtail(e))
+    return nullptr;
+  return aghead(e);
 }
 
-Agnode_t *firstnode(Agraph_t *g)
-{
-    if (!g)
-        return nullptr;
-    return agfstnode(g);
+Agsym_t *firstattr(Agraph_t *g) {
+  if (!g)
+    return nullptr;
+  g = agroot(g);
+  return agnxtattr(g, AGRAPH, nullptr);
 }
 
-Agnode_t *nextnode(Agraph_t *g, Agnode_t *n)
-{
-    if (!g || !n)
-        return nullptr;
-    return agnxtnode(g, n);
+Agsym_t *nextattr(Agraph_t *g, Agsym_t *a) {
+  if (!g || !a)
+    return nullptr;
+  g = agroot(g);
+  return agnxtattr(g, AGRAPH, a);
 }
 
-Agnode_t *firstnode(Agedge_t *e)
-{
-    if (!e)
-        return nullptr;
-    return agtail(e);
+Agsym_t *firstattr(Agnode_t *n) {
+  if (!n)
+    return nullptr;
+  Agraph_t *g = agraphof(n);
+  return agnxtattr(g, AGNODE, nullptr);
 }
 
-Agnode_t *nextnode(Agedge_t *e, Agnode_t *n)
-{
-    if (!e || n != agtail(e))
-        return nullptr;
-    return aghead(e);
+Agsym_t *nextattr(Agnode_t *n, Agsym_t *a) {
+  if (!n || !a)
+    return nullptr;
+  Agraph_t *g = agraphof(n);
+  return agnxtattr(g, AGNODE, a);
 }
 
-Agsym_t *firstattr(Agraph_t *g)
-{
-    if (!g)
-        return nullptr;
-    g = agroot(g);
-    return agnxtattr(g,AGRAPH,nullptr);
+Agsym_t *firstattr(Agedge_t *e) {
+  if (!e)
+    return nullptr;
+  Agraph_t *g = agraphof(agtail(e));
+  return agnxtattr(g, AGEDGE, nullptr);
 }
 
-Agsym_t *nextattr(Agraph_t *g, Agsym_t *a)
-{
-    if (!g || !a)
-        return nullptr;
-    g = agroot(g);
-    return agnxtattr(g,AGRAPH,a);
+Agsym_t *nextattr(Agedge_t *e, Agsym_t *a) {
+  if (!e || !a)
+    return nullptr;
+  Agraph_t *g = agraphof(agtail(e));
+  return agnxtattr(g, AGEDGE, a);
 }
 
-Agsym_t *firstattr(Agnode_t *n)
-{
-    if (!n)
-        return nullptr;
-    Agraph_t *g = agraphof(n);
-    return agnxtattr(g,AGNODE,nullptr);
+bool rm(Agraph_t *g) {
+  if (!g)
+    return false;
+  // The rm function appears to have the semantics of agclose, so
+  // we should just do that, and let cgraph take care of all the
+  // details.
+  agclose(g);
+  return true;
 }
 
-Agsym_t *nextattr(Agnode_t *n, Agsym_t *a)
-{
-    if (!n || !a)
-        return nullptr;
-    Agraph_t *g = agraphof(n);
-    return agnxtattr(g,AGNODE,a);
+bool rm(Agnode_t *n) {
+  if (!n)
+    return false;
+  // removal of the protonode is not permitted
+  if (strcmp(agnameof(n), "\001proto") == 0)
+    return false;
+  agdelete(agraphof(n), n);
+  return true;
 }
 
-Agsym_t *firstattr(Agedge_t *e)
-{
-    if (!e)
-        return nullptr;
-    Agraph_t *g = agraphof(agtail(e));
-    return agnxtattr(g,AGEDGE,nullptr);
-}
-
-Agsym_t *nextattr(Agedge_t *e, Agsym_t *a)
-{
-    if (!e || !a)
-        return nullptr;
-    Agraph_t *g = agraphof(agtail(e));
-    return agnxtattr(g,AGEDGE,a);
-}
-
-bool rm(Agraph_t *g)
-{
-    if (!g)
-        return false;
-    /* The rm function appears to have the semantics of agclose, so
-     * we should just do that, and let cgraph take care of all the
-     * details.
-     */
-    agclose(g);
-    return true;
-}
-
-bool rm(Agnode_t *n)
-{
-    if (!n)
-        return false;
-    // removal of the protonode is not permitted
-    if (strcmp (agnameof(n), "\001proto") ==0)
-        return false;
-    agdelete(agraphof(n), n);
-    return true;
-}
-
-bool rm(Agedge_t *e)
-{
-    if (!e)
-        return false;
-    // removal of the protoedge is not permitted
-    if (strcmp (agnameof(aghead(e)), "\001proto") == 0
-     || strcmp (agnameof(agtail(e)), "\001proto") == 0)
-        return false;
-    agdelete(agroot(agraphof(aghead(e))), e);
-    return true;
+bool rm(Agedge_t *e) {
+  if (!e)
+    return false;
+  // removal of the protoedge is not permitted
+  if (strcmp(agnameof(aghead(e)), "\001proto") == 0 ||
+      strcmp(agnameof(agtail(e)), "\001proto") == 0)
+    return false;
+  agdelete(agroot(agraphof(aghead(e))), e);
+  return true;
 }
 
-bool layout(Agraph_t *g, const char *engine)
-{
-    if (!g)
-        return false;
-    (void)gvFreeLayout(gvc, g); // ignore errors
-    int err = gvLayout(gvc, g, engine);
-    return err == 0;
+bool layout(Agraph_t *g, const char *engine) {
+  if (!g)
+    return false;
+  (void)gvFreeLayout(gvc, g); // ignore errors
+  int err = gvLayout(gvc, g, engine);
+  return err == 0;
 }
 
 // annotate the graph with layout information
-bool render(Agraph_t *g)
-{
-    if (!g)
-        return false;
-    attach_attrs(g);
-    return true;
+bool render(Agraph_t *g) {
+  if (!g)
+    return false;
+  attach_attrs(g);
+  return true;
 }
 
 // render to stdout
-bool render(Agraph_t *g, const char *format)
-{
-    if (!g)
-        return false;
-    int err = gvRender(gvc, g, format, stdout);
-    return err == 0;
+bool render(Agraph_t *g, const char *format) {
+  if (!g)
+    return false;
+  int err = gvRender(gvc, g, format, stdout);
+  return err == 0;
 }
 
 // render to an open FILE
-bool render(Agraph_t *g, const char *format, FILE *f)
-{
-    if (!g)
-        return false;
-    int err = gvRender(gvc, g, format, f);
-    return err == 0;
-}
-
-// render to an open channel  
-bool renderchannel(Agraph_t *g, const char *format, const char *channelname)
-{
-    if (!g)
-        return false;
-    gv_channel_writer_init(gvc);
-    int err = gvRender(gvc, g, format, (FILE*)channelname);
-    gv_writer_reset (gvc);   /* Reset to default */
-    return err == 0;
-}
-
-// render to a filename 
-bool render(Agraph_t *g, const char *format, const char *filename)
-{
-    if (!g)
-        return false;
-    int err = gvRenderFilename(gvc, g, format, filename);
-    return err == 0;
+bool render(Agraph_t *g, const char *format, FILE *f) {
+  if (!g)
+    return false;
+  int err = gvRender(gvc, g, format, f);
+  return err == 0;
+}
+
+// render to an open channel
+bool renderchannel(Agraph_t *g, const char *format, const char *channelname) {
+  if (!g)
+    return false;
+  gv_channel_writer_init(gvc);
+  int err = gvRender(gvc, g, format, (FILE *)channelname);
+  gv_writer_reset(gvc); // Reset to default
+  return err == 0;
+}
+
+// render to a filename
+bool render(Agraph_t *g, const char *format, const char *filename) {
+  if (!g)
+    return false;
+  int err = gvRenderFilename(gvc, g, format, filename);
+  return err == 0;
 }
 
 typedef struct {
-    char* data;
-    int sz;       /* buffer size */
-    int len;      /* length of array */
+  char *data;
+  int sz;  // buffer size
+  int len; // length of array
 } BA;
 
 // render to string result, using binding-dependent gv_string_writer()
-char* renderresult(Agraph_t *g, const char *format)
-{
-    if (!g)
-        return nullptr;
-    if (!GD_alg(g))
-        return nullptr;
-    BA ba;
-    ba.sz = BUFSIZ;
-    // must be freed by wrapper code
-    ba.data = reinterpret_cast<char*>(malloc(ba.sz * sizeof(char)));
-    ba.len = 0;
-    gv_string_writer_init(gvc);
-    (void)gvRender(gvc, g, format, reinterpret_cast<FILE*>(&ba));
-    gv_writer_reset (gvc);   /* Reset to default */
-    *reinterpret_cast<int*>(GD_alg(g)) = ba.len;
-    return ba.data;
+char *renderresult(Agraph_t *g, const char *format) {
+  if (!g)
+    return nullptr;
+  if (!GD_alg(g))
+    return nullptr;
+  BA ba;
+  ba.sz = BUFSIZ;
+  // must be freed by wrapper code
+  ba.data = reinterpret_cast<char *>(malloc(ba.sz * sizeof(char)));
+  ba.len = 0;
+  gv_string_writer_init(gvc);
+  (void)gvRender(gvc, g, format, reinterpret_cast<FILE *>(&ba));
+  gv_writer_reset(gvc); // Reset to default
+  *reinterpret_cast<int *>(GD_alg(g)) = ba.len;
+  return ba.data;
 }
 
 // render to string result, using binding-dependent gv_string_writer()
-void renderresult(Agraph_t *g, const char *format, char *outdata)
-{
-    if (!g)
-        return;
-    gv_string_writer_init(gvc);
-    (void)gvRender(gvc, g, format, reinterpret_cast<FILE*>(outdata));
-    gv_writer_reset (gvc);   /* Reset to default */
+void renderresult(Agraph_t *g, const char *format, char *outdata) {
+  if (!g)
+    return;
+  gv_string_writer_init(gvc);
+  (void)gvRender(gvc, g, format, reinterpret_cast<FILE *>(outdata));
+  gv_writer_reset(gvc); // Reset to default
 }
 
 // render to a malloc'ed data string, to be free'd by caller.
-char* renderdata(Agraph_t *g, const char *format)
-{
-    if (!g)
-       return nullptr;
-    char *data;
-    unsigned int length;
-    int err = gvRenderData(gvc, g, format, &data, &length);
-    if (err)
-       return nullptr;
-    return data;
-}
-
-bool write(Agraph_t *g, FILE *f)
-{
-    if (!g)
-        return false;
-    int err = agwrite(g, f);
-    return err == 0;
-}
-
-bool write(Agraph_t *g, const char *filename)
-{
-    if (!g)
-        return false;
-    FILE *f = fopen(filename, "w");
-    if (!f)
-        return false;
-    int err = agwrite(g, f);
-    fclose(f);
-    return err == 0;
-}
-
-bool tred(Agraph_t *g)
-{
-    if (!g)
-        return false;
-    int err = gvToolTred(g);
-    return err == 0;
+char *renderdata(Agraph_t *g, const char *format) {
+  if (!g)
+    return nullptr;
+  char *data;
+  unsigned int length;
+  int err = gvRenderData(gvc, g, format, &data, &length);
+  if (err)
+    return nullptr;
+  return data;
+}
+
+bool write(Agraph_t *g, FILE *f) {
+  if (!g)
+    return false;
+  int err = agwrite(g, f);
+  return err == 0;
+}
+
+bool write(Agraph_t *g, const char *filename) {
+  if (!g)
+    return false;
+  FILE *f = fopen(filename, "w");
+  if (!f)
+    return false;
+  int err = agwrite(g, f);
+  fclose(f);
+  return err == 0;
+}
+
+bool tred(Agraph_t *g) {
+  if (!g)
+    return false;
+  int err = gvToolTred(g);
+  return err == 0;
 }