summaryrefslogtreecommitdiff
path: root/sys/src/libregexp/regimpl.h
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/regimpl.h
parent651d6c2bc68e7e5224c3ba41b094e37b1c1890ed (diff)
New libregexp and APE ported to native
Diffstat (limited to 'sys/src/libregexp/regimpl.h')
-rw-r--r--sys/src/libregexp/regimpl.h104
1 files changed, 104 insertions, 0 deletions
diff --git a/sys/src/libregexp/regimpl.h b/sys/src/libregexp/regimpl.h
new file mode 100644
index 000000000..f173a970c
--- /dev/null
+++ b/sys/src/libregexp/regimpl.h
@@ -0,0 +1,104 @@
+enum
+{
+ LANY = 0,
+ LBOL,
+ LCLASS,
+ LEND,
+ LEOL,
+ LLPAR,
+ LOR,
+ LREP,
+ LRPAR,
+ LRUNE,
+
+ TANY = 0,
+ TBOL,
+ TCAT,
+ TCLASS,
+ TEOL,
+ TNOTNL,
+ TOR,
+ TPLUS,
+ TQUES,
+ TRUNE,
+ TSTAR,
+ TSUB,
+
+ NSUBEXPM = 32
+};
+
+typedef struct Parselex Parselex;
+typedef struct Renode Renode;
+
+struct Parselex
+{
+ /* Parse */
+ Renode *next;
+ Renode *nodes;
+ int sub;
+ int instrs;
+ jmp_buf exitenv;
+ /* Lex */
+ void (*getnextr)(Parselex*);
+ char *rawexp;
+ char *orig;
+ Rune rune;
+ Rune peek;
+ int peeklex;
+ int done;
+ int literal;
+ Rune cpairs[400+2];
+ int nc;
+};
+struct Renode
+{
+ int op;
+ Renode *left;
+ Rune r;
+ union
+ {
+ Rune r1;
+ int sub;
+ Renode *right;
+ };
+ int nclass;
+};
+struct Rethread
+{
+ Reinst *pc;
+ Resub sem[NSUBEXPM];
+ int pri;
+ Rethread *next;
+};
+struct Reinst
+{
+ char op;
+ int gen;
+ Reinst *a;
+ union
+ {
+ Rune r;
+ int sub;
+ };
+ union
+ {
+ Rune r1;
+ Reinst *b;
+ };
+};
+
+static int lex(Parselex*);
+static void getnextr(Parselex*);
+static void getnextrlit(Parselex*);
+static void getclass(Parselex*);
+static Renode *e0(Parselex*);
+static Renode *e1(Parselex*);
+static Renode *e2(Parselex*);
+static Renode *e3(Parselex*);
+static Renode *buildclass(Parselex*);
+static Renode *buildclassn(Parselex*);
+static int pcmp(void*, void*);
+static Reprog *regcomp1(char*, int, int);
+static Reinst *compile(Renode*, Reprog*, int);
+static Reinst *compile1(Renode*, Reinst*, int*, int);
+static void prtree(Renode*, int, int);