grep.h (2224B)
1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 5 #ifndef EXTERN 6 #define EXTERN extern 7 #endif 8 9 typedef struct Re Re; 10 typedef struct Re2 Re2; 11 typedef struct State State; 12 13 struct State 14 { 15 int count; 16 int match; 17 Re** re; 18 State* linkleft; 19 State* linkright; 20 State* next[256]; 21 }; 22 struct Re2 23 { 24 Re* beg; 25 Re* end; 26 }; 27 struct Re 28 { 29 uchar type; 30 ushort gen; 31 union 32 { 33 Re* alt; /* Talt */ 34 Re** cases; /* case */ 35 struct /* class */ 36 { 37 Rune lo; 38 Rune hi; 39 } x; 40 Rune val; /* char */ 41 } u; 42 Re* next; 43 }; 44 45 enum 46 { 47 Talt = 1, 48 Tbegin, 49 Tcase, 50 Tclass, 51 Tend, 52 Tor, 53 54 Caselim = 7, 55 Nhunk = 1<<16, 56 Cbegin = 0x10000, 57 Flshcnt = (1<<9)-1, 58 59 Cflag = 1<<0, 60 Hflag = 1<<1, 61 Iflag = 1<<2, 62 Llflag = 1<<3, 63 LLflag = 1<<4, 64 Nflag = 1<<5, 65 Sflag = 1<<6, 66 Vflag = 1<<7, 67 Bflag = 1<<8 68 }; 69 70 EXTERN union 71 { 72 char string[16*1024]; 73 struct 74 { 75 /* 76 * if a line requires multiple reads, we keep shifting 77 * buf down into pre and then do another read into 78 * buf. so you'll get the last 16-32k of the matching line. 79 * if h were smaller than buf you'd get a suffix of the 80 * line with a hole cut out. 81 */ 82 uchar pre[16*1024]; /* to save to previous '\n' */ 83 uchar buf[16*1024]; /* input buffer */ 84 } u; 85 } u; 86 87 EXTERN char *filename; 88 EXTERN Biobuf bout; 89 EXTERN char flags[256]; 90 EXTERN Re** follow; 91 EXTERN ushort gen; 92 EXTERN char* input; 93 EXTERN long lineno; 94 EXTERN int literal; 95 EXTERN int matched; 96 EXTERN long maxfollow; 97 EXTERN long nfollow; 98 EXTERN int peekc; 99 EXTERN Biobuf* rein; 100 EXTERN State* state0; 101 EXTERN Re2 topre; 102 103 extern Re* addcase(Re*); 104 extern void appendnext(Re*, Re*); 105 extern void error(char*); 106 extern int fcmp(const void*, const void*); /* (Re**, Re**) */ 107 extern void fol1(Re*, int); 108 extern int getrec(void); 109 extern void increment(State*, int); 110 #define initstate grepinitstate 111 extern State* initstate(Re*); 112 extern void* mal(int); 113 extern void patchnext(Re*, Re*); 114 extern Re* ral(int); 115 extern Re2 re2cat(Re2, Re2); 116 extern Re2 re2class(char*); 117 extern Re2 re2or(Re2, Re2); 118 extern Re2 re2char(int, int); 119 extern Re2 re2star(Re2); 120 extern State* sal(int); 121 extern int search(char*, int); 122 extern void str2top(char*); 123 extern int yyparse(void); 124 extern void reprint(char*, Re*); 125 extern void yyerror(char*, ...);