* egrep -- print lines containing (or not containing) a regular expression
* 0 - ok, and some matches
%token CHAR DOT CCL NCCL OR CAT STAR PLUS QUEST
%left CHAR DOT CCL NCCL '('
char gotofn[NSTATES][NCHARS];
={ $$ = node(CAT, $1, $2); }
={ $$ = node(CAT, $2, $3); }
={ $$ = node(CAT, $2, $3); }
={ $$ = node(CAT, $1, $2); }
={ $$ = cclenter(NCCL); }
={ $$ = node(OR, $1, $3); }
={ $$ = node(CAT, $1, $2); }
={ $$ = unary(STAR, $1); }
={ $$ = unary(PLUS, $1); }
={ $$ = unary(QUEST, $1); }
fprintf(stderr, "egrep: %s\n", s);
case '?': return (QUEST);
if ((c = nextch()) == '^') {
if (c == '\0') synerror();
if (c == '-' && cclcnt > 0 && chars[nxtchar-1] != 0) {
if ((d = nextch()) != 0) {
if (nxtchar >= MAXLIN) overflo();
if (nxtchar >= MAXLIN) overflo();
} while ((c = nextch()) != ']');
if ((c = nextch()) == '\0') synerror();
default: yylval = c; return (CHAR);
if ((c = getc(stdin)) == EOF) return(0);
fprintf(stderr, "egrep: syntax error\n");
if(line >= MAXLIN) overflo();
if(line >= MAXLIN) overflo();
if(line >= MAXLIN) overflo();
fprintf(stderr, "egrep: regular expression too long\n");
for (i=1; i<=line; i++) tmpstat[i] = 0;
else if (right[v] == 0) cfoll(left[v]);
for (n=3; n<=line; n++) tmpstat[n] = 0;
for (n=3; n<=line; n++) initstat[n] = tmpstat[n];
count--; /*leave out position 1 */
if (out[s] == 1) continue;
for (i=0; i<NCHARS; i++) symbol[i] = 0;
num = positions[state[s]];
for (i=3; i<=line; i++) tmpstat[i] = initstat[i];
if ((c = name[curpos]) >= 0) {
if (c < NCHARS) symbol[c] = 1;
if (k!='\n') symbol[k] = 1;
nc = chars[right[curpos]];
for (k=0; k<nc; k++) symbol[chars[pc++]] = 1;
nc = chars[right[curpos]];
for (j = 0; j < NCHARS; j++) {
if (j==chars[pc++]) goto cont;
if (j!='\n') symbol[j] = 1;
else printf("something's funny\n");
for (c=0; c<NCHARS; c++) {
if (symbol[c] == 1) { /* nextstate(s,c) */
for (i=3; i <= line; i++) tmpstat[i] = initstat[i];
if ((k = name[curpos]) >= 0)
| (k == CCL && member(c, right[curpos], 1))
| (k == NCCL && member(c, right[curpos], 0))
number = positions[foll[curpos]];
newpos = foll[curpos] + 1;
for (k=0; k<number; k++) {
if (tmpstat[positions[newpos]] != 1) {
tmpstat[positions[newpos]] = 1;
if (n >= NSTATES) overflo();
if (tmpstat[line] == 1) out[n] = 1;
else if (right[v] == 0) {
if (cstate(left[v]) == 0) return (0);
else if (name[v] == PLUS) return (1);
else if (name[v] == CAT) {
if (cstate(left[v]) == 0 && cstate(right[v]) == 0) return (0);
else { /* name[v] == OR */
if (cstate(left[v]) == 0 || b == 0) return (0);
member(symb, set, torf) {
if (symb == chars[pos++]) return (torf);
if (positions[state[i]] == count) {
for (j=0; j < count; j++)
if (tmpstat[positions[pos++]] != 1) goto nxt;
add(array, n) int *array; {
if (nxtpos + count > MAXPOS) overflo();
positions[nxtpos++] = count;
for (i=3; i <= line; i++) {
case CAT: if (v == left[p]) {
if (cstate(right[p]) == 0) {
case FINAL: if (tmpstat[line] != 1) {
while (--argc > 0 && (++argv)[0][0]=='-')
fprintf(stderr, "egrep: unknown flag\n");
if (freopen(fname = *argv, "r", stdin) == NULL) {
fprintf(stderr, "egrep: can't open %s\n", fname);
else while (--argc >= 0) {
if ((f = open(file, 0)) < 0) {
fprintf(stderr, "egrep: can't open %s\n", file);
if ((ccount = read(f,p,512))<=0) goto done;
istat = cstat = gotofn[0]['\n'];
if (out[cstat]) goto found;
cstat = gotofn[cstat][*p&0377]; /* all input chars made positive */
if (nfile > 1 && hflag) printf("%s:", file);
if (bflag) printf("%d:", blkno);
if (nflag) printf("%ld:", lnum);
while (nlp < &buf[1024]) putchar(*nlp++);
while (nlp < p) putchar(*nlp++);
if ((out[(cstat=istat)]) == 0) goto brk2;
if ((ccount = read(f, p, 512)) <= 0) goto done;
else if (p == &buf[1024]) {
if ((ccount = read(f, p, 512)) <= 0) goto done;
if ((ccount = read(f, p, &buf[1024]-p)) <= 0) goto done;
if (out[(cstat=istat)]) goto cfound;
if ((ccount = read(f, p, 512)) <= 0) break;
else if (p == &buf[1024]) {
if ((ccount = read(f, p, 512)) <= 0) break;
if ((ccount = read(f, p, &buf[1024] - p)) <= 0) break;