summaryrefslogtreecommitdiff
path: root/sys/src/libregexp/rregexec.c
diff options
context:
space:
mode:
authorspew <devnull@localhost>2017-02-03 15:33:15 -0600
committerspew <devnull@localhost>2017-02-03 15:33:15 -0600
commit930be3d3173ce989d71675acedfca1fdf5466751 (patch)
treeb62c735028575a81c86e36e6d45ae83d1e33bcbf /sys/src/libregexp/rregexec.c
parent9ae083d81642be3a3ee7ff1e8d28fb9381bb1abf (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.c29
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;