]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/libregexp/rregexec.c
libregexp: improve the transition to next available thread, instruction, and generation
[plan9front.git] / sys / src / libregexp / rregexec.c
index 663bf456958c5140bffd9059278ed9ad2c1dd6ad..c928cccb7b84087d02c9a271dd96985a707e7bcd 100644 (file)
@@ -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;