summaryrefslogtreecommitdiff
path: root/sys/src/libregexp/regprint.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-04-28 20:53:53 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2016-04-28 20:53:53 +0200
commit4c21da2ededfb5fc628dbee0d75b0aa5263ef97b (patch)
tree1d3e8ab7c177b55c74e03c5f4c26f31b523abfbc /sys/src/libregexp/regprint.c
parentca5b491753ad363da8d9deb5978b56231ec27bf5 (diff)
parenteb168924840977fe0941d4fc90e56db0d484a6e4 (diff)
merge
Diffstat (limited to 'sys/src/libregexp/regprint.c')
-rw-r--r--sys/src/libregexp/regprint.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/sys/src/libregexp/regprint.c b/sys/src/libregexp/regprint.c
new file mode 100644
index 000000000..673ca1f7b
--- /dev/null
+++ b/sys/src/libregexp/regprint.c
@@ -0,0 +1,66 @@
+#include <u.h>
+#include <libc.h>
+#include <regexp.h>
+#include <regimpl.h>
+
+static int
+fmtprinst(Fmt *f, Reinst *inst)
+{
+ int r;
+
+ r = fmtprint(f, "%p ", inst);
+ switch(inst->op) {
+ case ORUNE:
+ r += fmtprint(f, "ORUNE\t%C\n", inst->r);
+ break;
+ case ONOTNL:
+ r += fmtprint(f, "ONOTNL\n");
+ break;
+ case OCLASS:
+ r += fmtprint(f, "OCLASS\t%C-%C %p\n", inst->r, inst->r1, inst->a);
+ break;
+ case OSPLIT:
+ r += fmtprint(f, "OSPLIT\t%p %p\n", inst->a, inst->b);
+ break;
+ case OJMP:
+ r += fmtprint(f, "OJMP \t%p\n", inst->a);
+ break;
+ case OSAVE:
+ r += fmtprint(f, "OSAVE\t%d\n", inst->sub);
+ break;
+ case OUNSAVE:
+ r += fmtprint(f, "OUNSAVE\t%d\n", inst->sub);
+ break;
+ case OANY:
+ r += fmtprint(f, "OANY \t.\n");
+ break;
+ case OEOL:
+ r += fmtprint(f, "OEOL \t$\n");
+ break;
+ case OBOL:
+ r += fmtprint(f, "OBOL \t^\n");
+ break;
+ }
+ return r;
+}
+
+static int
+fmtprprog(Fmt *f, Reprog *reprog)
+{
+ Reinst *inst;
+ int r;
+
+ r = 0;
+ for(inst = reprog->startinst; inst < reprog->startinst + reprog->len; inst++)
+ r += fmtprinst(f, inst);
+ return r;
+}
+
+int
+reprogfmt(Fmt *f)
+{
+ Reprog *r;
+
+ r = va_arg(f->args, Reprog*);
+ return fmtprprog(f, r);
+}