|
|
1.1 root 1: # To unbundle, sh this file
2: echo mkfile 1>&2
3: sed 's/.//' >mkfile <<'//GO.SYSIN DD mkfile'
4: -CFLAGS=-O
5: -YFLAGS=-d
6: -NPROC=2
7: -
8: -egrep: gram.o main.o egrep.o bm.o anal.o
9: - $CC $CFLAGS -o $target $prereq
10: -
11: -install: egrep
12: - cp egrep /usr/bin/egrep
13: - strip /usr/bin/egrep
14: - chmod 775 /usr/bin/egrep
15: - chown bin,bin /usr/bin/egrep
16: -
17: -clean:V:
18: - rm -f *.o egrep
19: -
20: -y.tab.h: gram.o
21: -egrep.o anal.o: y.tab.h
22: -anal.o bm.o egrep.o main.o gram.o: hdr.h
23: -
24: -pp:
25: - smallpr mkfile hdr.h anal.c bm.c egrep.c gram.y main.c
26: -
27: -egrep.bundle:V:
28: - bundle mkfile *.h *.c *.y > $target
29: //GO.SYSIN DD mkfile
30: echo hdr.h 1>&2
31: sed 's/.//' >hdr.h <<'//GO.SYSIN DD hdr.h'
32: -#include <fio.h>
33: -#include <ctype.h>
34: -#include <libc.h>
35: -
36: -#define BLKSIZE 1024 /* size of reported disk blocks */
37: -#define MAXLIN 10000
38: -#define MAXPOS 20000
39: -#define NCHARS 256
40: -#define NSTATES 128
41: -#define FINAL -1
42: -#define LEFT '\177' /* serves as ^ */
43: -#define RIGHT '\n' /* serves as record separator and as $ */
44: -
45: -typedef struct State
46: -{
47: - struct State *gotofn[NCHARS];
48: - int out;
49: -} State;
50: -extern State states[];
51: -State *nxtst();
52: -extern int state[];
53: -extern int line;
54: -extern int name[];
55: -extern int left[];
56: -extern int right[];
57: -extern int parent[];
58: -extern int foll[];
59: -extern int positions[];
60: -extern char chars[];
61: -extern int nxtpos;
62: -extern int nxtfoll;
63: -extern int inxtpos;
64: -extern int nxtfoll;
65: -extern int nxtchar;
66: -extern int tmpstat[];
67: -extern State *istat;
68: -extern int nstate;
69: -extern int xstate;
70: -extern int count;
71: -extern char *input;
72: -extern char *progname;
73: -
74: -extern char reinit;
75: -
76: -extern int begout;
77: -extern int begcnt;
78: -extern int begstat[];
79: -
80: -extern int colpos[];
81: -extern int cntpos;
82: -
83: -extern long lnum;
84: -extern int bflag;
85: -extern int cflag;
86: -extern int fflag;
87: -extern int hflag;
88: -extern int iflag;
89: -extern int lflag;
90: -extern int nflag;
91: -extern int sflag;
92: -extern int vflag;
93: -extern int nfile;
94: -extern long tln;
95: -extern int nsucc;
96: -extern int badbotch;
97: -
98: -extern int expfile;
99: -
100: -extern int bmegrep;
101: -extern int scanexit;
102: //GO.SYSIN DD hdr.h
103: echo y.tab.h 1>&2
104: sed 's/.//' >y.tab.h <<'//GO.SYSIN DD y.tab.h'
105: -# define CHAR 257
106: -# define DOT 258
107: -# define CCL 259
108: -# define NCCL 260
109: -# define OR 261
110: -# define CAT 262
111: -# define STAR 263
112: -# define PLUS 264
113: -# define QUEST 265
114: //GO.SYSIN DD y.tab.h
115: echo anal.c 1>&2
116: sed 's/.//' >anal.c <<'//GO.SYSIN DD anal.c'
117: -#include "hdr.h"
118: -#include "y.tab.h"
119: -
120: -#define NLIT 256
121: -#define LSTART litp = litb
122: -#define LEND {*litp = 0; if(strlen(litb) > strlen(blit))strcpy(blit,litb);}
123: -
124: -static char *litp, litb[NLIT], *blit;
125: -
126: -
127: -/*
128: - islit has to return 1 if we are to use boyer-moore.
129: - in this case, set buf to the literal string and
130: - set bmegrep to 1 if there is a regular expression
131: - beside the literal (literal can be anywhere).
132: -*/
133: -islit(buf)
134: - char *buf;
135: -{
136: - bmegrep = 0;
137: - blit = buf;
138: - *blit = 0;
139: - LSTART;
140: -
141: -/* pr(line-2, ""); */
142: -
143: - lit(line-2);
144: - LEND;
145: - if(strlen(blit) > 1){
146: - /* bmegrep set by lit */
147: - return(1);
148: - }
149: - return(0);
150: -}
151: -
152: -/*
153: - lit builds literal strings in litb. we ensure these are compulsory
154: - literal string by only descending the right nodes.
155: -*/
156: -lit(n)
157: -{
158: - if(name[n] == CAT){
159: - lit(left[n]);
160: - lit(right[n]);
161: - } else if(name[n] == PLUS){
162: - lit(left[n]);
163: - LEND; /* can't go on past a + */
164: - LSTART;
165: - bmegrep = 1;
166: - lit(left[n]); /* but we can start with one! */
167: - } else if((name[n] == CCL) && (chars[right[n]] == 1)){
168: - *litp++ = chars[right[n]+1];
169: - if(litp == &litb[NLIT])
170: - litp--;
171: - } else if(left[n] == 0 && name[n] < 256
172: - && name[n] != LEFT && name[n] != RIGHT){
173: - *litp++ = name[n];
174: - if(litp == &litb[NLIT])
175: - litp--;
176: - } else {
177: - LEND;
178: - LSTART;
179: - bmegrep = 1;
180: - }
181: -}
182: -
183: -/*#ifdef DEBUG*/
184: -
185: -pr(n, s)
186: - char *s;
187: -{
188: - char buf[256];
189: - int i, cnt;
190: -
191: - print("%s", s);
192: - sprint(buf, "%s ", s);
193: - switch(name[n])
194: - {
195: - case FINAL: print("expr=\n"); pr(left[n], buf); break;
196: - case DOT: print("%d: .\n",n); break;
197: - case STAR: print("%d: *\n",n); pr(left[n], buf); break;
198: - case PLUS: print("%d: +\n",n); pr(left[n], buf); break;
199: - case QUEST: print("%d: ?\n",n); pr(left[n], buf); break;
200: - case CAT: print("%d: cat\n", n); pr(left[n], buf); pr(right[n], buf); break;
201: - case OR: print("%d: or\n", n); pr(left[n], buf); pr(right[n], buf); break;
202: - case NCCL:
203: - case CCL: print("%d: [%s", n, name[n]==NCCL? "^":"");
204: - for(i = right[n], cnt = chars[i++]; cnt > 0; cnt--)
205: - print("%c", chars[i++]);
206: - print("]\n");
207: - break;
208: - default:
209: - if(name[n] < 256)
210: - print("%d: '%c'\n", n, name[n]);
211: - else
212: - print("URK %d\n", name[n]);
213: - break;
214: - }
215: -}
216: -/*#endif*/
217: //GO.SYSIN DD anal.c
218: echo bm.c 1>&2
219: sed 's/.//' >bm.c <<'//GO.SYSIN DD bm.c'
220: -#include "hdr.h"
221: -
222: -#define LARGE 100000
223: -
224: -static int delta0[256];
225: -static char cmap[256];
226: -static char *bmpat;
227: -
228: -bmprep(pattern)
229: - char *pattern;
230: -{
231: - register int j, patlen;
232: -
233: - patlen = strlen(bmpat = pattern);
234: - for(j = 0; j < 256; j++){
235: - delta0[j] = patlen;
236: - cmap[j] = j;
237: - }
238: - for(j = 0; j < patlen-1; j++)
239: - delta0[pattern[j]] = patlen-j-1;
240: - delta0[pattern[patlen-1]] = LARGE;
241: - if(iflag){
242: - for(j = 0; j < patlen-1; j++)
243: - if(islower(pattern[j]))
244: - delta0[toupper(pattern[j])] = patlen-j-1;
245: - if(islower(pattern[patlen-1]))
246: - delta0[toupper(pattern[patlen-1])] = LARGE;
247: - for(j = 'A'; j <= 'Z'; j++)
248: - cmap[j] = tolower(j);
249: - }
250: -}
251: -
252: -bmexecute(file)
253: -char *file;
254: -{
255: - register char *p;
256: - register char *endpt;
257: - register char *s;
258: - register int j;
259: - int len, patlen = strlen(bmpat);
260: - char *rdpt;
261: - int fd, eof, n;
262: - long seek;
263: - char *nlp, *proc, *np, *op;
264: - char buf[8*8192];
265: -
266: - if(file){
267: - if((fd = open(file, 0)) < 0){
268: - fprint(2, "%s: can't open %s\n", progname, file);
269: - badbotch=1;
270: - return;
271: - }
272: - } else
273: - fd = 0;
274: - lnum = 1;
275: - tln = 0;
276: - rdpt = buf;
277: - seek = 0;
278: - for(eof = 0; eof == 0;){
279: - Fflush(1);
280: - if((n = read(fd, rdpt, &buf[sizeof buf]-rdpt)) <= 0){
281: - if(rdpt == buf)
282: - break; /* eof, nothing left to process */
283: - *rdpt = '\n'; /* terminate */
284: - endpt = rdpt+1;
285: - eof = 1;
286: - } else {
287: - for(p = &rdpt[n]; p >= rdpt;)
288: - if(*--p == '\n')
289: - break;
290: - if(p < rdpt){ /* line bigger than buf!! */
291: - rdpt = &buf[sizeof buf/2]; /* chop in half */
292: - continue; /* reading */
293: - }
294: - endpt = p+1;
295: - }
296: - /*
297: - invariants:
298: - no newline between buf and rdpt[-1]
299: - lnum = nlines before buf
300: - seek = char offset of buf[0]
301: - last char read is rdpt[n-1]
302: - first char after last \n is endpt
303: -
304: - following is exited to three places:
305: - succeed: match
306: - refresh: !match (readjust ptrs and loop)
307: -
308: - */
309: - p = buf+patlen-1;
310: - proc = buf-1;
311: - scan:
312: - for(;;){
313: - while((p += delta0[*(unsigned char *)p]) < endpt)
314: - ;
315: - if(p < (buf+LARGE)){ /* no match */
316: - goto refresh;
317: - }
318: - p -= LARGE;
319: - for(j = patlen-2, s = p-1; j >= 0; j--)
320: - if(cmap[*s--] != bmpat[j])
321: - break;
322: - if(j < 0) /* match!! */
323: - goto succeed;
324: - fail:
325: - p++;
326: - }
327: - succeed:
328: - if(bmegrep || !cflag || !sflag){ /* lflag doesn't matter */
329: - nlp = memchr(p, '\n', (endpt+1)-p);
330: - op = p;
331: - p -= patlen-1;
332: - while(*p != '\n')
333: - if(--p < buf) break;
334: - p++;
335: - if(bmegrep)
336: - if(legrep(p) == 0){
337: - p = op;
338: - goto fail;
339: - }
340: - }
341: - nsucc = 1;
342: - if (cflag){
343: - tln++;
344: - p = nlp+1;
345: - goto scan;
346: - } else if(sflag){
347: - if(scanexit) exit(0);
348: - } else if(lflag){
349: - Fprint(1, "%s\n", file);
350: - close(fd);
351: - return;
352: - } else {
353: - if (nfile > 1 && hflag)
354: - Fprint(1, "%s:", file);
355: - if (bflag)
356: - Fprint(1, "%ld:", (seek+(p-buf))/BLKSIZE);
357: - if (nflag){
358: - while(np = memchr(proc+1, '\n', p-proc)){
359: - lnum++;
360: - proc = np;
361: - }
362: - Fprint(1, "%ld:", lnum);
363: - }
364: - Fwrite(1, p, nlp-p+1);
365: - p = nlp+1;
366: - if(p < endpt)
367: - goto scan;
368: - }
369: - refresh:
370: - if(nflag){ /* count newlines that we haven't proc */
371: - while(proc = memchr(proc+1, '\n', endpt-proc))
372: - lnum++;
373: - }
374: - memcpy(buf, endpt, j = &rdpt[n]-endpt);
375: - rdpt = &buf[j];
376: - seek += n;
377: - }
378: -done: close(fd);
379: - if (cflag) {
380: - if (nfile > 1)
381: - Fprint(1, "%s:", file);
382: - Fprint(1, "%ld\n", tln);
383: - }
384: -}
385: -
386: -/*
387: - isn't egrep pretty when it just has to mtach or not?
388: -*/
389: -
390: -legrep(p)
391: - register char *p;
392: -{
393: - register State *cstat, *t;
394: -
395: - if(reinit == 1)
396: - clearg();
397: - cstat = istat;
398: - if(cstat->out)
399: - return(1);
400: - for(;;){
401: - if((t = cstat->gotofn[*(unsigned char *)p]) == 0)
402: - cstat = nxtst(cstat, *(unsigned char *)p);
403: - else
404: - cstat = t;
405: - if(cstat->out){
406: - return(1);
407: - }
408: - if(*p++ == RIGHT){
409: - return(0);
410: - }
411: - }
412: -}
413: //GO.SYSIN DD bm.c
414: echo egrep.c 1>&2
415: sed 's/.//' >egrep.c <<'//GO.SYSIN DD egrep.c'
416: -#include "hdr.h"
417: -#include "y.tab.h"
418: -
419: -cgotofn() {
420: - register i;
421: - count = cntpos = 0;
422: - nxtpos = 0;
423: - nxtfoll = MAXPOS-1;
424: - begout = 0;
425: - for (i=1; i<=line; i++) colpos[i] = 0;
426: - if (first(line-1)==0) {
427: - colpos[line] = 1;
428: - cntpos++;
429: - begout = 1;
430: - }
431: - for (i=1; i<=line; i++) tmpstat[i] = begstat[i] = colpos[i];
432: - count = begcnt = cntpos-1; /* leave out position 1 */
433: - tmpstat[1] = begstat[1] = 0;
434: - addstate(1);
435: - inxtpos = nxtpos;
436: - istat = nxtst(states+1,LEFT);
437: -}
438: -
439: -State *
440: -nxtst(ss,c)
441: -State *ss;
442: -char c;
443: -{
444: - register i, num, k;
445: - int pos, curpos, number, newpos;
446: - int s = ss-states;
447: - num = positions[state[s]];
448: - count = begcnt;
449: - for (i=3; i<=line; i++) tmpstat[i] = begstat[i];
450: - pos = state[s] + 1;
451: - for (i=0; i<num; i++) {
452: - curpos = positions[pos];
453: - if ((k = name[curpos]) >= 0) {
454: - if (
455: - (k == c)
456: - | (k == DOT && c != LEFT && c != RIGHT)
457: - | (k == CCL && member(c, right[curpos], 1))
458: - | (k == NCCL && member(c, right[curpos], 0) && c != LEFT && c != RIGHT)
459: - ) {
460: - if (foll[curpos] == 0) {
461: - cntpos = 0;
462: - for (k=1; k<=line; k++) colpos[k] = 0;
463: - follow(curpos);
464: - addfoll(curpos);
465: - }
466: - number = positions[foll[curpos]];
467: - newpos = foll[curpos] - 1;
468: - for (k=0; k<number; k++) {
469: - if (tmpstat[positions[newpos]] != 1) {
470: - tmpstat[positions[newpos]] = 1;
471: - count++;
472: - }
473: - newpos--;
474: - }
475: - }
476: - }
477: - pos++;
478: - }
479: - if (notin(nstate)) {
480: - if (++nstate >= NSTATES) {
481: - nxtpos = inxtpos;
482: - reinit = 1;
483: - nstate = 1;
484: - addstate(1);
485: - return states+1;
486: - }
487: - addstate(nstate);
488: - return(states[s].gotofn[c] = states+nstate);
489: - }
490: - else {
491: - return(states[s].gotofn[c] = states+xstate);
492: - }
493: -}
494: -
495: -first(v) {
496: - register b;
497: - if (left[v] == 0) {
498: - if (colpos[v] != 1) {
499: - colpos[v] = 1;
500: - cntpos++;
501: - }
502: - return(1);
503: - }
504: - else if (right[v] == 0) {
505: - if (first(left[v]) == 0) return (0);
506: - else if (name[v] == PLUS) return (1);
507: - else return (0);
508: - }
509: - else if (name[v] == CAT) {
510: - if (first(left[v]) == 0 && first(right[v]) == 0) return (0);
511: - else return (1);
512: - }
513: - else { /* name[v] == OR */
514: - b = first(right[v]);
515: - if (first(left[v]) == 0 || b == 0) return (0);
516: - else return (1);
517: - }
518: -}
519: -
520: -member(symb, set, torf) {
521: - register i, num, pos;
522: - num = chars[set];
523: - pos = set + 1;
524: - for (i=0; i<num; i++)
525: - if (symb == chars[pos++]) return (torf);
526: - return (!torf);
527: -}
528: -
529: -notin(n) {
530: - register i, j, pos;
531: - for (i=1; i<=n; i++) {
532: - if (positions[state[i]] == count) {
533: - pos = state[i] + 1;
534: - for (j=0; j < count; j++) {
535: - if (tmpstat[positions[pos++]] != 1) goto nxt; }
536: - xstate = i;
537: - return (0);
538: - }
539: - nxt: ;
540: - }
541: - return (1);
542: -}
543: -
544: -addstate(n) {
545: - register i;
546: - if (nxtpos + count >= nxtfoll) {
547: - overflo(); }
548: - for (i=0; i<NCHARS; i++)
549: - states[n].gotofn[i] = 0;
550: - state[n] = nxtpos;
551: - positions[nxtpos++] = count;
552: - for (i=3; i <= line; i++) {
553: - if (tmpstat[i] == 1) {
554: - positions[nxtpos++] = i;
555: - }
556: - }
557: - if (tmpstat[line] == 1)
558: - states[n].out = 1;
559: - else
560: - states[n].out = 0;
561: -}
562: -
563: -addfoll(n) {
564: - register i;
565: - if (nxtfoll - cntpos <= nxtpos) {
566: - overflo(); }
567: - foll[n] = nxtfoll;
568: - positions[nxtfoll--] = cntpos;
569: - for (i=3; i <= line; i++) {
570: - if (colpos[i] == 1) {
571: - positions[nxtfoll--] = i;
572: - }
573: - }
574: -}
575: -
576: -follow(v) int v; {
577: - int p;
578: - if (v == line) return;
579: - p = parent[v];
580: - switch(name[p]) {
581: - case STAR:
582: - case PLUS: first(v);
583: - follow(p);
584: - return;
585: -
586: - case OR:
587: - case QUEST: follow(p);
588: - return;
589: -
590: - case CAT: if (v == left[p]) {
591: - if (first(right[p]) == 0) {
592: - follow(p);
593: - return;
594: - }
595: - }
596: - else follow(p);
597: - return;
598: - case FINAL: if (colpos[line] != 1) {
599: - colpos[line] = 1;
600: - cntpos++;
601: - }
602: - return;
603: - }
604: -}
605: -
606: -clearg() {
607: - register i;
608: - reinit = 0;
609: - states[1].out = begout;
610: - for (i=0; i<NCHARS; i++)
611: - states[1].gotofn[i] = 0;
612: - nstate = 1;
613: - state[1] = 0;
614: - istat = nxtst(states+1,LEFT);
615: -}
616: -
617: -execute(file)
618: -char *file;
619: -{
620: - register char *p;
621: - register State *cstat, *t;
622: - int len;
623: - char *nlp;
624: - int f;
625: -
626: -#define READLINE if((p = nlp = Frdline(f)) == 0)\
627: - goto done;\
628: - else /* Frdline nulls the \n, put it back */\
629: - len = FIOLINELEN(f), nlp[len++] = RIGHT
630: -
631: - if (file) {
632: - if ((f = open(file, 0)) < 0) {
633: - fprint(2, "%s: can't open %s\n", progname, file);
634: - badbotch=1;
635: - return;
636: - }
637: - }
638: - else f = 0;
639: - Finit(f, (char *)0);
640: - Ftie(f, 1); /* link input f with stdout */
641: - lnum = 1;
642: - tln = 0;
643: - READLINE;
644: - cstat = istat;
645: - if (cstat->out) goto found;
646: - for (;;) {
647: - if ((t = cstat->gotofn[*p]) == 0)
648: - cstat = nxtst(cstat, *p);
649: - else
650: - cstat = t;
651: - if (cstat->out) {
652: - found:
653: - if (vflag == 0) {
654: - succeed: nsucc = 1;
655: - if (cflag) tln++;
656: - else if (sflag){
657: - if(scanexit) exit(0);
658: - } else if (lflag) {
659: - Fprint(1, "%s\n", file);
660: - close(f);
661: - return;
662: - }
663: - else {
664: - if (nfile > 1 && hflag)
665: - Fprint(1, "%s:", file);
666: - if (bflag)
667: - Fprint(1, "%ld:", (FIOSEEK(f)-len)/BLKSIZE);
668: - if (nflag)
669: - Fprint(1, "%ld:", lnum);
670: - Fwrite(1, nlp, len);
671: - }
672: - }
673: - lnum++;
674: - READLINE;
675: - if (reinit == 1) clearg();
676: - if ((cstat = istat)->out)
677: - goto found; /* we are a match already */
678: - else
679: - continue; /* normal pattern matching loop */
680: - }
681: - if (*p++ == RIGHT) {
682: - if (vflag) goto succeed;
683: - else {
684: - lnum++;
685: - READLINE;
686: - if (reinit == 1) clearg();
687: - if ((cstat = istat)->out)
688: - goto found; /* we are a match already */
689: - }
690: - }
691: - }
692: -done: close(f);
693: - if (cflag) {
694: - if (nfile > 1)
695: - Fprint(1, "%s:", file);
696: - Fprint(1, "%ld\n", tln);
697: - }
698: -}
699: //GO.SYSIN DD egrep.c
700: echo main.c 1>&2
701: sed 's/.//' >main.c <<'//GO.SYSIN DD main.c'
702: -#include "hdr.h"
703: -
704: -State states[NSTATES];
705: -State *nxtst();
706: -int state[NSTATES];
707: -int line = 1;
708: -int name[MAXLIN];
709: -int left[MAXLIN];
710: -int right[MAXLIN];
711: -int parent[MAXLIN];
712: -int foll[MAXLIN];
713: -int positions[MAXPOS];
714: -char chars[MAXLIN];
715: -int nxtpos = 0;
716: -int inxtpos;
717: -int nxtchar = 0;
718: -int tmpstat[MAXLIN];
719: -int begstat[MAXLIN];
720: -int colpos[MAXLIN];
721: -State *istat;
722: -int nstate = 1;
723: -int xstate;
724: -int count;
725: -int icount;
726: -char *input;
727: -char *progname;
728: -int begout;
729: -int begcnt;
730: -int cntpos;
731: -int nxtfoll;
732: -
733: -char reinit = 0;
734: -
735: -long lnum;
736: -int bflag;
737: -int cflag;
738: -int fflag;
739: -int hflag = 1;
740: -int iflag;
741: -int lflag;
742: -int nflag;
743: -int sflag;
744: -int vflag;
745: -int nfile;
746: -long tln;
747: -int nsucc;
748: -int badbotch;
749: -
750: -int expfile;
751: -int bmegrep = 0;
752: -int scanexit = 0;
753: -
754: -extern char *optarg;
755: -extern int optind, getopt();
756: -
757: -usage()
758: -{
759: - fprint(2, "usage: %s [ -bchilnsv ] [ -e pattern ] [ -f file ] [ pattern ] [ file ] ...\n", progname);
760: - exit(2);
761: -}
762: -
763: -main(argc, argv)
764: -char **argv;
765: -{
766: - register c;
767: - int errflg = 0;
768: - int (*fn)(), execute(), bmexecute();
769: - int etext();
770: - char *ffile;
771: - char buf[2048];
772: -
773: - if(progname = strrchr(argv[0], '/'))
774: - progname++;
775: - else
776: - progname = argv[0];
777: -
778: -#ifdef forfutureuse
779: - switch (progname[0]) {
780: - case 'f': fgrep++; break;
781: - case 'e': egrep++; break;
782: - case 'g': grep++; break;
783: - }
784: -#endif
785: -
786: - while(( c = getopt(argc, argv, "bchie:f:lnsv?")) != -1)
787: - switch(c) {
788: -
789: - case 'b':
790: - bflag++;
791: - continue;
792: -
793: - case 'c':
794: - cflag++;
795: - continue;
796: -
797: - case 'e':
798: - input = optarg;
799: - continue;
800: -
801: - case 'f':
802: - fflag++;
803: - ffile = optarg;
804: - continue;
805: -
806: - case 'h':
807: - hflag = 0;
808: - continue;
809: -
810: - case 'i':
811: - iflag++;
812: - continue;
813: -
814: - case 'l':
815: - lflag++;
816: - continue;
817: -
818: - case 'n':
819: - nflag++;
820: - continue;
821: -
822: - case 's':
823: - sflag++;
824: - continue;
825: -
826: - case 'v':
827: - vflag++;
828: - continue;
829: -
830: - case '?':
831: - errflg++;
832: - continue;
833: - }
834: -
835: - if (errflg)
836: - usage();
837: -
838: - argc -= optind;
839: - argv += optind;
840: - if (fflag) {
841: - if ((expfile = open(ffile, 0)) < 0) {
842: - fprint(2, "%s: can't open %s\n", progname, ffile);
843: - exit(2);
844: - }
845: - } else if (input == 0) {
846: - if ((input = *argv++) == 0)
847: - usage();
848: - argc--;
849: - }
850: - Finit(1, (char *)0);
851: -
852: -#ifdef MAILPREP
853: - mailprep();
854: -#endif /* MAILPREP */
855: -
856: - yyparse();
857: -
858: -#ifdef MAILPREP
859: - maildone();
860: -#endif /* MAILPREP */
861: -
862: - if(!vflag && islit(buf)){
863: - bmprep(buf);
864: - fn = bmexecute;
865: - } else
866: - fn = execute;
867: -
868: - cgotofn();
869: - nfile = argc;
870: - if (argc<=0) {
871: - if (lflag) exit(1);
872: - scanexit = 1;
873: - (*fn)((char *)0);
874: - }
875: - else while (--argc >= 0) {
876: - if (reinit == 1) clearg();
877: - scanexit = argc == 0;
878: - (*fn)(*argv++);
879: - }
880: - exit(badbotch ? 2 : nsucc==0);
881: -}
882: //GO.SYSIN DD main.c
883: echo y.tab.c 1>&2
884: sed 's/.//' >y.tab.c <<'//GO.SYSIN DD y.tab.c'
885: -# define CHAR 257
886: -# define DOT 258
887: -# define CCL 259
888: -# define NCCL 260
889: -# define OR 261
890: -# define CAT 262
891: -# define STAR 263
892: -# define PLUS 264
893: -# define QUEST 265
894: -
895: -# line 16 "gram.y"
896: -#include "hdr.h"
897: -#define yyclearin yychar = -1
898: -#define yyerrok yyerrflag = 0
899: -extern int yychar;
900: -extern short yyerrflag;
901: -#ifndef YYMAXDEPTH
902: -#define YYMAXDEPTH 150
903: -#endif
904: -#ifndef YYSTYPE
905: -#define YYSTYPE int
906: -#endif
907: -YYSTYPE yylval, yyval;
908: -# define YYERRCODE 256
909: -
910: -# line 63 "gram.y"
911: -
912: -yyerror(s) {
913: - fprint(2, "egrep: %s\n", s);
914: - exit(2);
915: -}
916: -
917: -yylex() {
918: - extern int yylval;
919: - int cclcnt, x;
920: - register char c, d;
921: - switch(c = nextch()) {
922: - case '^': c = LEFT;
923: - goto defchar;
924: - case '$': c = RIGHT;
925: - goto defchar;
926: - case '|': return (OR);
927: - case '*': return (STAR);
928: - case '+': return (PLUS);
929: - case '?': return (QUEST);
930: - case '(': return (c);
931: - case ')': return (c);
932: - case '.': return (DOT);
933: - case '\0': return (0);
934: - case RIGHT: return (OR);
935: - case '[':
936: - x = CCL;
937: - cclcnt = 0;
938: - count = nxtchar++;
939: - if ((c = nextch()) == '^') {
940: - x = NCCL;
941: - c = nextch();
942: - }
943: - do {
944: - if (c == '\0') synerror();
945: - if (c == '-' && cclcnt > 0 && chars[nxtchar-1] != 0) {
946: - if ((d = nextch()) != 0) {
947: - c = chars[nxtchar-1];
948: - while (c < d) {
949: - if (iflag && isalpha(c)) {
950: - if (nxtchar >= MAXLIN-1) overflo();
951: - chars[nxtchar++] = isupper(++c)?tolower(c):toupper(c);
952: - chars[nxtchar++] = c;
953: - cclcnt += 2;
954: - }
955: - else {
956: - if (nxtchar >= MAXLIN) overflo();
957: - chars[nxtchar++] = ++c;
958: - cclcnt++;
959: - }
960: - }
961: - continue;
962: - }
963: - }
964: - if (iflag&&isalpha(c)) {
965: - if (nxtchar >= MAXLIN-1) overflo();
966: - chars[nxtchar++] = isupper(c)?tolower(c):toupper(c);
967: - chars[nxtchar++] = c;
968: - cclcnt += 2;
969: - }
970: - else {
971: - if (nxtchar >= MAXLIN) overflo();
972: - chars[nxtchar++] = c;
973: - cclcnt++;
974: - }
975: - } while ((c = nextch()) != ']');
976: - chars[count] = cclcnt;
977: - return (x);
978: - case '\\':
979: - if ((c = nextch()) == '\0') synerror();
980: - else if (c == '\n') c = nextch();
981: - defchar:
982: - default: yylval = c; return (CHAR);
983: - }
984: -}
985: -
986: -static int mailfd = -1;
987: -
988: -nextch() {
989: - register c;
990: - if (fflag) {
991: - if ((c = Fgetc(expfile)) < 0)
992: - c = 0;
993: - }
994: - else c = *input++;
995: -if(mailfd >= 0) Fputc(mailfd, c? c : '\n');
996: - return(c);
997: -}
998: -
999: -synerror() {
1000: - fprint(2, "egrep: syntax error\n");
1001: - exit(2);
1002: -}
1003: -
1004: -enter(x) int x; {
1005: - if(line >= MAXLIN) overflo();
1006: - name[line] = x;
1007: - left[line] = 0;
1008: - right[line] = 0;
1009: - return(line++);
1010: -}
1011: -
1012: -cclenter(x) int x; {
1013: - register linno;
1014: - linno = enter(x);
1015: - right[linno] = count;
1016: - return (linno);
1017: -}
1018: -
1019: -node(x, l, r) {
1020: - if(line >= MAXLIN) overflo();
1021: - name[line] = x;
1022: - left[line] = l;
1023: - right[line] = r;
1024: - parent[l] = line;
1025: - parent[r] = line;
1026: - return(line++);
1027: -}
1028: -
1029: -unary(x, d) {
1030: - if(line >= MAXLIN) overflo();
1031: - name[line] = x;
1032: - left[line] = d;
1033: - right[line] = 0;
1034: - parent[d] = line;
1035: - return(line++);
1036: -}
1037: -overflo() {
1038: - fprint(2, "egrep: regular expression too long\n");
1039: - exit(2);
1040: -}
1041: -#include <errno.h>
1042: -#define NAME "/tmp/grepdata"
1043: -mailprep()
1044: -{
1045: - umask(0);
1046: - mailfd = open(NAME, 1);
1047: - if((mailfd < 0) && (errno != ECONC))
1048: - mailfd = creat(NAME, 03666);
1049: - if(mailfd >= 0){
1050: - Finit(mailfd, (char *)0);
1051: - Fseek(mailfd, 0L, 2);
1052: - Fprint(mailfd, "\321egrep: ");
1053: - }
1054: -}
1055: -
1056: -maildone()
1057: -{
1058: - if(mailfd >= 0){
1059: - Fflush(mailfd);
1060: - close(mailfd);
1061: - }
1062: -}
1063: -short yyexca[] ={
1064: --1, 1,
1065: - 0, -1,
1066: - -2, 0,
1067: --1, 5,
1068: - 0, 2,
1069: - -2, 0,
1070: --1, 13,
1071: - 0, 5,
1072: - -2, 0,
1073: --1, 14,
1074: - 0, 12,
1075: - 257, 12,
1076: - 258, 12,
1077: - 259, 12,
1078: - 260, 12,
1079: - 261, 12,
1080: - 40, 12,
1081: - 41, 12,
1082: - -2, 0,
1083: --1, 19,
1084: - 0, 4,
1085: - -2, 0,
1086: --1, 20,
1087: - 0, 11,
1088: - 261, 11,
1089: - 41, 11,
1090: - -2, 0,
1091: --1, 23,
1092: - 0, 3,
1093: - -2, 0,
1094: - };
1095: -# define YYNPROD 18
1096: -# define YYLAST 261
1097: -short yyact[]={
1098: -
1099: - 10, 22, 4, 14, 11, 2, 1, 5, 0, 0,
1100: - 10, 15, 16, 17, 18, 0, 19, 20, 3, 0,
1101: - 10, 0, 0, 12, 0, 20, 0, 20, 0, 0,
1102: - 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1103: - 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1104: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1105: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1106: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1107: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1108: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1109: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1110: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1111: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1112: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1113: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1114: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1115: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1116: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1117: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1118: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1119: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1120: - 0, 0, 0, 0, 0, 0, 11, 6, 7, 8,
1121: - 9, 21, 0, 15, 16, 17, 11, 6, 7, 8,
1122: - 9, 23, 0, 15, 16, 17, 11, 6, 7, 8,
1123: - 9, 13, 0, 15, 16, 17, 11, 6, 7, 8,
1124: - 9, 0, 0, 15, 16, 17, 11, 6, 7, 8,
1125: - 9 };
1126: -short yypact[]={
1127: -
1128: --259,-1000,-1000, 0,-1000, -20,-1000,-1000,-1000,-1000,
1129: - 0,-1000, 0, 0,-252,-1000,-1000,-1000, -40, -30,
1130: - -10, 0,-1000, 0 };
1131: -short yypgo[]={
1132: -
1133: - 0, 6, 5, 18, 3 };
1134: -short yyr1[]={
1135: -
1136: - 0, 1, 2, 2, 2, 2, 3, 4, 4, 4,
1137: - 4, 4, 4, 4, 4, 4, 4, 4 };
1138: -short yyr2[]={
1139: -
1140: - 0, 1, 2, 4, 3, 3, 0, 1, 1, 1,
1141: - 1, 3, 2, 2, 2, 2, 3, 1 };
1142: -short yychk[]={
1143: -
1144: --1000, -1, -2, -3, 261, -4, 257, 258, 259, 260,
1145: - 40, 256, -3, 261, -4, 263, 264, 265, -4, -4,
1146: - -4, 261, 41, 261 };
1147: -short yydef[]={
1148: -
1149: - 6, -2, 1, 0, 6, -2, 7, 8, 9, 10,
1150: - 0, 17, 0, -2, -2, 13, 14, 15, 0, -2,
1151: - -2, 0, 16, -2 };
1152: -# ifdef YYDEBUG
1153: -# include "y.debug"
1154: -# endif
1155: -
1156: -# define YYFLAG -1000
1157: -# define YYERROR goto yyerrlab
1158: -# define YYACCEPT return(0)
1159: -# define YYABORT return(1)
1160: -
1161: -/* parser for yacc output */
1162: -
1163: -#ifdef YYDEBUG
1164: -int yydebug = 0; /* 1 for debugging */
1165: -#endif
1166: -YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
1167: -int yychar = -1; /* current input token number */
1168: -int yynerrs = 0; /* number of errors */
1169: -short yyerrflag = 0; /* error recovery flag */
1170: -
1171: -yyparse()
1172: -{ short yys[YYMAXDEPTH];
1173: - int yyj, yym;
1174: - register YYSTYPE *yypvt;
1175: - register int yystate, yyn;
1176: - register short *yyps;
1177: - register YYSTYPE *yypv;
1178: - register short *yyxi;
1179: -
1180: - yystate = 0;
1181: - yychar = -1;
1182: - yynerrs = 0;
1183: - yyerrflag = 0;
1184: - yyps= &yys[-1];
1185: - yypv= &yyv[-1];
1186: -
1187: -yystack: /* put a state and value onto the stack */
1188: -#ifdef YYDEBUG
1189: - if(yydebug >= 3)
1190: - if(yychar < 0 || yytoknames[yychar] == 0)
1191: - printf("char %d in %s", yychar, yystates[yystate]);
1192: - else
1193: - printf("%s in %s", yytoknames[yychar], yystates[yystate]);
1194: -#endif
1195: - if( ++yyps >= &yys[YYMAXDEPTH] ) {
1196: - yyerror( "yacc stack overflow" );
1197: - return(1);
1198: - }
1199: - *yyps = yystate;
1200: - ++yypv;
1201: - *yypv = yyval;
1202: -yynewstate:
1203: - yyn = yypact[yystate];
1204: - if(yyn <= YYFLAG) goto yydefault; /* simple state */
1205: - if(yychar<0) {
1206: - yychar = yylex();
1207: -#ifdef YYDEBUG
1208: - if(yydebug >= 2) {
1209: - if(yychar <= 0)
1210: - printf("lex EOF\n");
1211: - else if(yytoknames[yychar])
1212: - printf("lex %s\n", yytoknames[yychar]);
1213: - else
1214: - printf("lex (%c)\n", yychar);
1215: - }
1216: -#endif
1217: - if(yychar < 0)
1218: - yychar = 0;
1219: - }
1220: - if((yyn += yychar) < 0 || yyn >= YYLAST)
1221: - goto yydefault;
1222: - if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
1223: - yychar = -1;
1224: - yyval = yylval;
1225: - yystate = yyn;
1226: - if( yyerrflag > 0 ) --yyerrflag;
1227: - goto yystack;
1228: - }
1229: -yydefault:
1230: - /* default state action */
1231: - if( (yyn=yydef[yystate]) == -2 ) {
1232: - if(yychar < 0) {
1233: - yychar = yylex();
1234: -#ifdef YYDEBUG
1235: - if(yydebug >= 2)
1236: - if(yychar < 0)
1237: - printf("lex EOF\n");
1238: - else
1239: - printf("lex %s\n", yytoknames[yychar]);
1240: -#endif
1241: - if(yychar < 0)
1242: - yychar = 0;
1243: - }
1244: - /* look through exception table */
1245: - for(yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate);
1246: - yyxi += 2 ) ; /* VOID */
1247: - while( *(yyxi+=2) >= 0 ){
1248: - if( *yyxi == yychar ) break;
1249: - }
1250: - if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
1251: - }
1252: - if( yyn == 0 ){ /* error */
1253: - /* error ... attempt to resume parsing */
1254: - switch( yyerrflag ){
1255: - case 0: /* brand new error */
1256: -#ifdef YYDEBUG
1257: - yyerror("syntax error\n%s", yystates[yystate]);
1258: - if(yytoknames[yychar])
1259: - yyerror("saw %s\n", yytoknames[yychar]);
1260: - else if(yychar >= ' ' && yychar < '\177')
1261: - yyerror("saw `%c'\n", yychar);
1262: - else if(yychar == 0)
1263: - yyerror("saw EOF\n");
1264: - else
1265: - yyerror("saw char 0%o\n", yychar);
1266: -#else
1267: - yyerror( "syntax error" );
1268: -#endif
1269: -yyerrlab:
1270: - ++yynerrs;
1271: - case 1:
1272: - case 2: /* incompletely recovered error ... try again */
1273: - yyerrflag = 3;
1274: - /* find a state where "error" is a legal shift action */
1275: - while ( yyps >= yys ) {
1276: - yyn = yypact[*yyps] + YYERRCODE;
1277: - if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
1278: - yystate = yyact[yyn]; /* simulate a shift of "error" */
1279: - goto yystack;
1280: - }
1281: - yyn = yypact[*yyps];
1282: - /* the current yyps has no shift onn "error", pop stack */
1283: -#ifdef YYDEBUG
1284: - if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
1285: -#endif
1286: - --yyps;
1287: - --yypv;
1288: - }
1289: - /* there is no state on the stack with an error shift ... abort */
1290: -yyabort:
1291: - return(1);
1292: - case 3: /* no shift yet; clobber input char */
1293: -#ifdef YYDEBUG
1294: - if( yydebug ) {
1295: - printf("error recovery discards ");
1296: - if(yytoknames[yychar])
1297: - printf("%s\n", yytoknames[yychar]);
1298: - else if(yychar >= ' ' && yychar < '\177')
1299: - printf("`%c'\n", yychar);
1300: - else if(yychar == 0)
1301: - printf("EOF\n");
1302: - else
1303: - printf("char 0%o\n", yychar);
1304: - }
1305: -#endif
1306: - if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
1307: - yychar = -1;
1308: - goto yynewstate; /* try again in the same state */
1309: - }
1310: - }
1311: - /* reduction by production yyn */
1312: -#ifdef YYDEBUG
1313: - if(yydebug) { char *s;
1314: - printf("reduce %d in:\n\t", yyn);
1315: - for(s = yystates[yystate]; *s; s++) {
1316: - putchar(*s);
1317: - if(*s == '\n' && *(s+1))
1318: - putchar('\t');
1319: - }
1320: - }
1321: -#endif
1322: - yyps -= yyr2[yyn];
1323: - yypvt = yypv;
1324: - yypv -= yyr2[yyn];
1325: - yyval = yypv[1];
1326: - yym=yyn;
1327: - /* consult goto table to find next state */
1328: - yyn = yyr1[yyn];
1329: - yyj = yypgo[yyn] + *yyps + 1;
1330: - if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
1331: - switch(yym){
1332: -
1333: -case 1:
1334: -# line 21 "gram.y"
1335: -{ unary(FINAL, yypvt[-0]);
1336: - line--;
1337: - } break;
1338: -case 2:
1339: -# line 26 "gram.y"
1340: -{ yyval = node(CAT, yypvt[-1], yypvt[-0]); } break;
1341: -case 3:
1342: -# line 28 "gram.y"
1343: -{ yyval = node(CAT, yypvt[-2], yypvt[-1]); } break;
1344: -case 4:
1345: -# line 30 "gram.y"
1346: -{ yyval = node(CAT, yypvt[-1], yypvt[-0]); } break;
1347: -case 5:
1348: -# line 32 "gram.y"
1349: -{ yyval = node(CAT, yypvt[-2], yypvt[-1]); } break;
1350: -case 6:
1351: -# line 35 "gram.y"
1352: -{ yyval = enter(DOT);
1353: - yyval = unary(STAR, yyval); } break;
1354: -case 7:
1355: -# line 39 "gram.y"
1356: -{ yyval = iflag?node(OR, enter(tolower(yypvt[-0])), enter(toupper(yypvt[-0]))):enter(yypvt[-0]); } break;
1357: -case 8:
1358: -# line 41 "gram.y"
1359: -{ yyval = enter(DOT); } break;
1360: -case 9:
1361: -# line 43 "gram.y"
1362: -{ yyval = cclenter(CCL); } break;
1363: -case 10:
1364: -# line 45 "gram.y"
1365: -{ yyval = cclenter(NCCL); } break;
1366: -case 11:
1367: -# line 49 "gram.y"
1368: -{ yyval = node(OR, yypvt[-2], yypvt[-0]); } break;
1369: -case 12:
1370: -# line 51 "gram.y"
1371: -{ yyval = node(CAT, yypvt[-1], yypvt[-0]); } break;
1372: -case 13:
1373: -# line 53 "gram.y"
1374: -{ yyval = unary(STAR, yypvt[-1]); } break;
1375: -case 14:
1376: -# line 55 "gram.y"
1377: -{ yyval = unary(PLUS, yypvt[-1]); } break;
1378: -case 15:
1379: -# line 57 "gram.y"
1380: -{ yyval = unary(QUEST, yypvt[-1]); } break;
1381: -case 16:
1382: -# line 59 "gram.y"
1383: -{ yyval = yypvt[-1]; } break;
1384: - }
1385: - goto yystack; /* stack new state and value */
1386: -}
1387: //GO.SYSIN DD y.tab.c
1388: echo gram.y 1>&2
1389: sed 's/.//' >gram.y <<'//GO.SYSIN DD gram.y'
1390: -/*
1391: - * egrep -- print lines containing (or not containing) a regular expression
1392: - *
1393: - * status returns:
1394: - * 0 - ok, and some matches
1395: - * 1 - ok, but no matches
1396: - * 2 - some error; matches irrelevant
1397: - */
1398: -%token CHAR DOT CCL NCCL OR CAT STAR PLUS QUEST
1399: -%left OR
1400: -%left CHAR DOT CCL NCCL '('
1401: -%left CAT
1402: -%left STAR PLUS QUEST
1403: -
1404: -%{
1405: -#include "hdr.h"
1406: -%}
1407: -
1408: -%%
1409: -s: t
1410: - { unary(FINAL, $1);
1411: - line--;
1412: - }
1413: - ;
1414: -t: b r
1415: - { $$ = node(CAT, $1, $2); }
1416: - | OR b r OR
1417: - { $$ = node(CAT, $2, $3); }
1418: - | OR b r
1419: - { $$ = node(CAT, $2, $3); }
1420: - | b r OR
1421: - { $$ = node(CAT, $1, $2); }
1422: - ;
1423: -b:
1424: - { $$ = enter(DOT);
1425: - $$ = unary(STAR, $$); }
1426: - ;
1427: -r: CHAR
1428: - { $$ = iflag?node(OR, enter(tolower($1)), enter(toupper($1))):enter($1); }
1429: - | DOT
1430: - { $$ = enter(DOT); }
1431: - | CCL
1432: - { $$ = cclenter(CCL); }
1433: - | NCCL
1434: - { $$ = cclenter(NCCL); }
1435: - ;
1436: -
1437: -r: r OR r
1438: - { $$ = node(OR, $1, $3); }
1439: - | r r %prec CAT
1440: - { $$ = node(CAT, $1, $2); }
1441: - | r STAR
1442: - { $$ = unary(STAR, $1); }
1443: - | r PLUS
1444: - { $$ = unary(PLUS, $1); }
1445: - | r QUEST
1446: - { $$ = unary(QUEST, $1); }
1447: - | '(' r ')'
1448: - { $$ = $2; }
1449: - | error
1450: - ;
1451: -
1452: -%%
1453: -yyerror(s) {
1454: - fprint(2, "%s: %s\n", progname, s);
1455: - exit(2);
1456: -}
1457: -
1458: -yylex() {
1459: - extern int yylval;
1460: - int cclcnt, x;
1461: - register char c, d;
1462: - switch(c = nextch()) {
1463: - case '^': c = LEFT;
1464: - goto defchar;
1465: - case '$': c = RIGHT;
1466: - goto defchar;
1467: - case '|': return (OR);
1468: - case '*': return (STAR);
1469: - case '+': return (PLUS);
1470: - case '?': return (QUEST);
1471: - case '(': return (c);
1472: - case ')': return (c);
1473: - case '.': return (DOT);
1474: - case '\0': return (0);
1475: - case RIGHT: return (OR);
1476: - case '[':
1477: - x = CCL;
1478: - cclcnt = 0;
1479: - count = nxtchar++;
1480: - if ((c = nextch()) == '^') {
1481: - x = NCCL;
1482: - c = nextch();
1483: - }
1484: - do {
1485: - if (c == '\0') synerror();
1486: - if (c == '-' && cclcnt > 0 && chars[nxtchar-1] != 0) {
1487: - if ((d = nextch()) != 0) {
1488: - c = chars[nxtchar-1];
1489: - while (c < d) {
1490: - if (iflag && isalpha(c)) {
1491: - if (nxtchar >= MAXLIN-1) overflo();
1492: - chars[nxtchar++] = isupper(++c)?tolower(c):toupper(c);
1493: - chars[nxtchar++] = c;
1494: - cclcnt += 2;
1495: - }
1496: - else {
1497: - if (nxtchar >= MAXLIN) overflo();
1498: - chars[nxtchar++] = ++c;
1499: - cclcnt++;
1500: - }
1501: - }
1502: - continue;
1503: - }
1504: - }
1505: - if (iflag&&isalpha(c)) {
1506: - if (nxtchar >= MAXLIN-1) overflo();
1507: - chars[nxtchar++] = isupper(c)?tolower(c):toupper(c);
1508: - chars[nxtchar++] = c;
1509: - cclcnt += 2;
1510: - }
1511: - else {
1512: - if (nxtchar >= MAXLIN) overflo();
1513: - chars[nxtchar++] = c;
1514: - cclcnt++;
1515: - }
1516: - } while ((c = nextch()) != ']');
1517: - chars[count] = cclcnt;
1518: - return (x);
1519: - case '\\':
1520: - if ((c = nextch()) == '\0') synerror();
1521: - else if (c == '\n') c = nextch();
1522: - defchar:
1523: - default: yylval = c; return (CHAR);
1524: - }
1525: -}
1526: -
1527: -#ifdef MAILPREP
1528: -static int mailfd = -1;
1529: -#endif /* MAILPREP */
1530: -
1531: -nextch() {
1532: - register c;
1533: - if (fflag) {
1534: - if ((c = Fgetc(expfile)) < 0)
1535: - c = 0;
1536: - }
1537: - else c = *input++;
1538: -#ifdef MAILPREP
1539: -if(mailfd >= 0) Fputc(mailfd, c? c : '\n');
1540: -#endif /* MAILPREP */
1541: - return(c);
1542: -}
1543: -
1544: -synerror() {
1545: - fprint(2, "%s: syntax error\n", progname);
1546: - exit(2);
1547: -}
1548: -
1549: -enter(x) int x; {
1550: - if(line >= MAXLIN) overflo();
1551: - name[line] = x;
1552: - left[line] = 0;
1553: - right[line] = 0;
1554: - return(line++);
1555: -}
1556: -
1557: -cclenter(x) int x; {
1558: - register linno;
1559: - linno = enter(x);
1560: - right[linno] = count;
1561: - return (linno);
1562: -}
1563: -
1564: -node(x, l, r) {
1565: - if(line >= MAXLIN) overflo();
1566: - name[line] = x;
1567: - left[line] = l;
1568: - right[line] = r;
1569: - parent[l] = line;
1570: - parent[r] = line;
1571: - return(line++);
1572: -}
1573: -
1574: -unary(x, d) {
1575: - if(line >= MAXLIN) overflo();
1576: - name[line] = x;
1577: - left[line] = d;
1578: - right[line] = 0;
1579: - parent[d] = line;
1580: - return(line++);
1581: -}
1582: -overflo() {
1583: - fprint(2, "%s: regular expression too long\n", progname);
1584: - exit(2);
1585: -}
1586: -
1587: -#ifdef MAILPREP
1588: -#include <errno.h>
1589: -#define NAME "/tmp/grepdata"
1590: -mailprep()
1591: -{
1592: - umask(0);
1593: - mailfd = open(NAME, 1);
1594: - if((mailfd < 0) && (errno != ECONC))
1595: - mailfd = creat(NAME, 03666);
1596: - if(mailfd >= 0){
1597: - Finit(mailfd, (char *)0);
1598: - Fseek(mailfd, 0L, 2);
1599: - Fprint(mailfd, "\321egrep: ");
1600: - }
1601: -}
1602: -
1603: -maildone()
1604: -{
1605: - if(mailfd >= 0){
1606: - Fflush(mailfd);
1607: - close(mailfd);
1608: - }
1609: -}
1610: -#endif /* MAILPREP */
1611: //GO.SYSIN DD gram.y
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.