diff options
author | spew <devnull@localhost> | 2017-02-03 15:33:15 -0600 |
---|---|---|
committer | spew <devnull@localhost> | 2017-02-03 15:33:15 -0600 |
commit | 930be3d3173ce989d71675acedfca1fdf5466751 (patch) | |
tree | b62c735028575a81c86e36e6d45ae83d1e33bcbf /sys/src/libregexp/rregexec.c | |
parent | 9ae083d81642be3a3ee7ff1e8d28fb9381bb1abf (diff) |
libregexp: improve the transition to next available thread, instruction, and generation
Diffstat (limited to 'sys/src/libregexp/rregexec.c')
-rw-r--r-- | sys/src/libregexp/rregexec.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/sys/src/libregexp/rregexec.c b/sys/src/libregexp/rregexec.c index 663bf4569..c928cccb7 100644 --- a/sys/src/libregexp/rregexec.c +++ b/sys/src/libregexp/rregexec.c @@ -18,16 +18,14 @@ rregexec(Reprog *p, Rune *str, Resub *sem, int msize) Rune *rsp, *rep, endr, r; int matchgen, gen; + memset(p->threads, 0, sizeof(Rethread)*p->nthr); if(msize > NSUBEXPM) msize = NSUBEXPM; - if(p->startinst->gen != 0) { for(ci = p->startinst; ci < p->startinst + p->len; ci++) ci->gen = 0; } - memset(p->threads, 0, sizeof(Rethread)*p->nthr); - clist = lists; clist->head = nil; clist->tail = &clist->head; @@ -37,8 +35,8 @@ rregexec(Reprog *p, Rune *str, Resub *sem, int msize) pool = p->threads; avail = nil; - gen = matchgen = 0; + rsp = str; rep = nil; endr = L'\0'; @@ -51,7 +49,8 @@ rregexec(Reprog *p, Rune *str, Resub *sem, int msize) *sem->rep = '\0'; } } - for(r = 1; r != L'\0'; rsp++) { + + for(r = L'☺'; r != L'\0'; rsp++) { r = *rsp; gen++; if(matchgen == 0) { @@ -75,7 +74,7 @@ rregexec(Reprog *p, Rune *str, Resub *sem, int msize) break; ci = t->i; Again: - if(ci->gen == gen || matchgen && t->gen > matchgen) + if(ci->gen == gen) goto Done; ci->gen = gen; switch(ci->op) { @@ -88,11 +87,7 @@ Again: t->next = nil; *nlist->tail = t; nlist->tail = &t->next; - if(next == nil) - break; - t = next; - ci = t->i; - goto Again; + goto Next; case OCLASS: Class: if(r < ci->r) @@ -106,11 +101,7 @@ Again: t->next = nil; *nlist->tail = t; nlist->tail = &t->next; - if(next == nil) - break; - t = next; - ci = t->i; - goto Again; + goto Next; case ONOTNL: if(r != L'\n') { ci++; @@ -170,8 +161,14 @@ Again: next = t->next; t->next = avail; avail = t; + Next: if(next == nil) break; + if(matchgen && next->gen > matchgen) { + *clist->tail = avail; + avail = next; + break; + } t = next; ci = t->i; goto Again; |