]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/libregexp/regcomp.c
aux/realemu: run cpuproc in same fd group as fileserver
[plan9front.git] / sys / src / libregexp / regcomp.c
index 61f9683a663d46ce152930f857aa34b82a22079c..c7b3b9b870385f52a24cca568267f36538faa7ab 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(end <= reinst + reprog->len);
        return reinst;
 }
 
@@ -306,17 +308,14 @@ getnextr(Parselex *l)
 {
        l->literal = 0;
        if(l->done) {
-               l->rune = 0;
+               l->rune = L'\0';
                return;
        }
        l->rawexp += chartorune(&l->rune, l->rawexp);
-       if(l->rune == L'\\') {
-               l->rawexp += chartorune(&l->rune, l->rawexp);
-               l->literal = 1;
-       }
        if(*l->rawexp == 0)
                l->done = 1;
-       return;
+       if(l->rune == L'\\')
+               getnextrlit(l);
 }
 
 static void
@@ -325,13 +324,12 @@ getnextrlit(Parselex *l)
        l->literal = 1;
        if(l->done) {
                l->literal = 0;
-               l->rune = 0;
+               l->rune = L'\0';
                return;
        }
        l->rawexp += chartorune(&l->rune, l->rawexp);
        if(*l->rawexp == 0)
                l->done = 1;
-       return;
 }
 
 static int
@@ -345,7 +343,7 @@ lex(Parselex *l)
        if(l->literal)
                return l->peeklex = LRUNE;
        switch(l->rune){
-       case 0:
+       case L'\0':
                return l->peeklex = LEND;
        case L'*':
        case L'?':
@@ -373,16 +371,20 @@ lex(Parselex *l)
 static int
 pcmp(void *va, void *vb)
 {
-       vlong n;
        Rune *a, *b;
 
        a = va;
        b = vb;
 
-       n = (vlong)b[0] - (vlong)a[0];
-       if(n)
-               return n;
-       return (vlong)b[1] - (vlong)a[1];
+       if(a[0] < b[0])
+               return 1;
+       if(a[0] > b[0])
+               return -1;
+       if(a[1] < b[1])
+               return 1;
+       if(a[1] > b[1])
+               return -1;
+       return 0;
 }
 
 static void
@@ -458,7 +460,7 @@ getclass(Parselex *l)
        q[2] = 0;
 }
 
-/* classes are in descending order */
+/* classes are in descending order see pcmp */
 static Renode*
 buildclassn(Parselex *l)
 {
@@ -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;
+       }
+}