V10/cmd/egrep/egrep.bundle
# To unbundle, sh this file
echo mkfile 1>&2
sed 's/.//' >mkfile <<'//GO.SYSIN DD mkfile'
-CFLAGS=-O
-YFLAGS=-d
-NPROC=2
-
-egrep: gram.o main.o egrep.o bm.o anal.o
- $CC $CFLAGS -o $target $prereq
-
-install: egrep
- cp egrep /usr/bin/egrep
- strip /usr/bin/egrep
- chmod 775 /usr/bin/egrep
- chown bin,bin /usr/bin/egrep
-
-clean:V:
- rm -f *.o egrep
-
-y.tab.h: gram.o
-egrep.o anal.o: y.tab.h
-anal.o bm.o egrep.o main.o gram.o: hdr.h
-
-pp:
- smallpr mkfile hdr.h anal.c bm.c egrep.c gram.y main.c
-
-egrep.bundle:V:
- bundle mkfile *.h *.c *.y > $target
//GO.SYSIN DD mkfile
echo hdr.h 1>&2
sed 's/.//' >hdr.h <<'//GO.SYSIN DD hdr.h'
-#include <fio.h>
-#include <ctype.h>
-#include <libc.h>
-
-#define BLKSIZE 1024 /* size of reported disk blocks */
-#define MAXLIN 10000
-#define MAXPOS 20000
-#define NCHARS 256
-#define NSTATES 128
-#define FINAL -1
-#define LEFT '\177' /* serves as ^ */
-#define RIGHT '\n' /* serves as record separator and as $ */
-
-typedef struct State
-{
- struct State *gotofn[NCHARS];
- int out;
-} State;
-extern State states[];
-State *nxtst();
-extern int state[];
-extern int line;
-extern int name[];
-extern int left[];
-extern int right[];
-extern int parent[];
-extern int foll[];
-extern int positions[];
-extern char chars[];
-extern int nxtpos;
-extern int nxtfoll;
-extern int inxtpos;
-extern int nxtfoll;
-extern int nxtchar;
-extern int tmpstat[];
-extern State *istat;
-extern int nstate;
-extern int xstate;
-extern int count;
-extern char *input;
-extern char *progname;
-
-extern char reinit;
-
-extern int begout;
-extern int begcnt;
-extern int begstat[];
-
-extern int colpos[];
-extern int cntpos;
-
-extern long lnum;
-extern int bflag;
-extern int cflag;
-extern int fflag;
-extern int hflag;
-extern int iflag;
-extern int lflag;
-extern int nflag;
-extern int sflag;
-extern int vflag;
-extern int nfile;
-extern long tln;
-extern int nsucc;
-extern int badbotch;
-
-extern int expfile;
-
-extern int bmegrep;
-extern int scanexit;
//GO.SYSIN DD hdr.h
echo y.tab.h 1>&2
sed 's/.//' >y.tab.h <<'//GO.SYSIN DD y.tab.h'
-# define CHAR 257
-# define DOT 258
-# define CCL 259
-# define NCCL 260
-# define OR 261
-# define CAT 262
-# define STAR 263
-# define PLUS 264
-# define QUEST 265
//GO.SYSIN DD y.tab.h
echo anal.c 1>&2
sed 's/.//' >anal.c <<'//GO.SYSIN DD anal.c'
-#include "hdr.h"
-#include "y.tab.h"
-
-#define NLIT 256
-#define LSTART litp = litb
-#define LEND {*litp = 0; if(strlen(litb) > strlen(blit))strcpy(blit,litb);}
-
-static char *litp, litb[NLIT], *blit;
-
-
-/*
- islit has to return 1 if we are to use boyer-moore.
- in this case, set buf to the literal string and
- set bmegrep to 1 if there is a regular expression
- beside the literal (literal can be anywhere).
-*/
-islit(buf)
- char *buf;
-{
- bmegrep = 0;
- blit = buf;
- *blit = 0;
- LSTART;
-
-/* pr(line-2, ""); */
-
- lit(line-2);
- LEND;
- if(strlen(blit) > 1){
- /* bmegrep set by lit */
- return(1);
- }
- return(0);
-}
-
-/*
- lit builds literal strings in litb. we ensure these are compulsory
- literal string by only descending the right nodes.
-*/
-lit(n)
-{
- if(name[n] == CAT){
- lit(left[n]);
- lit(right[n]);
- } else if(name[n] == PLUS){
- lit(left[n]);
- LEND; /* can't go on past a + */
- LSTART;
- bmegrep = 1;
- lit(left[n]); /* but we can start with one! */
- } else if((name[n] == CCL) && (chars[right[n]] == 1)){
- *litp++ = chars[right[n]+1];
- if(litp == &litb[NLIT])
- litp--;
- } else if(left[n] == 0 && name[n] < 256
- && name[n] != LEFT && name[n] != RIGHT){
- *litp++ = name[n];
- if(litp == &litb[NLIT])
- litp--;
- } else {
- LEND;
- LSTART;
- bmegrep = 1;
- }
-}
-
-/*#ifdef DEBUG*/
-
-pr(n, s)
- char *s;
-{
- char buf[256];
- int i, cnt;
-
- print("%s", s);
- sprint(buf, "%s ", s);
- switch(name[n])
- {
- case FINAL: print("expr=\n"); pr(left[n], buf); break;
- case DOT: print("%d: .\n",n); break;
- case STAR: print("%d: *\n",n); pr(left[n], buf); break;
- case PLUS: print("%d: +\n",n); pr(left[n], buf); break;
- case QUEST: print("%d: ?\n",n); pr(left[n], buf); break;
- case CAT: print("%d: cat\n", n); pr(left[n], buf); pr(right[n], buf); break;
- case OR: print("%d: or\n", n); pr(left[n], buf); pr(right[n], buf); break;
- case NCCL:
- case CCL: print("%d: [%s", n, name[n]==NCCL? "^":"");
- for(i = right[n], cnt = chars[i++]; cnt > 0; cnt--)
- print("%c", chars[i++]);
- print("]\n");
- break;
- default:
- if(name[n] < 256)
- print("%d: '%c'\n", n, name[n]);
- else
- print("URK %d\n", name[n]);
- break;
- }
-}
-/*#endif*/
//GO.SYSIN DD anal.c
echo bm.c 1>&2
sed 's/.//' >bm.c <<'//GO.SYSIN DD bm.c'
-#include "hdr.h"
-
-#define LARGE 100000
-
-static int delta0[256];
-static char cmap[256];
-static char *bmpat;
-
-bmprep(pattern)
- char *pattern;
-{
- register int j, patlen;
-
- patlen = strlen(bmpat = pattern);
- for(j = 0; j < 256; j++){
- delta0[j] = patlen;
- cmap[j] = j;
- }
- for(j = 0; j < patlen-1; j++)
- delta0[pattern[j]] = patlen-j-1;
- delta0[pattern[patlen-1]] = LARGE;
- if(iflag){
- for(j = 0; j < patlen-1; j++)
- if(islower(pattern[j]))
- delta0[toupper(pattern[j])] = patlen-j-1;
- if(islower(pattern[patlen-1]))
- delta0[toupper(pattern[patlen-1])] = LARGE;
- for(j = 'A'; j <= 'Z'; j++)
- cmap[j] = tolower(j);
- }
-}
-
-bmexecute(file)
-char *file;
-{
- register char *p;
- register char *endpt;
- register char *s;
- register int j;
- int len, patlen = strlen(bmpat);
- char *rdpt;
- int fd, eof, n;
- long seek;
- char *nlp, *proc, *np, *op;
- char buf[8*8192];
-
- if(file){
- if((fd = open(file, 0)) < 0){
- fprint(2, "%s: can't open %s\n", progname, file);
- badbotch=1;
- return;
- }
- } else
- fd = 0;
- lnum = 1;
- tln = 0;
- rdpt = buf;
- seek = 0;
- for(eof = 0; eof == 0;){
- Fflush(1);
- if((n = read(fd, rdpt, &buf[sizeof buf]-rdpt)) <= 0){
- if(rdpt == buf)
- break; /* eof, nothing left to process */
- *rdpt = '\n'; /* terminate */
- endpt = rdpt+1;
- eof = 1;
- } else {
- for(p = &rdpt[n]; p >= rdpt;)
- if(*--p == '\n')
- break;
- if(p < rdpt){ /* line bigger than buf!! */
- rdpt = &buf[sizeof buf/2]; /* chop in half */
- continue; /* reading */
- }
- endpt = p+1;
- }
- /*
- invariants:
- no newline between buf and rdpt[-1]
- lnum = nlines before buf
- seek = char offset of buf[0]
- last char read is rdpt[n-1]
- first char after last \n is endpt
-
- following is exited to three places:
- succeed: match
- refresh: !match (readjust ptrs and loop)
-
- */
- p = buf+patlen-1;
- proc = buf-1;
- scan:
- for(;;){
- while((p += delta0[*(unsigned char *)p]) < endpt)
- ;
- if(p < (buf+LARGE)){ /* no match */
- goto refresh;
- }
- p -= LARGE;
- for(j = patlen-2, s = p-1; j >= 0; j--)
- if(cmap[*s--] != bmpat[j])
- break;
- if(j < 0) /* match!! */
- goto succeed;
- fail:
- p++;
- }
- succeed:
- if(bmegrep || !cflag || !sflag){ /* lflag doesn't matter */
- nlp = memchr(p, '\n', (endpt+1)-p);
- op = p;
- p -= patlen-1;
- while(*p != '\n')
- if(--p < buf) break;
- p++;
- if(bmegrep)
- if(legrep(p) == 0){
- p = op;
- goto fail;
- }
- }
- nsucc = 1;
- if (cflag){
- tln++;
- p = nlp+1;
- goto scan;
- } else if(sflag){
- if(scanexit) exit(0);
- } else if(lflag){
- Fprint(1, "%s\n", file);
- close(fd);
- return;
- } else {
- if (nfile > 1 && hflag)
- Fprint(1, "%s:", file);
- if (bflag)
- Fprint(1, "%ld:", (seek+(p-buf))/BLKSIZE);
- if (nflag){
- while(np = memchr(proc+1, '\n', p-proc)){
- lnum++;
- proc = np;
- }
- Fprint(1, "%ld:", lnum);
- }
- Fwrite(1, p, nlp-p+1);
- p = nlp+1;
- if(p < endpt)
- goto scan;
- }
- refresh:
- if(nflag){ /* count newlines that we haven't proc */
- while(proc = memchr(proc+1, '\n', endpt-proc))
- lnum++;
- }
- memcpy(buf, endpt, j = &rdpt[n]-endpt);
- rdpt = &buf[j];
- seek += n;
- }
-done: close(fd);
- if (cflag) {
- if (nfile > 1)
- Fprint(1, "%s:", file);
- Fprint(1, "%ld\n", tln);
- }
-}
-
-/*
- isn't egrep pretty when it just has to mtach or not?
-*/
-
-legrep(p)
- register char *p;
-{
- register State *cstat, *t;
-
- if(reinit == 1)
- clearg();
- cstat = istat;
- if(cstat->out)
- return(1);
- for(;;){
- if((t = cstat->gotofn[*(unsigned char *)p]) == 0)
- cstat = nxtst(cstat, *(unsigned char *)p);
- else
- cstat = t;
- if(cstat->out){
- return(1);
- }
- if(*p++ == RIGHT){
- return(0);
- }
- }
-}
//GO.SYSIN DD bm.c
echo egrep.c 1>&2
sed 's/.//' >egrep.c <<'//GO.SYSIN DD egrep.c'
-#include "hdr.h"
-#include "y.tab.h"
-
-cgotofn() {
- register i;
- count = cntpos = 0;
- nxtpos = 0;
- nxtfoll = MAXPOS-1;
- begout = 0;
- for (i=1; i<=line; i++) colpos[i] = 0;
- if (first(line-1)==0) {
- colpos[line] = 1;
- cntpos++;
- begout = 1;
- }
- for (i=1; i<=line; i++) tmpstat[i] = begstat[i] = colpos[i];
- count = begcnt = cntpos-1; /* leave out position 1 */
- tmpstat[1] = begstat[1] = 0;
- addstate(1);
- inxtpos = nxtpos;
- istat = nxtst(states+1,LEFT);
-}
-
-State *
-nxtst(ss,c)
-State *ss;
-char c;
-{
- register i, num, k;
- int pos, curpos, number, newpos;
- int s = ss-states;
- num = positions[state[s]];
- count = begcnt;
- for (i=3; i<=line; i++) tmpstat[i] = begstat[i];
- pos = state[s] + 1;
- for (i=0; i<num; i++) {
- curpos = positions[pos];
- if ((k = name[curpos]) >= 0) {
- if (
- (k == c)
- | (k == DOT && c != LEFT && c != RIGHT)
- | (k == CCL && member(c, right[curpos], 1))
- | (k == NCCL && member(c, right[curpos], 0) && c != LEFT && c != RIGHT)
- ) {
- if (foll[curpos] == 0) {
- cntpos = 0;
- for (k=1; k<=line; k++) colpos[k] = 0;
- follow(curpos);
- addfoll(curpos);
- }
- number = positions[foll[curpos]];
- newpos = foll[curpos] - 1;
- for (k=0; k<number; k++) {
- if (tmpstat[positions[newpos]] != 1) {
- tmpstat[positions[newpos]] = 1;
- count++;
- }
- newpos--;
- }
- }
- }
- pos++;
- }
- if (notin(nstate)) {
- if (++nstate >= NSTATES) {
- nxtpos = inxtpos;
- reinit = 1;
- nstate = 1;
- addstate(1);
- return states+1;
- }
- addstate(nstate);
- return(states[s].gotofn[c] = states+nstate);
- }
- else {
- return(states[s].gotofn[c] = states+xstate);
- }
-}
-
-first(v) {
- register b;
- if (left[v] == 0) {
- if (colpos[v] != 1) {
- colpos[v] = 1;
- cntpos++;
- }
- return(1);
- }
- else if (right[v] == 0) {
- if (first(left[v]) == 0) return (0);
- else if (name[v] == PLUS) return (1);
- else return (0);
- }
- else if (name[v] == CAT) {
- if (first(left[v]) == 0 && first(right[v]) == 0) return (0);
- else return (1);
- }
- else { /* name[v] == OR */
- b = first(right[v]);
- if (first(left[v]) == 0 || b == 0) return (0);
- else return (1);
- }
-}
-
-member(symb, set, torf) {
- register i, num, pos;
- num = chars[set];
- pos = set + 1;
- for (i=0; i<num; i++)
- if (symb == chars[pos++]) return (torf);
- return (!torf);
-}
-
-notin(n) {
- register i, j, pos;
- for (i=1; i<=n; i++) {
- if (positions[state[i]] == count) {
- pos = state[i] + 1;
- for (j=0; j < count; j++) {
- if (tmpstat[positions[pos++]] != 1) goto nxt; }
- xstate = i;
- return (0);
- }
- nxt: ;
- }
- return (1);
-}
-
-addstate(n) {
- register i;
- if (nxtpos + count >= nxtfoll) {
- overflo(); }
- for (i=0; i<NCHARS; i++)
- states[n].gotofn[i] = 0;
- state[n] = nxtpos;
- positions[nxtpos++] = count;
- for (i=3; i <= line; i++) {
- if (tmpstat[i] == 1) {
- positions[nxtpos++] = i;
- }
- }
- if (tmpstat[line] == 1)
- states[n].out = 1;
- else
- states[n].out = 0;
-}
-
-addfoll(n) {
- register i;
- if (nxtfoll - cntpos <= nxtpos) {
- overflo(); }
- foll[n] = nxtfoll;
- positions[nxtfoll--] = cntpos;
- for (i=3; i <= line; i++) {
- if (colpos[i] == 1) {
- positions[nxtfoll--] = i;
- }
- }
-}
-
-follow(v) int v; {
- int p;
- if (v == line) return;
- p = parent[v];
- switch(name[p]) {
- case STAR:
- case PLUS: first(v);
- follow(p);
- return;
-
- case OR:
- case QUEST: follow(p);
- return;
-
- case CAT: if (v == left[p]) {
- if (first(right[p]) == 0) {
- follow(p);
- return;
- }
- }
- else follow(p);
- return;
- case FINAL: if (colpos[line] != 1) {
- colpos[line] = 1;
- cntpos++;
- }
- return;
- }
-}
-
-clearg() {
- register i;
- reinit = 0;
- states[1].out = begout;
- for (i=0; i<NCHARS; i++)
- states[1].gotofn[i] = 0;
- nstate = 1;
- state[1] = 0;
- istat = nxtst(states+1,LEFT);
-}
-
-execute(file)
-char *file;
-{
- register char *p;
- register State *cstat, *t;
- int len;
- char *nlp;
- int f;
-
-#define READLINE if((p = nlp = Frdline(f)) == 0)\
- goto done;\
- else /* Frdline nulls the \n, put it back */\
- len = FIOLINELEN(f), nlp[len++] = RIGHT
-
- if (file) {
- if ((f = open(file, 0)) < 0) {
- fprint(2, "%s: can't open %s\n", progname, file);
- badbotch=1;
- return;
- }
- }
- else f = 0;
- Finit(f, (char *)0);
- Ftie(f, 1); /* link input f with stdout */
- lnum = 1;
- tln = 0;
- READLINE;
- cstat = istat;
- if (cstat->out) goto found;
- for (;;) {
- if ((t = cstat->gotofn[*p]) == 0)
- cstat = nxtst(cstat, *p);
- else
- cstat = t;
- if (cstat->out) {
- found:
- if (vflag == 0) {
- succeed: nsucc = 1;
- if (cflag) tln++;
- else if (sflag){
- if(scanexit) exit(0);
- } else if (lflag) {
- Fprint(1, "%s\n", file);
- close(f);
- return;
- }
- else {
- if (nfile > 1 && hflag)
- Fprint(1, "%s:", file);
- if (bflag)
- Fprint(1, "%ld:", (FIOSEEK(f)-len)/BLKSIZE);
- if (nflag)
- Fprint(1, "%ld:", lnum);
- Fwrite(1, nlp, len);
- }
- }
- lnum++;
- READLINE;
- if (reinit == 1) clearg();
- if ((cstat = istat)->out)
- goto found; /* we are a match already */
- else
- continue; /* normal pattern matching loop */
- }
- if (*p++ == RIGHT) {
- if (vflag) goto succeed;
- else {
- lnum++;
- READLINE;
- if (reinit == 1) clearg();
- if ((cstat = istat)->out)
- goto found; /* we are a match already */
- }
- }
- }
-done: close(f);
- if (cflag) {
- if (nfile > 1)
- Fprint(1, "%s:", file);
- Fprint(1, "%ld\n", tln);
- }
-}
//GO.SYSIN DD egrep.c
echo main.c 1>&2
sed 's/.//' >main.c <<'//GO.SYSIN DD main.c'
-#include "hdr.h"
-
-State states[NSTATES];
-State *nxtst();
-int state[NSTATES];
-int line = 1;
-int name[MAXLIN];
-int left[MAXLIN];
-int right[MAXLIN];
-int parent[MAXLIN];
-int foll[MAXLIN];
-int positions[MAXPOS];
-char chars[MAXLIN];
-int nxtpos = 0;
-int inxtpos;
-int nxtchar = 0;
-int tmpstat[MAXLIN];
-int begstat[MAXLIN];
-int colpos[MAXLIN];
-State *istat;
-int nstate = 1;
-int xstate;
-int count;
-int icount;
-char *input;
-char *progname;
-int begout;
-int begcnt;
-int cntpos;
-int nxtfoll;
-
-char reinit = 0;
-
-long lnum;
-int bflag;
-int cflag;
-int fflag;
-int hflag = 1;
-int iflag;
-int lflag;
-int nflag;
-int sflag;
-int vflag;
-int nfile;
-long tln;
-int nsucc;
-int badbotch;
-
-int expfile;
-int bmegrep = 0;
-int scanexit = 0;
-
-extern char *optarg;
-extern int optind, getopt();
-
-usage()
-{
- fprint(2, "usage: %s [ -bchilnsv ] [ -e pattern ] [ -f file ] [ pattern ] [ file ] ...\n", progname);
- exit(2);
-}
-
-main(argc, argv)
-char **argv;
-{
- register c;
- int errflg = 0;
- int (*fn)(), execute(), bmexecute();
- int etext();
- char *ffile;
- char buf[2048];
-
- if(progname = strrchr(argv[0], '/'))
- progname++;
- else
- progname = argv[0];
-
-#ifdef forfutureuse
- switch (progname[0]) {
- case 'f': fgrep++; break;
- case 'e': egrep++; break;
- case 'g': grep++; break;
- }
-#endif
-
- while(( c = getopt(argc, argv, "bchie:f:lnsv?")) != -1)
- switch(c) {
-
- case 'b':
- bflag++;
- continue;
-
- case 'c':
- cflag++;
- continue;
-
- case 'e':
- input = optarg;
- continue;
-
- case 'f':
- fflag++;
- ffile = optarg;
- continue;
-
- case 'h':
- hflag = 0;
- continue;
-
- case 'i':
- iflag++;
- continue;
-
- case 'l':
- lflag++;
- continue;
-
- case 'n':
- nflag++;
- continue;
-
- case 's':
- sflag++;
- continue;
-
- case 'v':
- vflag++;
- continue;
-
- case '?':
- errflg++;
- continue;
- }
-
- if (errflg)
- usage();
-
- argc -= optind;
- argv += optind;
- if (fflag) {
- if ((expfile = open(ffile, 0)) < 0) {
- fprint(2, "%s: can't open %s\n", progname, ffile);
- exit(2);
- }
- } else if (input == 0) {
- if ((input = *argv++) == 0)
- usage();
- argc--;
- }
- Finit(1, (char *)0);
-
-#ifdef MAILPREP
- mailprep();
-#endif /* MAILPREP */
-
- yyparse();
-
-#ifdef MAILPREP
- maildone();
-#endif /* MAILPREP */
-
- if(!vflag && islit(buf)){
- bmprep(buf);
- fn = bmexecute;
- } else
- fn = execute;
-
- cgotofn();
- nfile = argc;
- if (argc<=0) {
- if (lflag) exit(1);
- scanexit = 1;
- (*fn)((char *)0);
- }
- else while (--argc >= 0) {
- if (reinit == 1) clearg();
- scanexit = argc == 0;
- (*fn)(*argv++);
- }
- exit(badbotch ? 2 : nsucc==0);
-}
//GO.SYSIN DD main.c
echo y.tab.c 1>&2
sed 's/.//' >y.tab.c <<'//GO.SYSIN DD y.tab.c'
-# define CHAR 257
-# define DOT 258
-# define CCL 259
-# define NCCL 260
-# define OR 261
-# define CAT 262
-# define STAR 263
-# define PLUS 264
-# define QUEST 265
-
-# line 16 "gram.y"
-#include "hdr.h"
-#define yyclearin yychar = -1
-#define yyerrok yyerrflag = 0
-extern int yychar;
-extern short yyerrflag;
-#ifndef YYMAXDEPTH
-#define YYMAXDEPTH 150
-#endif
-#ifndef YYSTYPE
-#define YYSTYPE int
-#endif
-YYSTYPE yylval, yyval;
-# define YYERRCODE 256
-
-# line 63 "gram.y"
-
-yyerror(s) {
- fprint(2, "egrep: %s\n", s);
- exit(2);
-}
-
-yylex() {
- extern int yylval;
- int cclcnt, x;
- register char c, d;
- switch(c = nextch()) {
- case '^': c = LEFT;
- goto defchar;
- case '$': c = RIGHT;
- goto defchar;
- case '|': return (OR);
- case '*': return (STAR);
- case '+': return (PLUS);
- case '?': return (QUEST);
- case '(': return (c);
- case ')': return (c);
- case '.': return (DOT);
- case '\0': return (0);
- case RIGHT: return (OR);
- case '[':
- x = CCL;
- cclcnt = 0;
- count = nxtchar++;
- if ((c = nextch()) == '^') {
- x = NCCL;
- c = nextch();
- }
- do {
- if (c == '\0') synerror();
- if (c == '-' && cclcnt > 0 && chars[nxtchar-1] != 0) {
- if ((d = nextch()) != 0) {
- c = chars[nxtchar-1];
- while (c < d) {
- if (iflag && isalpha(c)) {
- if (nxtchar >= MAXLIN-1) overflo();
- chars[nxtchar++] = isupper(++c)?tolower(c):toupper(c);
- chars[nxtchar++] = c;
- cclcnt += 2;
- }
- else {
- if (nxtchar >= MAXLIN) overflo();
- chars[nxtchar++] = ++c;
- cclcnt++;
- }
- }
- continue;
- }
- }
- if (iflag&&isalpha(c)) {
- if (nxtchar >= MAXLIN-1) overflo();
- chars[nxtchar++] = isupper(c)?tolower(c):toupper(c);
- chars[nxtchar++] = c;
- cclcnt += 2;
- }
- else {
- if (nxtchar >= MAXLIN) overflo();
- chars[nxtchar++] = c;
- cclcnt++;
- }
- } while ((c = nextch()) != ']');
- chars[count] = cclcnt;
- return (x);
- case '\\':
- if ((c = nextch()) == '\0') synerror();
- else if (c == '\n') c = nextch();
- defchar:
- default: yylval = c; return (CHAR);
- }
-}
-
-static int mailfd = -1;
-
-nextch() {
- register c;
- if (fflag) {
- if ((c = Fgetc(expfile)) < 0)
- c = 0;
- }
- else c = *input++;
-if(mailfd >= 0) Fputc(mailfd, c? c : '\n');
- return(c);
-}
-
-synerror() {
- fprint(2, "egrep: syntax error\n");
- exit(2);
-}
-
-enter(x) int x; {
- if(line >= MAXLIN) overflo();
- name[line] = x;
- left[line] = 0;
- right[line] = 0;
- return(line++);
-}
-
-cclenter(x) int x; {
- register linno;
- linno = enter(x);
- right[linno] = count;
- return (linno);
-}
-
-node(x, l, r) {
- if(line >= MAXLIN) overflo();
- name[line] = x;
- left[line] = l;
- right[line] = r;
- parent[l] = line;
- parent[r] = line;
- return(line++);
-}
-
-unary(x, d) {
- if(line >= MAXLIN) overflo();
- name[line] = x;
- left[line] = d;
- right[line] = 0;
- parent[d] = line;
- return(line++);
-}
-overflo() {
- fprint(2, "egrep: regular expression too long\n");
- exit(2);
-}
-#include <errno.h>
-#define NAME "/tmp/grepdata"
-mailprep()
-{
- umask(0);
- mailfd = open(NAME, 1);
- if((mailfd < 0) && (errno != ECONC))
- mailfd = creat(NAME, 03666);
- if(mailfd >= 0){
- Finit(mailfd, (char *)0);
- Fseek(mailfd, 0L, 2);
- Fprint(mailfd, "\321egrep: ");
- }
-}
-
-maildone()
-{
- if(mailfd >= 0){
- Fflush(mailfd);
- close(mailfd);
- }
-}
-short yyexca[] ={
--1, 1,
- 0, -1,
- -2, 0,
--1, 5,
- 0, 2,
- -2, 0,
--1, 13,
- 0, 5,
- -2, 0,
--1, 14,
- 0, 12,
- 257, 12,
- 258, 12,
- 259, 12,
- 260, 12,
- 261, 12,
- 40, 12,
- 41, 12,
- -2, 0,
--1, 19,
- 0, 4,
- -2, 0,
--1, 20,
- 0, 11,
- 261, 11,
- 41, 11,
- -2, 0,
--1, 23,
- 0, 3,
- -2, 0,
- };
-# define YYNPROD 18
-# define YYLAST 261
-short yyact[]={
-
- 10, 22, 4, 14, 11, 2, 1, 5, 0, 0,
- 10, 15, 16, 17, 18, 0, 19, 20, 3, 0,
- 10, 0, 0, 12, 0, 20, 0, 20, 0, 0,
- 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 11, 6, 7, 8,
- 9, 21, 0, 15, 16, 17, 11, 6, 7, 8,
- 9, 23, 0, 15, 16, 17, 11, 6, 7, 8,
- 9, 13, 0, 15, 16, 17, 11, 6, 7, 8,
- 9, 0, 0, 15, 16, 17, 11, 6, 7, 8,
- 9 };
-short yypact[]={
-
--259,-1000,-1000, 0,-1000, -20,-1000,-1000,-1000,-1000,
- 0,-1000, 0, 0,-252,-1000,-1000,-1000, -40, -30,
- -10, 0,-1000, 0 };
-short yypgo[]={
-
- 0, 6, 5, 18, 3 };
-short yyr1[]={
-
- 0, 1, 2, 2, 2, 2, 3, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4 };
-short yyr2[]={
-
- 0, 1, 2, 4, 3, 3, 0, 1, 1, 1,
- 1, 3, 2, 2, 2, 2, 3, 1 };
-short yychk[]={
-
--1000, -1, -2, -3, 261, -4, 257, 258, 259, 260,
- 40, 256, -3, 261, -4, 263, 264, 265, -4, -4,
- -4, 261, 41, 261 };
-short yydef[]={
-
- 6, -2, 1, 0, 6, -2, 7, 8, 9, 10,
- 0, 17, 0, -2, -2, 13, 14, 15, 0, -2,
- -2, 0, 16, -2 };
-# ifdef YYDEBUG
-# include "y.debug"
-# endif
-
-# define YYFLAG -1000
-# define YYERROR goto yyerrlab
-# define YYACCEPT return(0)
-# define YYABORT return(1)
-
-/* parser for yacc output */
-
-#ifdef YYDEBUG
-int yydebug = 0; /* 1 for debugging */
-#endif
-YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
-int yychar = -1; /* current input token number */
-int yynerrs = 0; /* number of errors */
-short yyerrflag = 0; /* error recovery flag */
-
-yyparse()
-{ short yys[YYMAXDEPTH];
- int yyj, yym;
- register YYSTYPE *yypvt;
- register int yystate, yyn;
- register short *yyps;
- register YYSTYPE *yypv;
- register short *yyxi;
-
- yystate = 0;
- yychar = -1;
- yynerrs = 0;
- yyerrflag = 0;
- yyps= &yys[-1];
- yypv= &yyv[-1];
-
-yystack: /* put a state and value onto the stack */
-#ifdef YYDEBUG
- if(yydebug >= 3)
- if(yychar < 0 || yytoknames[yychar] == 0)
- printf("char %d in %s", yychar, yystates[yystate]);
- else
- printf("%s in %s", yytoknames[yychar], yystates[yystate]);
-#endif
- if( ++yyps >= &yys[YYMAXDEPTH] ) {
- yyerror( "yacc stack overflow" );
- return(1);
- }
- *yyps = yystate;
- ++yypv;
- *yypv = yyval;
-yynewstate:
- yyn = yypact[yystate];
- if(yyn <= YYFLAG) goto yydefault; /* simple state */
- if(yychar<0) {
- yychar = yylex();
-#ifdef YYDEBUG
- if(yydebug >= 2) {
- if(yychar <= 0)
- printf("lex EOF\n");
- else if(yytoknames[yychar])
- printf("lex %s\n", yytoknames[yychar]);
- else
- printf("lex (%c)\n", yychar);
- }
-#endif
- if(yychar < 0)
- yychar = 0;
- }
- if((yyn += yychar) < 0 || yyn >= YYLAST)
- goto yydefault;
- if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
- yychar = -1;
- yyval = yylval;
- yystate = yyn;
- if( yyerrflag > 0 ) --yyerrflag;
- goto yystack;
- }
-yydefault:
- /* default state action */
- if( (yyn=yydef[yystate]) == -2 ) {
- if(yychar < 0) {
- yychar = yylex();
-#ifdef YYDEBUG
- if(yydebug >= 2)
- if(yychar < 0)
- printf("lex EOF\n");
- else
- printf("lex %s\n", yytoknames[yychar]);
-#endif
- if(yychar < 0)
- yychar = 0;
- }
- /* look through exception table */
- for(yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate);
- yyxi += 2 ) ; /* VOID */
- while( *(yyxi+=2) >= 0 ){
- if( *yyxi == yychar ) break;
- }
- if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
- }
- if( yyn == 0 ){ /* error */
- /* error ... attempt to resume parsing */
- switch( yyerrflag ){
- case 0: /* brand new error */
-#ifdef YYDEBUG
- yyerror("syntax error\n%s", yystates[yystate]);
- if(yytoknames[yychar])
- yyerror("saw %s\n", yytoknames[yychar]);
- else if(yychar >= ' ' && yychar < '\177')
- yyerror("saw `%c'\n", yychar);
- else if(yychar == 0)
- yyerror("saw EOF\n");
- else
- yyerror("saw char 0%o\n", yychar);
-#else
- yyerror( "syntax error" );
-#endif
-yyerrlab:
- ++yynerrs;
- case 1:
- case 2: /* incompletely recovered error ... try again */
- yyerrflag = 3;
- /* find a state where "error" is a legal shift action */
- while ( yyps >= yys ) {
- yyn = yypact[*yyps] + YYERRCODE;
- if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
- yystate = yyact[yyn]; /* simulate a shift of "error" */
- goto yystack;
- }
- yyn = yypact[*yyps];
- /* the current yyps has no shift onn "error", pop stack */
-#ifdef YYDEBUG
- if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
-#endif
- --yyps;
- --yypv;
- }
- /* there is no state on the stack with an error shift ... abort */
-yyabort:
- return(1);
- case 3: /* no shift yet; clobber input char */
-#ifdef YYDEBUG
- if( yydebug ) {
- printf("error recovery discards ");
- if(yytoknames[yychar])
- printf("%s\n", yytoknames[yychar]);
- else if(yychar >= ' ' && yychar < '\177')
- printf("`%c'\n", yychar);
- else if(yychar == 0)
- printf("EOF\n");
- else
- printf("char 0%o\n", yychar);
- }
-#endif
- if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
- yychar = -1;
- goto yynewstate; /* try again in the same state */
- }
- }
- /* reduction by production yyn */
-#ifdef YYDEBUG
- if(yydebug) { char *s;
- printf("reduce %d in:\n\t", yyn);
- for(s = yystates[yystate]; *s; s++) {
- putchar(*s);
- if(*s == '\n' && *(s+1))
- putchar('\t');
- }
- }
-#endif
- yyps -= yyr2[yyn];
- yypvt = yypv;
- yypv -= yyr2[yyn];
- yyval = yypv[1];
- yym=yyn;
- /* consult goto table to find next state */
- yyn = yyr1[yyn];
- yyj = yypgo[yyn] + *yyps + 1;
- if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
- switch(yym){
-
-case 1:
-# line 21 "gram.y"
-{ unary(FINAL, yypvt[-0]);
- line--;
- } break;
-case 2:
-# line 26 "gram.y"
-{ yyval = node(CAT, yypvt[-1], yypvt[-0]); } break;
-case 3:
-# line 28 "gram.y"
-{ yyval = node(CAT, yypvt[-2], yypvt[-1]); } break;
-case 4:
-# line 30 "gram.y"
-{ yyval = node(CAT, yypvt[-1], yypvt[-0]); } break;
-case 5:
-# line 32 "gram.y"
-{ yyval = node(CAT, yypvt[-2], yypvt[-1]); } break;
-case 6:
-# line 35 "gram.y"
-{ yyval = enter(DOT);
- yyval = unary(STAR, yyval); } break;
-case 7:
-# line 39 "gram.y"
-{ yyval = iflag?node(OR, enter(tolower(yypvt[-0])), enter(toupper(yypvt[-0]))):enter(yypvt[-0]); } break;
-case 8:
-# line 41 "gram.y"
-{ yyval = enter(DOT); } break;
-case 9:
-# line 43 "gram.y"
-{ yyval = cclenter(CCL); } break;
-case 10:
-# line 45 "gram.y"
-{ yyval = cclenter(NCCL); } break;
-case 11:
-# line 49 "gram.y"
-{ yyval = node(OR, yypvt[-2], yypvt[-0]); } break;
-case 12:
-# line 51 "gram.y"
-{ yyval = node(CAT, yypvt[-1], yypvt[-0]); } break;
-case 13:
-# line 53 "gram.y"
-{ yyval = unary(STAR, yypvt[-1]); } break;
-case 14:
-# line 55 "gram.y"
-{ yyval = unary(PLUS, yypvt[-1]); } break;
-case 15:
-# line 57 "gram.y"
-{ yyval = unary(QUEST, yypvt[-1]); } break;
-case 16:
-# line 59 "gram.y"
-{ yyval = yypvt[-1]; } break;
- }
- goto yystack; /* stack new state and value */
-}
//GO.SYSIN DD y.tab.c
echo gram.y 1>&2
sed 's/.//' >gram.y <<'//GO.SYSIN DD gram.y'
-/*
- * egrep -- print lines containing (or not containing) a regular expression
- *
- * status returns:
- * 0 - ok, and some matches
- * 1 - ok, but no matches
- * 2 - some error; matches irrelevant
- */
-%token CHAR DOT CCL NCCL OR CAT STAR PLUS QUEST
-%left OR
-%left CHAR DOT CCL NCCL '('
-%left CAT
-%left STAR PLUS QUEST
-
-%{
-#include "hdr.h"
-%}
-
-%%
-s: t
- { unary(FINAL, $1);
- line--;
- }
- ;
-t: b r
- { $$ = node(CAT, $1, $2); }
- | OR b r OR
- { $$ = node(CAT, $2, $3); }
- | OR b r
- { $$ = node(CAT, $2, $3); }
- | b r OR
- { $$ = node(CAT, $1, $2); }
- ;
-b:
- { $$ = enter(DOT);
- $$ = unary(STAR, $$); }
- ;
-r: CHAR
- { $$ = iflag?node(OR, enter(tolower($1)), enter(toupper($1))):enter($1); }
- | DOT
- { $$ = enter(DOT); }
- | CCL
- { $$ = cclenter(CCL); }
- | NCCL
- { $$ = cclenter(NCCL); }
- ;
-
-r: r OR r
- { $$ = node(OR, $1, $3); }
- | r r %prec CAT
- { $$ = node(CAT, $1, $2); }
- | r STAR
- { $$ = unary(STAR, $1); }
- | r PLUS
- { $$ = unary(PLUS, $1); }
- | r QUEST
- { $$ = unary(QUEST, $1); }
- | '(' r ')'
- { $$ = $2; }
- | error
- ;
-
-%%
-yyerror(s) {
- fprint(2, "%s: %s\n", progname, s);
- exit(2);
-}
-
-yylex() {
- extern int yylval;
- int cclcnt, x;
- register char c, d;
- switch(c = nextch()) {
- case '^': c = LEFT;
- goto defchar;
- case '$': c = RIGHT;
- goto defchar;
- case '|': return (OR);
- case '*': return (STAR);
- case '+': return (PLUS);
- case '?': return (QUEST);
- case '(': return (c);
- case ')': return (c);
- case '.': return (DOT);
- case '\0': return (0);
- case RIGHT: return (OR);
- case '[':
- x = CCL;
- cclcnt = 0;
- count = nxtchar++;
- if ((c = nextch()) == '^') {
- x = NCCL;
- c = nextch();
- }
- do {
- if (c == '\0') synerror();
- if (c == '-' && cclcnt > 0 && chars[nxtchar-1] != 0) {
- if ((d = nextch()) != 0) {
- c = chars[nxtchar-1];
- while (c < d) {
- if (iflag && isalpha(c)) {
- if (nxtchar >= MAXLIN-1) overflo();
- chars[nxtchar++] = isupper(++c)?tolower(c):toupper(c);
- chars[nxtchar++] = c;
- cclcnt += 2;
- }
- else {
- if (nxtchar >= MAXLIN) overflo();
- chars[nxtchar++] = ++c;
- cclcnt++;
- }
- }
- continue;
- }
- }
- if (iflag&&isalpha(c)) {
- if (nxtchar >= MAXLIN-1) overflo();
- chars[nxtchar++] = isupper(c)?tolower(c):toupper(c);
- chars[nxtchar++] = c;
- cclcnt += 2;
- }
- else {
- if (nxtchar >= MAXLIN) overflo();
- chars[nxtchar++] = c;
- cclcnt++;
- }
- } while ((c = nextch()) != ']');
- chars[count] = cclcnt;
- return (x);
- case '\\':
- if ((c = nextch()) == '\0') synerror();
- else if (c == '\n') c = nextch();
- defchar:
- default: yylval = c; return (CHAR);
- }
-}
-
-#ifdef MAILPREP
-static int mailfd = -1;
-#endif /* MAILPREP */
-
-nextch() {
- register c;
- if (fflag) {
- if ((c = Fgetc(expfile)) < 0)
- c = 0;
- }
- else c = *input++;
-#ifdef MAILPREP
-if(mailfd >= 0) Fputc(mailfd, c? c : '\n');
-#endif /* MAILPREP */
- return(c);
-}
-
-synerror() {
- fprint(2, "%s: syntax error\n", progname);
- exit(2);
-}
-
-enter(x) int x; {
- if(line >= MAXLIN) overflo();
- name[line] = x;
- left[line] = 0;
- right[line] = 0;
- return(line++);
-}
-
-cclenter(x) int x; {
- register linno;
- linno = enter(x);
- right[linno] = count;
- return (linno);
-}
-
-node(x, l, r) {
- if(line >= MAXLIN) overflo();
- name[line] = x;
- left[line] = l;
- right[line] = r;
- parent[l] = line;
- parent[r] = line;
- return(line++);
-}
-
-unary(x, d) {
- if(line >= MAXLIN) overflo();
- name[line] = x;
- left[line] = d;
- right[line] = 0;
- parent[d] = line;
- return(line++);
-}
-overflo() {
- fprint(2, "%s: regular expression too long\n", progname);
- exit(2);
-}
-
-#ifdef MAILPREP
-#include <errno.h>
-#define NAME "/tmp/grepdata"
-mailprep()
-{
- umask(0);
- mailfd = open(NAME, 1);
- if((mailfd < 0) && (errno != ECONC))
- mailfd = creat(NAME, 03666);
- if(mailfd >= 0){
- Finit(mailfd, (char *)0);
- Fseek(mailfd, 0L, 2);
- Fprint(mailfd, "\321egrep: ");
- }
-}
-
-maildone()
-{
- if(mailfd >= 0){
- Fflush(mailfd);
- close(mailfd);
- }
-}
-#endif /* MAILPREP */
//GO.SYSIN DD gram.y