summaryrefslogtreecommitdiff
path: root/sys/src/libregexp/regprint.c
diff options
context:
space:
mode:
authorben <ben@rana>2016-04-26 22:23:44 -0500
committerben <ben@rana>2016-04-26 22:23:44 -0500
commit0a460e1722c50e31653359f8a86fe0b606d2b513 (patch)
treeb5a00bbfc883aa98709db012e0a7bacc67e234af /sys/src/libregexp/regprint.c
parent651d6c2bc68e7e5224c3ba41b094e37b1c1890ed (diff)
New libregexp and APE ported to native
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);
+}