17dd7cddfSDavid du Colombier #include <u.h> 27dd7cddfSDavid du Colombier #include <libc.h> 37dd7cddfSDavid du Colombier #include <bio.h> 47dd7cddfSDavid du Colombier 57dd7cddfSDavid du Colombier #ifndef EXTERN 67dd7cddfSDavid du Colombier #define EXTERN extern 77dd7cddfSDavid du Colombier #endif 87dd7cddfSDavid du Colombier 97dd7cddfSDavid du Colombier typedef struct Re Re; 107dd7cddfSDavid du Colombier typedef struct Re2 Re2; 117dd7cddfSDavid du Colombier typedef struct State State; 127dd7cddfSDavid du Colombier 137dd7cddfSDavid du Colombier struct State 147dd7cddfSDavid du Colombier { 157dd7cddfSDavid du Colombier int count; 1680ee5cbfSDavid du Colombier int match; 177dd7cddfSDavid du Colombier Re** re; 187dd7cddfSDavid du Colombier State* linkleft; 197dd7cddfSDavid du Colombier State* linkright; 2080ee5cbfSDavid du Colombier State* next[256]; 217dd7cddfSDavid du Colombier }; 227dd7cddfSDavid du Colombier struct Re2 237dd7cddfSDavid du Colombier { 247dd7cddfSDavid du Colombier Re* beg; 257dd7cddfSDavid du Colombier Re* end; 267dd7cddfSDavid du Colombier }; 277dd7cddfSDavid du Colombier struct Re 287dd7cddfSDavid du Colombier { 297dd7cddfSDavid du Colombier uchar type; 307dd7cddfSDavid du Colombier ushort gen; 317dd7cddfSDavid du Colombier union 327dd7cddfSDavid du Colombier { 337dd7cddfSDavid du Colombier Re* alt; /* Talt */ 347dd7cddfSDavid du Colombier Re** cases; /* case */ 357dd7cddfSDavid du Colombier struct /* class */ 367dd7cddfSDavid du Colombier { 377dd7cddfSDavid du Colombier Rune lo; 387dd7cddfSDavid du Colombier Rune hi; 397dd7cddfSDavid du Colombier }; 407dd7cddfSDavid du Colombier Rune val; /* char */ 417dd7cddfSDavid du Colombier }; 427dd7cddfSDavid du Colombier Re* next; 437dd7cddfSDavid du Colombier }; 447dd7cddfSDavid du Colombier 457dd7cddfSDavid du Colombier enum 467dd7cddfSDavid du Colombier { 477dd7cddfSDavid du Colombier Talt = 1, 487dd7cddfSDavid du Colombier Tbegin, 497dd7cddfSDavid du Colombier Tcase, 507dd7cddfSDavid du Colombier Tclass, 517dd7cddfSDavid du Colombier Tend, 527dd7cddfSDavid du Colombier Tor, 537dd7cddfSDavid du Colombier 547dd7cddfSDavid du Colombier Caselim = 7, 557dd7cddfSDavid du Colombier Nhunk = 1<<16, 56*82726826SDavid du Colombier Cbegin = Runemax+1, 5759cc4ca5SDavid du Colombier Flshcnt = (1<<9)-1, 587dd7cddfSDavid du Colombier 597dd7cddfSDavid du Colombier Cflag = 1<<0, 607dd7cddfSDavid du Colombier Hflag = 1<<1, 617dd7cddfSDavid du Colombier Iflag = 1<<2, 627dd7cddfSDavid du Colombier Llflag = 1<<3, 637dd7cddfSDavid du Colombier LLflag = 1<<4, 647dd7cddfSDavid du Colombier Nflag = 1<<5, 657dd7cddfSDavid du Colombier Sflag = 1<<6, 6659cc4ca5SDavid du Colombier Vflag = 1<<7, 6759cc4ca5SDavid du Colombier Bflag = 1<<8 687dd7cddfSDavid du Colombier }; 697dd7cddfSDavid du Colombier 707dd7cddfSDavid du Colombier EXTERN union 717dd7cddfSDavid du Colombier { 727dd7cddfSDavid du Colombier char string[16*1024]; 737dd7cddfSDavid du Colombier struct 747dd7cddfSDavid du Colombier { 75867bfcc6SDavid du Colombier /* 76867bfcc6SDavid du Colombier * if a line requires multiple reads, we keep shifting 77867bfcc6SDavid du Colombier * buf down into pre and then do another read into 78867bfcc6SDavid du Colombier * buf. so you'll get the last 16-32k of the matching line. 79867bfcc6SDavid du Colombier * if pre were smaller than buf you'd get a suffix of the 80867bfcc6SDavid du Colombier * line with a hole cut out. 81867bfcc6SDavid du Colombier */ 82867bfcc6SDavid du Colombier uchar pre[16*1024]; /* to save to previous '\n' */ 837dd7cddfSDavid du Colombier uchar buf[16*1024]; /* input buffer */ 847dd7cddfSDavid du Colombier }; 857dd7cddfSDavid du Colombier } u; 867dd7cddfSDavid du Colombier 877dd7cddfSDavid du Colombier EXTERN char *filename; 8882bf8890SDavid du Colombier EXTERN char *pattern; 897dd7cddfSDavid du Colombier EXTERN Biobuf bout; 907dd7cddfSDavid du Colombier EXTERN char flags[256]; 917dd7cddfSDavid du Colombier EXTERN Re** follow; 927dd7cddfSDavid du Colombier EXTERN ushort gen; 937dd7cddfSDavid du Colombier EXTERN char* input; 947dd7cddfSDavid du Colombier EXTERN long lineno; 957dd7cddfSDavid du Colombier EXTERN int literal; 967dd7cddfSDavid du Colombier EXTERN int matched; 977dd7cddfSDavid du Colombier EXTERN long maxfollow; 987dd7cddfSDavid du Colombier EXTERN long nfollow; 997dd7cddfSDavid du Colombier EXTERN int peekc; 1007dd7cddfSDavid du Colombier EXTERN Biobuf* rein; 1017dd7cddfSDavid du Colombier EXTERN State* state0; 1027dd7cddfSDavid du Colombier EXTERN Re2 topre; 1037dd7cddfSDavid du Colombier 1047dd7cddfSDavid du Colombier extern Re* addcase(Re*); 1057dd7cddfSDavid du Colombier extern void appendnext(Re*, Re*); 1067dd7cddfSDavid du Colombier extern void error(char*); 1077dd7cddfSDavid du Colombier extern int fcmp(void*, void*); /* (Re**, Re**) */ 1087dd7cddfSDavid du Colombier extern void fol1(Re*, int); 1097dd7cddfSDavid du Colombier extern int getrec(void); 1107dd7cddfSDavid du Colombier extern void increment(State*, int); 1117dd7cddfSDavid du Colombier extern State* initstate(Re*); 1127dd7cddfSDavid du Colombier extern void* mal(int); 1137dd7cddfSDavid du Colombier extern void patchnext(Re*, Re*); 1147dd7cddfSDavid du Colombier extern Re* ral(int); 1157dd7cddfSDavid du Colombier extern Re2 re2cat(Re2, Re2); 1167dd7cddfSDavid du Colombier extern Re2 re2class(char*); 1177dd7cddfSDavid du Colombier extern Re2 re2or(Re2, Re2); 1187dd7cddfSDavid du Colombier extern Re2 re2char(int, int); 1197dd7cddfSDavid du Colombier extern Re2 re2star(Re2); 1207dd7cddfSDavid du Colombier extern State* sal(int); 1217dd7cddfSDavid du Colombier extern int search(char*, int); 1227dd7cddfSDavid du Colombier extern void str2top(char*); 1237dd7cddfSDavid du Colombier extern int yyparse(void); 1247dd7cddfSDavid du Colombier extern void reprint(char*, Re*); 1257dd7cddfSDavid du Colombier extern void yyerror(char*, ...); 126