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/regexec.c | |
parent | 9ae083d81642be3a3ee7ff1e8d28fb9381bb1abf (diff) |
libregexp: improve the transition to next available thread, instruction, and generation
Diffstat (limited to 'sys/src/libregexp/regexec.c')
-rw-r--r-- | sys/src/libregexp/regexec.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/sys/src/libregexp/regexec.c b/sys/src/libregexp/regexec.c index e085abc2a..a68a55843 100644 --- a/sys/src/libregexp/regexec.c +++ b/sys/src/libregexp/regexec.c @@ -19,16 +19,14 @@ regexec(Reprog *p, char *str, Resub *sem, int msize) char *sp, *ep, endc; int i, 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; @@ -38,8 +36,8 @@ regexec(Reprog *p, char *str, Resub *sem, int msize) pool = p->threads; avail = nil; - gen = matchgen = 0; + sp = str; ep = nil; endc = '\0'; @@ -52,7 +50,8 @@ regexec(Reprog *p, char *str, Resub *sem, int msize) *sem->ep = '\0'; } } - for(r = 1; r != L'\0'; sp += i) { + + for(r = L'☺'; r != L'\0'; sp += i) { i = chartorune(&r, sp); gen++; if(matchgen == 0) { @@ -76,7 +75,7 @@ regexec(Reprog *p, char *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) { @@ -89,11 +88,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) @@ -107,11 +102,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++; @@ -171,8 +162,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; |