diff options
author | ben <ben@rana> | 2016-04-26 22:23:44 -0500 |
---|---|---|
committer | ben <ben@rana> | 2016-04-26 22:23:44 -0500 |
commit | 0a460e1722c50e31653359f8a86fe0b606d2b513 (patch) | |
tree | b5a00bbfc883aa98709db012e0a7bacc67e234af /sys/src/libregexp/regimpl.h | |
parent | 651d6c2bc68e7e5224c3ba41b094e37b1c1890ed (diff) |
New libregexp and APE ported to native
Diffstat (limited to 'sys/src/libregexp/regimpl.h')
-rw-r--r-- | sys/src/libregexp/regimpl.h | 104 |
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); |