X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=sys%2Fsrc%2Flibregexp%2Fregcomp.c;h=3e3ba6ae529841dcbe4f411074f2d4376ed4c12d;hb=930be3d3173ce989d71675acedfca1fdf5466751;hp=58bf864d7d61a6bc5f9452328ffd63e6e60db504;hpb=0a460e1722c50e31653359f8a86fe0b606d2b513;p=plan9front.git diff --git a/sys/src/libregexp/regcomp.c b/sys/src/libregexp/regcomp.c index 58bf864d7..3e3ba6ae5 100644 --- a/sys/src/libregexp/regcomp.c +++ b/sys/src/libregexp/regcomp.c @@ -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; }