]> 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 61f9683a663d46ce152930f857aa34b82a22079c..3e3ba6ae529841dcbe4f411074f2d4376ed4c12d 100644 (file)
@@ -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;
+       }
+}