Commit Diff


commit - c8b1a82f1fd6a4ae0122d031cd5db7d0ff7dcee1
commit + 433a5f454f2c22d5c78edda09ff911bd778640ff
blob - 6d6cf89cfcdfa24ae10076757a596f16cb59a029
blob + 04799503c1900e853577c30ac417803b7d9b3b05
--- nfa.c
+++ nfa.c
@@ -3,6 +3,8 @@
  */
 
 #include "nfa.h"
+#include <stdio.h>
+#include <ctype.h>
 #include <assert.h>
 
 
@@ -341,6 +343,74 @@ star(NFA a)
 }
 
 
+/* diagnostic output: print an NFA as a sequence of states */
+void
+nfaprint(NFA a)
+{
+	struct state s;
+	int i;
+
+	for(i = 0; i < a.size; i++) {
+		s = a.state[i];
+
+#if 0
+		/* a simple uniform display format for the raw state data */
+		printf("%5d: [%2Xh, %2Xh) -> %d, e -> %d\n", i,
+		    (unsigned)s.chr.base, (unsigned)s.chr.base + s.chr.n,
+		    i + s.edge_chr, i + s.edge_eps);
+#else
+		/*
+		 * a big mess of conditionals to make the possible cases easy
+		 * to read and distinguish for hunams
+		 */
+		printf("%5d: ", i);
+		if (s.chr.n == 0) {
+			/* edge_chr is an epsilon or inner input edge */
+			if (s.chr.base != 0)
+				printf("<inner %d>", s.chr.base - INNER);
+			else if (s.edge_chr != 1)
+				printf("e");		/* epsilon */
+			if (s.edge_chr != 1)
+				printf(" -> %d", i + s.edge_chr);
+		} else {
+			if (s.chr.n < 0)		/* negative range */
+				printf(")%2Xh, %2Xh(",
+				    (unsigned)s.chr.base + s.chr.n,
+				    (unsigned)s.chr.base - 1);
+			else if (s.chr.n == 1) {	/* singleton */
+				if (s.chr.base >= OUTPUT) {
+					printf(">output %d<",
+					    s.chr.base - OUTPUT);
+				} else {
+					printf("%2Xh", (unsigned)s.chr.base);
+					if (isprint(s.chr.base))
+						printf(" '%c'", s.chr.base);
+					else if (s.chr.base == END)
+						printf(" END");
+				}
+			} else
+				printf("[%2Xh, %2Xh]", (unsigned)s.chr.base,
+				    (unsigned)s.chr.base + s.chr.n - 1);
+			if (s.edge_chr != 1)
+				printf(" -> %d", i + s.edge_chr);
+		}
+		if (s.edge_eps != 0) {
+			if (s.chr.n != 0 || s.edge_chr != 1)
+				printf(", ");
+			printf("e -> %d", i + s.edge_eps);
+		} else if (s.chr.n != 0) {		/* no epsilon edges */
+			if (s.edge_chr == 0)		/* no future */
+				printf(" (fail!)");
+		}
+		putchar('\n');
+#endif
+	}
+
+	/* show the virtual final state for completeness */
+	printf("%5d: (final)\n", i);
+}
+
+
 #ifdef BITSET
 typedef unsigned long bunch_t;	/* a bunch of bits */
 #define BUNCH_BIT (sizeof(bunch_t) * CHAR_BIT)
@@ -391,7 +461,6 @@ setremove(struct set *set, int x)
 	for (I = 0; I < (A).size; I++) if (inset(SET, I))
 
 /* diagnostic output: print input symbol and state set */
-#include <stdio.h>
 static void
 printstates(const struct set *set, int x)
 {
blob - 32fe3ed0306698b10a5c55d7fc0a7f170c32983d
blob + 85ba26fc94f7829119ff875aa8325b4204a629cd
--- nfa.h
+++ nfa.h
@@ -74,3 +74,7 @@ int nfacont(struct prep *, const char *, size_t);
 int nfaend(struct prep *);
 
 int nfamatch(NFA, sub_t *, out_t *, void *, const char *, size_t);
+
+
+/* diagnostics */
+void nfaprint(NFA);
blob - 5a9bec5e272c9ba8094181042bf6d785a5e6da23
blob + 46680b86e2e990fd02f90848980f04ee43c9a317
--- test_nfa.c
+++ test_nfa.c
@@ -3,80 +3,11 @@
  */
 
 #include "nfa.h"
-#include <assert.h>
+#include <stdio.h>
 #include <string.h>
+#include <assert.h>
 
 
-#include <stdio.h>
-#include <ctype.h>
-
-void
-print_nfa(NFA a)
-{
-	struct state s;
-	int i;
-
-	for(i = 0; i < a.size; i++) {
-		s = a.state[i];
-
-#if 0
-		/* a simple uniform display format for the raw state data */
-		printf("%5d: [%2Xh, %2Xh) -> %d, e -> %d\n", i,
-		    (unsigned)s.chr.base, (unsigned)s.chr.base + s.chr.n,
-		    i + s.edge_chr, i + s.edge_eps);
-#else
-		/*
-		 * a big mess of conditionals to make the possible cases easy
-		 * to read and distinguish for hunams
-		 */
-		printf("%5d: ", i);
-		if (s.chr.n == 0) {
-			/* edge_chr is an epsilon or inner input edge */
-			if (s.chr.base != 0)
-				printf("<inner %d>", s.chr.base - INNER);
-			else if (s.edge_chr != 1)
-				printf("e");		/* epsilon */
-			if (s.edge_chr != 1)
-				printf(" -> %d", i + s.edge_chr);
-		} else {
-			if (s.chr.n < 0)		/* negative range */
-				printf(")%2Xh, %2Xh(",
-				    (unsigned)s.chr.base + s.chr.n,
-				    (unsigned)s.chr.base - 1);
-			else if (s.chr.n == 1) {	/* singleton */
-				if (s.chr.base >= OUTPUT) {
-					printf(">output %d<",
-					    s.chr.base - OUTPUT);
-				} else {
-					printf("%2Xh", (unsigned)s.chr.base);
-					if (isprint(s.chr.base))
-						printf(" '%c'", s.chr.base);
-					else if (s.chr.base == END)
-						printf(" END");
-				}
-			} else
-				printf("[%2Xh, %2Xh]", (unsigned)s.chr.base,
-				    (unsigned)s.chr.base + s.chr.n - 1);
-			if (s.edge_chr != 1)
-				printf(" -> %d", i + s.edge_chr);
-		}
-		if (s.edge_eps != 0) {
-			if (s.chr.n != 0 || s.edge_chr != 1)
-				printf(", ");
-			printf("e -> %d", i + s.edge_eps);
-		} else if (s.chr.n != 0) {		/* no epsilon edges */
-			if (s.edge_chr == 0)		/* no future */
-				printf(" (fail!)");
-		}
-		putchar('\n');
-#endif
-	}
-
-	/* show the virtual final state for completeness */
-	printf("%5d: (final)\n", i);
-}
-
-
 /* the parser's mind */
 
 enum gedanken {
@@ -259,7 +190,7 @@ main(int argc, char **argv)
 		}
 	}
 
-	print_nfa(nfa);
+	nfaprint(nfa);
 	putchar('\n');
 	for (int i = 1; i < argc; i++) {
 		char *inp;