123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- #include <u.h>
- #include <libc.h>
- #include <bio.h>
- #ifndef EXTERN
- #define EXTERN extern
- #endif
- typedef struct Re Re;
- typedef struct Re2 Re2;
- typedef struct State State;
- struct State
- {
- int count;
- int match;
- Re** re;
- State* linkleft;
- State* linkright;
- State* next[256];
- };
- struct Re2
- {
- Re* beg;
- Re* end;
- };
- struct Re
- {
- uchar type;
- ushort gen;
- union
- {
- Re* alt; /* Talt */
- Re** cases; /* case */
- struct /* class */
- {
- Rune lo;
- Rune hi;
- };
- Rune val; /* char */
- };
- Re* next;
- };
- enum
- {
- Talt = 1,
- Tbegin,
- Tcase,
- Tclass,
- Tend,
- Tor,
- Caselim = 7,
- Nhunk = 1<<16,
- Cbegin = 0x10000,
- Flshcnt = (1<<9)-1,
- Cflag = 1<<0,
- Hflag = 1<<1,
- Iflag = 1<<2,
- Llflag = 1<<3,
- LLflag = 1<<4,
- Nflag = 1<<5,
- Sflag = 1<<6,
- Vflag = 1<<7,
- Bflag = 1<<8
- };
- EXTERN union
- {
- char string[16*1024];
- struct
- {
- /*
- * if a line requires multiple reads, we keep shifting
- * buf down into pre and then do another read into
- * buf. so you'll get the last 16-32k of the matching line.
- * if pre were smaller than buf you'd get a suffix of the
- * line with a hole cut out.
- */
- uchar pre[16*1024]; /* to save to previous '\n' */
- uchar buf[16*1024]; /* input buffer */
- };
- } u;
- EXTERN char *filename;
- EXTERN Biobuf bout;
- EXTERN char flags[256];
- EXTERN Re** follow;
- EXTERN ushort gen;
- EXTERN char* input;
- EXTERN long lineno;
- EXTERN int literal;
- EXTERN int matched;
- EXTERN long maxfollow;
- EXTERN long nfollow;
- EXTERN int peekc;
- EXTERN Biobuf* rein;
- EXTERN State* state0;
- EXTERN Re2 topre;
- extern Re* addcase(Re*);
- extern void appendnext(Re*, Re*);
- extern void error(char*);
- extern int fcmp(void*, void*); /* (Re**, Re**) */
- extern void fol1(Re*, int);
- extern int getrec(void);
- extern void increment(State*, int);
- extern State* initstate(Re*);
- extern void* mal(int);
- extern void patchnext(Re*, Re*);
- extern Re* ral(int);
- extern Re2 re2cat(Re2, Re2);
- extern Re2 re2class(char*);
- extern Re2 re2or(Re2, Re2);
- extern Re2 re2char(int, int);
- extern Re2 re2star(Re2);
- extern State* sal(int);
- extern int search(char*, int);
- extern void str2top(char*);
- extern int yyparse(void);
- extern void reprint(char*, Re*);
- extern void yyerror(char*, ...);
|