X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=sys%2Fsrc%2Flibregexp%2Fregcomp.c;h=3e3ba6ae529841dcbe4f411074f2d4376ed4c12d;hb=930be3d3173ce989d71675acedfca1fdf5466751;hp=61f9683a663d46ce152930f857aa34b82a22079c;hpb=ed76659c054ce781ae6050e563de9ad40b3d25cd;p=plan9front.git diff --git a/sys/src/libregexp/regcomp.c b/sys/src/libregexp/regcomp.c index 61f9683a6..3e3ba6ae5 100644 --- a/sys/src/libregexp/regcomp.c +++ b/sys/src/libregexp/regcomp.c @@ -176,9 +176,10 @@ regcomp1(char *regstr, int nl, int lit) return nil; } - maxthr = regstrlen; + maxthr = regstrlen + 1; parsetr = node(&plex, TSUB, e0(&plex), nil); +// prtree(parsetr, 0, 1); reprog = malloc(sizeof(Reprog) + sizeof(Reinst) * plex.instrs + sizeof(Rethread) * maxthr); @@ -292,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; } @@ -503,3 +505,65 @@ buildclass(Parselex *l) } return n; } + +static void +prtree(Renode *tree, int d, int f) +{ + int i; + + if(tree == nil) + return; + if(f) + for(i = 0; i < d; i++) + print("\t"); + switch(tree->op) { + case TCAT: + prtree(tree->left, d, 0); + prtree(tree->right, d, 1); + break; + case TOR: + print("TOR\n"); + prtree(tree->left, d+1, 1); + for(i = 0; i < d; i++) + print("\t"); + print("|\n"); + prtree(tree->right, d+1, 1); + break; + case TSTAR: + print("*\n"); + prtree(tree->left, d+1, 1); + break; + case TPLUS: + print("+\n"); + prtree(tree->left, d+1, 1); + break; + case TQUES: + print("?\n"); + prtree(tree->left, d+1, 1); + break; + case TANY: + print(".\n"); + prtree(tree->left, d+1, 1); + break; + case TBOL: + print("^\n"); + break; + case TEOL: + print("$\n"); + break; + case TSUB: + print("TSUB\n"); + prtree(tree->left, d+1, 1); + break; + case TRUNE: + print("TRUNE: %C\n", tree->r); + break; + case TNOTNL: + print("TNOTNL: !\\n\n"); + break; + case TCLASS: + print("CLASS: %C-%C\n", tree->r, tree->r1); + prtree(tree->left, d, 1); + break; + } +}