1*4246b616SDavid du Colombier #include <u.h>
2*4246b616SDavid du Colombier #include <libc.h>
3*4246b616SDavid du Colombier #include <bio.h>
4*4246b616SDavid du Colombier #include <regexp.h>
5*4246b616SDavid du Colombier #include "/sys/src/libregexp/regcomp.h"
6*4246b616SDavid du Colombier #include "dfa.h"
7*4246b616SDavid du Colombier
8*4246b616SDavid du Colombier #define DUMP
9*4246b616SDavid du Colombier
10*4246b616SDavid du Colombier void
dump(Dreprog * pp)11*4246b616SDavid du Colombier dump(Dreprog *pp)
12*4246b616SDavid du Colombier {
13*4246b616SDavid du Colombier int i, j;
14*4246b616SDavid du Colombier Dreinst *l;
15*4246b616SDavid du Colombier
16*4246b616SDavid du Colombier print("start %ld %ld %ld %ld\n",
17*4246b616SDavid du Colombier pp->start[0]-pp->inst,
18*4246b616SDavid du Colombier pp->start[1]-pp->inst,
19*4246b616SDavid du Colombier pp->start[2]-pp->inst,
20*4246b616SDavid du Colombier pp->start[3]-pp->inst);
21*4246b616SDavid du Colombier
22*4246b616SDavid du Colombier for(i=0; i<pp->ninst; i++){
23*4246b616SDavid du Colombier l = &pp->inst[i];
24*4246b616SDavid du Colombier print("%d:", i);
25*4246b616SDavid du Colombier for(j=0; j<l->nc; j++){
26*4246b616SDavid du Colombier print(" [");
27*4246b616SDavid du Colombier if(j == 0)
28*4246b616SDavid du Colombier if(l->c[j].start > 1)
29*4246b616SDavid du Colombier print("<bad start %d>\n", l->c[j].start);
30*4246b616SDavid du Colombier if(j != 0)
31*4246b616SDavid du Colombier print("%C%s", l->c[j].start&0xFFFF, (l->c[j].start&0x10000) ? "$" : "");
32*4246b616SDavid du Colombier print("-");
33*4246b616SDavid du Colombier if(j != l->nc-1)
34*4246b616SDavid du Colombier print("%C%s", (l->c[j+1].start&0xFFFF)-1, (l->c[j+1].start&0x10000) ? "$" : "");
35*4246b616SDavid du Colombier print("] %ld", l->c[j].next - pp->inst);
36*4246b616SDavid du Colombier }
37*4246b616SDavid du Colombier if(l->isfinal)
38*4246b616SDavid du Colombier print(" final");
39*4246b616SDavid du Colombier if(l->isloop)
40*4246b616SDavid du Colombier print(" loop");
41*4246b616SDavid du Colombier print("\n");
42*4246b616SDavid du Colombier }
43*4246b616SDavid du Colombier }
44*4246b616SDavid du Colombier
45*4246b616SDavid du Colombier
46*4246b616SDavid du Colombier void
main(int argc,char ** argv)47*4246b616SDavid du Colombier main(int argc, char **argv)
48*4246b616SDavid du Colombier {
49*4246b616SDavid du Colombier int i;
50*4246b616SDavid du Colombier Reprog *p;
51*4246b616SDavid du Colombier Dreprog *dp;
52*4246b616SDavid du Colombier
53*4246b616SDavid du Colombier i = 1;
54*4246b616SDavid du Colombier p = regcomp(argv[i]);
55*4246b616SDavid du Colombier if(p == 0){
56*4246b616SDavid du Colombier print("=== %s: bad regexp\n", argv[i]);
57*4246b616SDavid du Colombier }
58*4246b616SDavid du Colombier // print("=== %s\n", argv[i]);
59*4246b616SDavid du Colombier // rdump(p);
60*4246b616SDavid du Colombier dp = dregcvt(p);
61*4246b616SDavid du Colombier print("=== dfa\n");
62*4246b616SDavid du Colombier dump(dp);
63*4246b616SDavid du Colombier
64*4246b616SDavid du Colombier for(i=2; i<argc; i++)
65*4246b616SDavid du Colombier print("match %d\n", dregexec(dp, argv[i], 1));
66*4246b616SDavid du Colombier exits(0);
67*4246b616SDavid du Colombier }
68