]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/libregexp/regcomp.c
libregexp: improve the transition to next available thread, instruction, and generation
[plan9front.git] / sys / src / libregexp / regcomp.c
index 58bf864d7d61a6bc5f9452328ffd63e6e60db504..3e3ba6ae529841dcbe4f411074f2d4376ed4c12d 100644 (file)
@@ -78,14 +78,17 @@ e2(Parselex *plex)
        Renode *n;
 
        n = e3(plex);
-       if(lex(plex) == LREP) {
+       while(lex(plex) == LREP) {
                switch(plex->rune) {
                case L'*':
-                       return node(plex, TSTAR, n, nil);
+                       n = node(plex, TSTAR, n, nil);
+                       break;
                case L'+':
-                       return node(plex, TPLUS, n, nil);
+                       n = node(plex, TPLUS, n, nil);
+                       break;
                case L'?':
-                       return node(plex, TQUES, n, nil);
+                       n = node(plex, TQUES, n, nil);
+                       break;
                }
        }
        plex->peek = 1;
@@ -153,17 +156,6 @@ initplex(Parselex *plex, char *regstr, int lit)
        return plex;
 }
 
-static int
-maxthreads(Renode *tree)
-{
-       tree = tree->left;
-       if(tree->op == TCAT)
-               tree = tree->left;
-       if(tree->op == TBOL)
-               return 2;
-       return -1;
-}
-
 static Reprog*
 regcomp1(char *regstr, int nl, int lit)
 {
@@ -184,21 +176,17 @@ regcomp1(char *regstr, int nl, int lit)
                return nil;
        }
 
+       maxthr = regstrlen + 1;
        parsetr = node(&plex, TSUB, e0(&plex), nil);
-       maxthr = maxthreads(parsetr);
-       if(maxthr == -1)
-               maxthr = regstrlen;
 
-       prtree(parsetr, 0, 1);
+//     prtree(parsetr, 0, 1);
        reprog = malloc(sizeof(Reprog) +
                        sizeof(Reinst) * plex.instrs +
-                       sizeof(Rethread) * maxthr +
-                       sizeof(Rethread*) * maxthr);
+                       sizeof(Rethread) * maxthr);
        reprog->len = plex.instrs;
        reprog->nthr = maxthr;
        reprog->startinst = compile(parsetr, reprog, nl);
        reprog->threads = (Rethread*)(reprog->startinst + reprog->len);
-       reprog->thrpool = (Rethread**)(reprog->threads + reprog->nthr);
        reprog->regstr = regstr;
 
        free(plex.nodes);
@@ -305,12 +293,13 @@ Tailcall:
 static Reinst*
 compile(Renode *parsetr, Reprog *reprog, int nl)
 {
-       Reinst *reinst;
+       Reinst *reinst, *end;
        int sub;
 
        sub = 0;
        reinst = (Reinst*)(reprog+1);
-       compile1(parsetr, reinst, &sub, nl);
+       end = compile1(parsetr, reinst, &sub, nl);
+       assert(reinst + reprog->len == end);
        return reinst;
 }