--- /dev/null
+/* Detect directed cycle and print one if found */
+BEG_G{
+ node_t tp, hp;
+ node_t stk[node_t];
+ $tvtype = TV_prepostfwd;
+ $tvroot = fstnode($);
+}
+
+N {
+ if (stk[$]) {
+ stk[$] = NULL;
+ }
+ else if ($tvedge == NULL) { /* current root */
+ stk[$] = $;
+ }
+ else {
+ stk[$] = $tvedge.tail;
+ }
+}
+E {
+ if (stk[$.head]) {
+ tp = $.tail;
+ hp = $.head;
+ while (tp != $.head) {
+ printf ("%s -> %s\n", tp.name, hp.name);
+ hp = tp;
+ tp = stk[tp];
+ }
+ printf ("%s -> %s\n", tp.name, hp.name);
+ exit(0);
+ }
+}
+