|
|
1.1 root 1: mkdir regress.d
2: # To unbundle, sh this file
3: echo main.c 1>&2
4: sed 's/.//' >main.c <<'//GO.SYSIN DD main.c'
5: -#define MAIN 1
6: -#include <ctype.h>
7: -#include "re.h"
8: -#include "lre.h"
9: -#include "hdr.h"
10: -
11: -/* handle void* which didn't exist prior to ANSI C and C++ */
12: -#if defined(__STDC__) || defined(c_plusplus) || defined(__cplusplus)
13: -# define VOID void
14: -#else
15: -# define VOID char
16: -#endif
17: -
18: -static enum { gre, grep, egrep, fgrep } whoami = gre;
19: -static char fullopts[] = "e:f:1bcEFGhilLnsvx";
20: -static char *opts = fullopts+4; /* start in after last : */
21: -
22: -static void
23: -usage(void)
24: -{
25: - EPR "usage: %s [ -%s ] [ -e pattern ] [ -f file ] [ pattern ] [ file ] ...\n", progname, opts);
26: - exit(2);
27: -}
28: -
29: -#ifdef PROFILING
30: -short profb[50000];
31: -#endif
32: -
33: -main(int argc, char **argv)
34: -{
35: - register c;
36: - int errflg = 0;
37: - char *input = 0, *finput = 0;
38: - int k, sval;
39: - unsigned char map[256];
40: - int foundsome = 0;
41: - PROCFN procfn;
42: - RDFN rdfn;
43: - MATCHFN matchfn;
44: - VOID *pat;
45: -
46: -#ifdef PROFILING
47: - { extern etext(); monitor((int (*)())2, etext, profb, ((int)etext) - 2+12+2400, 300); }
48: -#endif
49: -
50: -/*re_debug=20;/**/
51: - /*
52: - determine if we are to be restricted to compatability mode
53: - */
54: - if(progname = strrchr(argv[0], '/'))
55: - progname++;
56: - else
57: - progname = argv[0];
58: -#ifdef PLAN9
59: - if(strcmp(progname, "ogrep") == 0)
60: -#else
61: - if(strcmp(progname, "grep") == 0)
62: -#endif
63: - whoami = grep;
64: - else if(strcmp(progname, "egrep") == 0)
65: - whoami = egrep;
66: - else if(strcmp(progname, "fgrep") == 0)
67: - whoami = fgrep;
68: - offsetunit = (whoami == gre)? 1 : 1024; /* test before -[FGE] */
69: - /*
70: - read the options; decide legality after we know what we are doing.
71: - the options are split so we can maintain the usage line
72: - in one place. note the only option we have to be wary of
73: - is -f (not grep)
74: - */
75: - while((c = getopt(argc, argv, fullopts)) != -1)
76: - switch(c)
77: - {
78: - case '1': oneflag = 1; break;
79: - case 'b': bflag = 1; break;
80: - case 'c': cflag = 1; break;
81: - case 'e': if(input){
82: - EPR "%s: only one -e arg allowed\n", progname);
83: - errflg = 1;
84: - }
85: - input = optarg; break;
86: - case 'E': whoami = egrep; break;
87: - case 'f': if(input){
88: - EPR "%s: only one -f arg allowed\n", progname);
89: - errflg = 1;
90: - }
91: - finput = optarg; break;
92: - case 'F': whoami = fgrep; break;
93: - case 'G': whoami = grep; break;
94: - case 'h': hflag = 1; break;
95: - case 'i': iflag = 1; break;
96: - case 'l': lflag = 1; break;
97: - case 'L': Lflag = 1; break;
98: - case 'n': nflag = 1; break;
99: - case 's': sflag = 1; break;
100: - case 'v': vflag = 1; break;
101: - case 'x': xflag = 1; break;
102: - case '?': errflg = 1; break;
103: - }
104: - if(errflg)
105: - usage();
106: - argv += optind;
107: - /*
108: - check for bad flag combinations
109: - */
110: - if(finput && (whoami == grep)){
111: - EPR "%s: cannot use -f with grep\n", progname);
112: - exit(2);
113: - }
114: - if(finput && input){
115: - EPR "%s: cannot use -f with -e\n", progname);
116: - exit(2);
117: - }
118: - if(!input && !finput){
119: - input = *argv++;
120: - if(input == 0)
121: - usage();
122: - }
123: - /*
124: - character mapping ?
125: - */
126: - for(k = 0; k < 256; k++)
127: - map[k] = k;
128: - if(iflag)
129: - for(k = 'A'; k <= 'Z'; k++)
130: - map[k] = tolower(k);
131: - /*
132: - in the interests of readability, fob off grep-type specific
133: - handling to separate functions. setting bmfn means using
134: - bmfind; similiarly cwfn means use cwfind
135: -
136: - rules:
137: - lnum needs be maintained only if nflag.
138: - nbytes needs be maintained only if bflag.
139: - for -[s1lL], do a longjmp(env).
140: - for -c, increment nmatch.
141: - */
142: - switch(whoami)
143: - {
144: - case gre: dogre(greparse, input, finput, map, &procfn, &pat, &rdfn, &matchfn); break;
145: - case grep: dogre(grepparse, input, finput, map, &procfn, &pat, &rdfn, &matchfn); break;
146: - case fgrep: dofgrep(input, finput, map, &procfn, &pat, &rdfn, &matchfn); break;
147: - case egrep: dogre(egrepparse, input, finput, map, &procfn, &pat, &rdfn, &matchfn); break;
148: - }
149: - /*
150: - do generic flag handling
151: - */
152: - prname = !hflag && *argv && argv[1];
153: - /*
154: - do file arguments now! for uniformity, no args = '-'
155: - */
156: - if(!*argv)
157: - *--argv = "-";
158: - for(; curfile = *argv++; close(ifd)){
159: - if(strcmp(curfile, "-") == 0)
160: - ifd = 0;
161: - else if((ifd = open(curfile, 0)) < 0){
162: - EPR "%s: ", progname);
163: - perror(curfile);
164: - errflg = 2;
165: - continue;
166: - }
167: - if(sflag && foundsome)
168: - continue; /* don't need to scan */
169: - lnum = nmatch = nbytes = 0;
170: - longlinewarned = 0;
171: - if((sval = setjmp(env)) == 0)
172: - if((*procfn)(pat, rdfn, matchfn) < 0){
173: - EPR "%s: ", progname);
174: - perror(curfile);
175: - errflg = 2;
176: - continue;
177: - }
178: - if((lflag && sval) || (Lflag && !sval))
179: - PR "%s\n", curfile);
180: - if(cflag){
181: - if(prname)
182: - PR "%s:", curfile);
183: - PR "%ld\n", nmatch);
184: - }
185: - if(nmatch)
186: - foundsome = 1;
187: - }
188: - exit(errflg? errflg : (foundsome == 0));
189: - /*NOTREACHED*/
190: -}
191: -
192: -void
193: -re_error(char *s)
194: -{
195: - EPR "%s: %s\n", progname, s);
196: - exit(2);
197: -}
198: //GO.SYSIN DD main.c
199: echo dofgrep.c 1>&2
200: sed 's/.//' >dofgrep.c <<'//GO.SYSIN DD dofgrep.c'
201: -#include <ctype.h>
202: -#include "re.h"
203: -#include "lre.h"
204: -#include "hdr.h"
205: -
206: -static int addwords(char*, re_cw*, unsigned char**, unsigned char**);
207: -
208: -void
209: -dofgrep(char *input, char *finput, unsigned char *map, PROCFN *pprocfn, void **pat, RDFN *prdfn, MATCHFN *pmatchfn)
210: -{
211: - unsigned char *lb, *le;
212: - int nwords, k;
213: - re_cw *cw;
214: -
215: - *pat = (void *)(cw = re_cwinit(map));
216: - if(finput){
217: - nwords = addwords(finput, cw, &lb, &le);
218: - } else {
219: - register unsigned char *s, *e;
220: -
221: - nwords = 0;
222: - s = (unsigned char *)input;
223: - while(*s){
224: - char ch;
225: -
226: - for(e = s; *e && (*e != '\n'); e++)
227: - ;
228: - ch = *e;
229: - if(xflag){
230: - s[-1] = '\n';
231: - *e = '\n';
232: - re_cwadd(cw, (lb = s)-1, (le = e)+1);
233: - *e = ch;
234: - } else
235: - re_cwadd(cw, lb = s, le = e);
236: - s = *e? (e+1):e;
237: - nwords++;
238: - }
239: - if(nwords == 1){
240: - s = (unsigned char *)malloc(1 + (k = le-lb));
241: - if (!s){
242: - re_error("malloc failure");
243: - cw->seenerror = 1;
244: - return;
245: - }
246: - memmove((char *)s, (char *)lb, k);
247: - lb = s;
248: - le = s+k;
249: - if(xflag)
250: - *le++ = '\n';
251: - }
252: - }
253: - if(nwords == 1){
254: - *pat = (void *)re_bmcomp((char *)lb, (char *)le, map);
255: - *pprocfn = re_bmexec;
256: - *prdfn = greprd;
257: - *pmatchfn = xflag ? bmxmatch : grepmatch;
258: - } else {
259: - re_cwcomp(cw);
260: - *pprocfn = re_cwexec;
261: - *prdfn = xflag? cwxrd : greprd;
262: - *pmatchfn = xflag ? cwxmatch : grepmatch;
263: - }
264: - if(sflag || lflag || Lflag || oneflag){
265: - if(vflag == 0)
266: - succfn = oneshot, failfn = count_m;
267: - else
268: - succfn = count, failfn = oneshot;
269: - } else if(cflag){
270: - if(vflag == 0)
271: - succfn = inc, failfn = null;
272: - else
273: - succfn = null, failfn = inc_m;
274: - } else if(vflag){
275: - if(bflag||nflag)
276: - succfn = count;
277: - else
278: - succfn = null;
279: - failfn = pr_m;
280: - } else {
281: - succfn = pr;
282: - if(bflag||nflag)
283: - failfn = count_m;
284: - else
285: - failfn = null;
286: - }
287: -}
288: -
289: -static
290: -addwords(char *file, re_cw *pat, unsigned char **b, unsigned char **e)
291: -{
292: - unsigned char rbuf[MAXLINE+2];
293: - unsigned char *buf = rbuf+1;
294: - int fd;
295: - int nwords = 0, eof, k;
296: - register unsigned char *nl, *nn, *end;
297: -
298: - if((fd = open(file, 0)) < 0){
299: - perror(file);
300: - exit(2);
301: - }
302: - rbuf[0] = '\n';
303: - nl = end = buf+1;
304: - eof = 0;
305: - for(;;){
306: - if((nn = (unsigned char *)memchr((char *)nl, '\n', end-nl)) == 0){
307: - if(nl == buf){
308: - EPR "line too long in %s\n", file);
309: - exit(2);
310: - }
311: - memmove((char *)buf, (char *)nl, end-nl);
312: - end -= nl-buf;
313: - nl = buf;
314: - k = read(fd, (char *)end, &buf[MAXLINE]-end);
315: - if(k > 0){
316: - end += k;
317: - continue;
318: - } else if(k == 0){
319: - if(nl == end) /* clean read to end of file */
320: - break;
321: - eof = 1;
322: - *end++ = '\n';
323: - continue;
324: - } else {
325: - perror(file);
326: - exit(2);
327: - }
328: - }
329: - if(xflag)
330: - re_cwadd(pat, nl-1, nn+1);
331: - else
332: - re_cwadd(pat, nl, nn);
333: - nl = nn+1;
334: - nwords++;
335: - if(eof)
336: - break;
337: - }
338: - close(fd);
339: - if(nwords == 1){
340: - k = strlen((char *)buf)-1;
341: - *b = (unsigned char *)malloc(k+1);
342: - if (!*b){
343: - re_error("malloc failed");
344: - pat->seenerror = 1;
345: - return 0;
346: - }
347: - memmove((char *)*b, (char *)buf, k);
348: - if(xflag)
349: - (*b)[k++] = '\n';
350: - *e = *b + k;
351: - }
352: - return(nwords);
353: -}
354: //GO.SYSIN DD dofgrep.c
355: echo dogre.c 1>&2
356: sed 's/.//' >dogre.c <<'//GO.SYSIN DD dogre.c'
357: -#include <ctype.h>
358: -#include "re.h"
359: -#include "lre.h"
360: -#include "hdr.h"
361: -
362: -static void gresucc(char*, char*); /* does reg exp match after bm */
363: -static int reader(void*, RDFN, MATCHFN);/* plain analog of bmfind, cwfind */
364: -static void readin(char*, char*, unsigned char**, unsigned char**);
365: -
366: -void
367: -dogre(Parsetype parser, char *input, char *finput, unsigned char *map, PROCFN *pprocfn, void **pat, RDFN *prdfn, MATCHFN *pmatchfn)
368: -{
369: - unsigned char *lb, *le;
370: -
371: - readin(input, finput, &lb, &le);
372: - *pat = 0;
373: - globre = egprep(parser, lb, le, map, 1);
374: - *prdfn = greprd;
375: - *pmatchfn = grepmatch;
376: - if(sflag || lflag || Lflag || oneflag){
377: - if(vflag == 0)
378: - succ2fn = oneshot, failfn = count_m;
379: - else
380: - succ2fn = count, failfn = oneshot;
381: - } else if(cflag){
382: - if(vflag == 0)
383: - succ2fn = inc, failfn = null;
384: - else
385: - succ2fn = null, failfn = inc_m;
386: - } else if(vflag){
387: - if(bflag||nflag)
388: - succ2fn = count;
389: - else
390: - succ2fn = null;
391: - failfn = pr_m;
392: - } else {
393: - succ2fn = pr;
394: - if(bflag||nflag)
395: - failfn = count_m;
396: - else
397: - failfn = null;
398: - }
399: - if(re_lit(globre, &lb, &le)){
400: - *pat = (void *)re_bmcomp((char *)lb, (char *)le, map);
401: - *pprocfn = re_bmexec;
402: - succfn = gresucc;
403: - } else {
404: - if(*pat = (void *)re_recw(globre, map))
405: - *pprocfn = re_cwexec;
406: - else
407: - *pprocfn = reader;
408: - succfn = succ2fn;
409: - }
410: -}
411: -
412: -static
413: -reader(void *UNUSED, RDFN rdfn, MATCHFN matchfn)
414: -{
415: - unsigned char *b, *e;
416: - unsigned char *nl;
417: - int k;
418: -#pragma ref UNUSED
419: -
420: - b = 0;
421: - while((k = (*rdfn)((char**)&b, (char**)&e)) > 0){
422: - while(nl = (unsigned char *)memchr((char *)b, '\n', e-b)){
423: - if(eg_match(globre, b, nl, (unsigned char **)0, (unsigned char **)0)){
424: - e = nl;
425: - if((k = (*matchfn)((char**)&b, (char**)&e)) <= 0)
426: - return(k);
427: - } else
428: - b = nl+1;
429: - }
430: - }
431: - return(k);
432: -}
433: -
434: -static void
435: -readin(char *in, char *fin, unsigned char **beg, unsigned char **end)
436: -{
437: - int size, n, fd, left;
438: - char *base, *p;
439: -
440: - if(in){
441: - if(xflag){
442: - size = 4+strlen(in)+1;
443: - *beg = (unsigned char *)malloc(size);
444: - if (!*beg){
445: - EPR "%s: can't malloc %d bytes for -x\n", progname, size);
446: - exit(2);
447: - }
448: - p = (char *)*beg;
449: - *p++ = '^';
450: - *p++ = '(';
451: - memmove(p, in, n = strlen(in));
452: - p += n;
453: - *p++ = ')';
454: - *p++ = '$';
455: - *end = (unsigned char *)p;
456: - } else {
457: - *beg = (unsigned char *)in;
458: - *end = *beg + strlen(in);
459: - }
460: - return;
461: - }
462: - /* we know fin is nonzero */
463: - if((fd = open(fin, 0)) < 0){
464: - perror(fin);
465: - exit(2);
466: - }
467: - /*
468: - i object to calling stat; the following crap is not painful
469: - and at worst involves copying twice the number of bytes.
470: - */
471: - size = 128;
472: - if((base = malloc(size)) == 0){
473: - EPR "%s: can't malloc %d bytes for -f %s\n", progname, size, fin);
474: - exit(2);
475: - }
476: - left = size;
477: - p = base;
478: - if(xflag){
479: - *p++ = '^';
480: - left--;
481: - }
482: - for(; (n = read(fd, p, left)) > 0;){
483: - p += n;
484: - left -= n;
485: - if(left == 0){
486: - size *= 2;
487: - if((base = realloc(base, size+2)) == 0){
488: - EPR "%s: can't malloc %d bytes for -f %s\n", progname, size, fin);
489: - exit(2);
490: - }
491: - p = base+size/2;
492: - left = size/2;
493: - }
494: - }
495: - if(n < 0){
496: - perror(fin);
497: - exit(2);
498: - }
499: - close(fd);
500: - if(xflag){
501: - *p++ = '$';
502: - }
503: - *beg = (unsigned char *)base;
504: - *end = (unsigned char *)p;
505: -}
506: -
507: -static void
508: -gresucc(char *b, char *e)
509: -{
510: - if(eg_match(globre, (unsigned char*)b, (unsigned char*)(e-1), (unsigned char **)0, (unsigned char **)0))
511: - (*succ2fn)(b, e);
512: - else
513: - (*failfn)(b, e);
514: -}
515: //GO.SYSIN DD dogre.c
516: echo fns.c 1>&2
517: sed 's/.//' >fns.c <<'//GO.SYSIN DD fns.c'
518: -#include "re.h"
519: -#include "lre.h"
520: -#include "hdr.h"
521: -
522: -void
523: -pr(char *b, char *e)
524: -{
525: - nmatch++;
526: - if(prname)
527: - PR "%s:", curfile);
528: - if(bflag){
529: - PR "%ld:", nbytes/offsetunit);
530: - nbytes += (e-b) + noverflow;
531: - noverflow = 0;
532: - }
533: - if(nflag)
534: - PR "%ld:", ++lnum);
535: - WR(b, e-b);
536: -}
537: -
538: -void
539: -pr_m(char *b, char *e)
540: -{
541: - register char *nl;
542: -
543: - while(nl = (char*)memchr(b, '\n', e-b)){
544: - nmatch++;
545: - nl++;
546: - if(prname)
547: - PR "%s:", curfile);
548: - if(bflag){
549: - PR "%ld:", nbytes/offsetunit);
550: - nbytes += (nl-b) + noverflow;
551: - noverflow = 0;
552: - }
553: - if(nflag)
554: - PR "%ld:", ++lnum);
555: - WR(b, nl-b);
556: - if((b = nl) >= e)
557: - break;
558: - }
559: -}
560: -
561: -/* ARGSUSED */
562: -void
563: -inc(char *UNUSED, char *UNUSED2)
564: -{
565: -#pragma ref UNUSED
566: -#pragma ref UNUSED2
567: - nmatch++;
568: -}
569: -
570: -void
571: -inc_m(register char *b, register char *e)
572: -{
573: - register char *nl;
574: -
575: - while(nl = (char*)memchr(b, '\n', e-b)){
576: - nmatch++;
577: - if((b = nl+1) >= e)
578: - break;
579: - }
580: -}
581: -
582: -void
583: -null(char *UNUSED, char *UNUSED2)
584: -#pragma ref UNUSED
585: -#pragma ref UNUSED2
586: -{
587: -}
588: -
589: -void
590: -count(register char *b, register char *e)
591: -{
592: - nbytes += (e-b) + noverflow;
593: - noverflow = 0;
594: - lnum++;
595: -}
596: -
597: -void
598: -count_m(register char *b, register char *e)
599: -{
600: - register char *nl;
601: -
602: - nbytes += (e-b) + noverflow;
603: - noverflow = 0;
604: - while(nl = (char*)memchr(b, '\n', e-b)){
605: - lnum++;
606: - if((b = nl+1) >= e)
607: - break;
608: - }
609: -}
610: -
611: -void
612: -oneshot(char *b, char *e)
613: -{
614: - register char *nl;
615: -
616: - nmatch++;
617: - nl = (char*)memchr(b, '\n', e-b)+1;
618: - if(oneflag)
619: - pr(b, nl);
620: - longjmp(env, 1);
621: -}
622: //GO.SYSIN DD fns.c
623: echo buffer.c 1>&2
624: sed 's/.//' >buffer.c <<'//GO.SYSIN DD buffer.c'
625: -#include "re.h"
626: -#include "lre.h"
627: -#include "hdr.h"
628: -
629: -/*#define DEBUG /**/
630: -
631: -/* the following ifdef aids testing of the buffering code */
632: -#ifndef BUFSIZE
633: -#define BUFSIZE 50000
634: -#endif
635: -
636: -#define OVERFLOW (BUFSIZE/10)
637: -/*
638: - lines less than BUFSIZE are preserved. larger lines have at least
639: - BUFSIZE-OVERFLOW preserved
640: -*/
641: -
642: -static char rbuf[BUFSIZE+1] = "\n";
643: -static char *buf = rbuf+1;
644: -static char *next, *proc;
645: -/* invariants:
646: - valid text in buffer: buf <= text < next
647: - text to be processed: proc <= text < next
648: - buf, proc always point at beginning of lines
649: -*/
650: -
651: -greprd(register char **b, register char **e)
652: -{
653: - int n;
654: - int keepingsome;
655: - register char *p;
656: -
657: - if(*b == 0) /* set up invariants */
658: - *b = *e = next = proc = buf;
659: - keepingsome = *b != *e;
660: -again: /* this is only used for overflowing input lines */
661: -#ifdef DEBUG
662: - fprint(2, "%d <> %d; keep=%d (%d'%.10s'..%d) proc=%d\n", next, &buf[BUFSIZE], keepingsome, *b, *b?*b:"", *e, proc);
663: -#endif
664: - if(next < &buf[BUFSIZE]){
665: - /*
666: - next is fine but *b may not be set
667: - */
668: - if(!keepingsome)
669: - *b = proc;
670: - } else {
671: - /*
672: - find a \n so we can shift the buffer
673: - */
674: - if(keepingsome){
675: - for(p = *b-1; p >= buf; p--)
676: - if(*p == '\n') break;
677: - p++;
678: - /* the best new buffer start is p */
679: - if(p == buf){ /* progressing? */
680: - longline:
681: - if(!longlinewarned){
682: - EPR "%s: %s: warning: ", progname, curfile);
683: - if(bflag)
684: - EPR "%ld: ", nbytes/offsetunit);
685: - if(nflag)
686: - EPR "%ld: ", lnum);
687: - EPR "line too long (> %d chars); text skipped\n", BUFSIZE);
688: - longlinewarned = 1;
689: - }
690: - next -= OVERFLOW;
691: - noverflow += OVERFLOW;
692: - goto again;
693: - }
694: - } else {
695: - /* not keeping any; we only have to look at unprocessed */
696: - for(p = next-1; p >= proc; p--)
697: - if(*p == '\n') break;
698: - p++;
699: - if(p == buf)
700: - goto longline;
701: - *b = p;
702: - }
703: - /* process any we haven't */
704: - if(proc < p){
705: - (*failfn)(proc, p);
706: - proc = p;
707: - }
708: - /* move it! */
709: - n = p-buf;
710: - memcpy(buf, p, next-p);
711: - proc -= n;
712: - next -= n;
713: - *b -= n;
714: - }
715: - /*
716: - *b points to start of returned (saved) text
717: - next points to first available text for reading
718: - */
719: - FLUSH;
720: - if((n = read(ifd, next, &buf[BUFSIZE] - next)) <= 0){
721: - if(proc < next){
722: - (*failfn)(proc, next);
723: - }
724: - proc = next;
725: - return(n);
726: - }
727: - next += n;
728: - *e = next;
729: -#ifdef DEBUG
730: -fprint(2, "greprd returns %d .. %d\n", *b, *e);
731: -#endif
732: - return(1);
733: -}
734: -
735: -grepmatch(register char **b, register char **e)
736: -{
737: - char *s, *f;
738: - int eoffset, n, ret = 1;
739: -#ifdef DEBUG
740: -fprint(2, "match! *b=%d@%d='%.100s' *e=%d@%d\n", **b, *b, *b, **e, *e);/**/
741: -#endif
742: - for(s = *b; s >= proc; s--)
743: - if(*s == '\n')
744: - break;
745: - if(s != *b)
746: - s++;
747: - if(proc < s){
748: - (*failfn)(proc, s);
749: - proc = s;
750: - }
751: - f = *e;
752: - for(;;){
753: - for(; f < next; f++)
754: - if(*f == '\n')
755: - goto done;
756: - eoffset = f-s;
757: - if((n = greprd(&s, &f)) <= 0){
758: - ret = n;
759: - goto done;
760: - }
761: - f = s+eoffset;
762: - }
763: -done:
764: - f++;
765: - if(s > f)
766: - abort();
767: - (*succfn)(s, f);
768: - proc = *b = f;
769: - *e = next;
770: -#ifdef DEBUG
771: -fprint(2, "match at '%.20s'; resuming at '%.20s'@%d\n", s, f, f);/**/
772: -#endif
773: - return(ret);
774: -}
775: -
776: -cwxrd(register char **b, register char **e)
777: -{
778: - int n;
779: -
780: - n = greprd(b, e);
781: - if(n > 0){
782: - (*b)--;
783: -#ifdef DEBUG
784: - fprint(2, "grepxrd returns %d .. %d\n", *b, *e);
785: -#endif
786: - }
787: - return(n);
788: -}
789: -
790: -cwxmatch(register char **b, register char **e)
791: -{
792: - char *s, *f;
793: - int eoffset, n, ret = 1;
794: -
795: -#ifdef DEBUG
796: -fprint(2, "cwxmatch! *b=%d@%d='%.100s' *e=%d@%d\n", **b, *b, *b, **e, *e);/**/
797: -#endif
798: - for(s = *b; s >= proc; s--)
799: - if(*s == '\n')
800: - break;
801: - s++;
802: - if(proc < s){
803: -/*
804: -fprint(2, "cwxfail! *b=%d@%d='%.50s' *e=%d@%d\n", **b, *b, *b, **e, *e);
805: -fprint(2, "s=%d, proc=%d, dbg.b=%d dbg.e=%d dbg.resume=%d\n", s, proc,dbg.b, dbg.e, dbg.resume);
806: -*/
807: - (*failfn)(proc, s);
808: - proc = s;
809: - }
810: - f = *e - 1;
811: - for(;;){
812: - for(; f < next; f++)
813: - if(*f == '\n')
814: - goto done;
815: - eoffset = f-s;
816: - if((n = greprd(&s, &f)) <= 0){
817: - ret = n;
818: - goto done;
819: - }
820: - f = s+eoffset;
821: - }
822: -done:
823: - f++;
824: - if(s > f)
825: - abort();
826: - (*succfn)(s, f);
827: - proc = *b = f;
828: - *e = next;
829: - (*b)--;
830: -#ifdef DEBUG
831: -fprint(2, "cwxmatch at '%.20s'; resuming at '%.20s'@%d\n", s, f, f);/**/
832: -#endif
833: - return(ret);
834: -}
835: -
836: -bmxmatch(register char **b, register char **e)
837: -{
838: - char *s, *f;
839: - int eoffset, n, ret = 1;
840: -
841: -#ifdef DEBUG
842: -fprint(2, "bmxmatch! *b=%d@%d='%.100s' *e=%d@%d\n", **b, *b, *b, **e, *e);/**/
843: -#endif
844: - for(s = *b; s >= proc; s--)
845: - if(*s == '\n')
846: - break;
847: - s++;
848: - if(proc < s){
849: - (*failfn)(proc, s);
850: - proc = s;
851: - }
852: - f = *e - 1;
853: - for(;;){
854: - for(; f < next; f++)
855: - if(*f == '\n')
856: - goto done;
857: - eoffset = f-s;
858: - if((n = greprd(&s, &f)) <= 0){
859: - ret = n;
860: - goto done;
861: - }
862: - f = s+eoffset;
863: - }
864: -done:
865: - f++;
866: - if(s > f)
867: - abort();
868: - (*((*b == s)? succfn:failfn))(s, f);
869: - proc = *b = f;
870: - *e = next;
871: -#ifdef DEBUG
872: -fprint(2, "bmxmatch at '%.20s'; resuming at '%.20s'\n", s, f);/**/
873: -#endif
874: - return(ret);
875: -}
876: //GO.SYSIN DD buffer.c
877: echo cw.c 1>&2
878: sed 's/.//' >cw.c <<'//GO.SYSIN DD cw.c'
879: -#include "re.h"
880: -#include "lre.h"
881: -#include "hdr.h"
882: -
883: -typedef struct Link
884: -{
885: - unsigned char l;
886: - struct Node *node;
887: - struct Link *next;
888: -} Link;
889: -static Link *froot;
890: -
891: -#define NEW(N) (froot?(t = froot, froot = froot->next, t->next = 0, t->node = N, t): newlink(c, 0, N))
892: -#define ADD(N) if(qtail) qtail = qtail->next = NEW(N);\
893: - else qtail = qhead = NEW(N)
894: -#define DEL() { Link *tmp = qhead;if((qhead = qhead->next) == 0)\
895: - qtail = 0; tmp->next = froot; froot = tmp;}
896: -
897: -typedef struct Node
898: -{
899: - short out;
900: - short d;
901: - short shift1;
902: - short shift2;
903: - long id;
904: - struct Node **tab;
905: - Link *alts;
906: - struct Node *fail;
907: -} Node;
908: -
909: -static Link *newlink(re_cw*, int, Node*);
910: -static Node *newnode(re_cw*, int);
911: -static void zeroroot(Node*, Node*);
912: -static void shifttab(Node*);
913: -static void shiftprop(re_cw*,Node*);
914: -#ifdef DEBUG
915: -static void cwpr(register Node *n);
916: -#endif
917: -
918: -re_cw *
919: -re_cwinit(unsigned char *cmap)
920: -{
921: - register i;
922: - register re_cw *c;
923: -
924: - if((c = (re_cw *)egmalloc(sizeof *c, "malloc failed in re_cwinit")) == 0)
925: - return((re_cw *)0);
926: - c->nodeid = 0;
927: - c->maxdepth = 0;
928: - c->mindepth = 10000;
929: - c->seenerror = 0;
930: - c->root = newnode(c, 0);
931: - if(cmap)
932: - memmove((char *)c->map, (char *)cmap, sizeof c->map);
933: - else
934: - for(i = 0; i < sizeof c->map; i++)
935: - c->map[i] = i;
936: - return(c);
937: -}
938: -
939: -void
940: -re_cwadd(register re_cw *c, register unsigned char *s, register unsigned char *e)
941: -{
942: - register Node *p, *state;
943: - register Link *l;
944: - int depth;
945: -
946: - for(state = c->root; s <= --e;){
947: - for(l = state->alts; l; l = l->next)
948: - if(l->l == c->map[*e]) break;
949: - if(l == 0)
950: - break;
951: - else
952: - state = l->node;
953: - }
954: - if(s <= e){
955: - depth = state->d+1;
956: - l = newlink(c, *e--, p = newnode(c, depth++));
957: - if((l == 0) || (p == 0)){
958: - c->seenerror = 1;
959: - return;
960: - }
961: - l->next = state->alts;
962: - state->alts = l;
963: - state = p;
964: - while(s <= e){
965: - state->alts = newlink(c, *e--, p = newnode(c, depth++));
966: - if((state->alts == 0) || (p == 0)){
967: - c->seenerror = 1;
968: - return;
969: - }
970: - state = p;
971: - }
972: - }
973: - if(c->mindepth > state->d)
974: - c->mindepth = state->d;
975: - state->out = 1;
976: -}
977: -
978: -#ifdef DEBUG
979: -static void
980: -cwpr(register Node *n)
981: -{
982: - register Link *l;
983: -
984: - Fprint(1, "%d[%d,%d]: ", n->id, n->shift1, n->shift2);
985: - for(l = n->alts; l; l = l->next){
986: - Fprint(1, "edge from \"%d\" to \"%d\" label {\"%c\"};",
987: - n->id, l->node->id, l->l);
988: - if(l->node->out) Fprint(1, " draw \"%d\" as Doublecircle;", l->node->id);
989: - if(l->node->fail)
990: - Fprint(1, " edge from \"%d\" to \"%d\" dashed;", l->node->id, l->node->fail->id);
991: - Fprint(1, "\n");
992: - cwpr(l->node);
993: - }
994: -}
995: -#endif
996: -
997: -static void
998: -fail(re_cw *c, Node *root)
999: -{
1000: - Link *qhead = 0, *qtail = 0;
1001: - register Link *l, *ll;
1002: - register Link *t;
1003: - register Node *state, *r, *s;
1004: - int a;
1005: -
1006: - for(l = root->alts; l; l = l->next){
1007: - ADD(l->node);
1008: - l->node->fail = root;
1009: - }
1010: - while(qhead){
1011: - r = qhead->node;
1012: - DEL();
1013: - for(l = r->alts; l; l = l->next){
1014: - s = l->node;
1015: - a = l->l;
1016: - ADD(s);
1017: - for(state = r->fail; state;){
1018: - for(ll = state->alts; ll; ll = ll->next)
1019: - if(ll->l == a)
1020: - break;
1021: - if(ll || (state == root)){
1022: - if(ll)
1023: - state = ll->node;
1024: - /*
1025: - do it here as only other exit is
1026: - state 0
1027: - */
1028: - if(state->out){
1029: - s->out = 1;
1030: - }
1031: - break;
1032: - } else
1033: - state = state->fail;
1034: - }
1035: - s->fail = state;
1036: - }
1037: - }
1038: - zeroroot(root, root);
1039: -}
1040: -
1041: -static void
1042: -zeroroot(register Node *root, register Node *n)
1043: -{
1044: - register Link *l;
1045: -
1046: - if(n->fail == root)
1047: - n->fail = 0;
1048: - for(l = n->alts; l; l = l->next)
1049: - zeroroot(root, l->node);
1050: -}
1051: -
1052: -static void
1053: -shift(re_cw *c)
1054: -{
1055: - Link *qhead = 0, *qtail = 0;
1056: - register Link *l;
1057: - register Link *t;
1058: - register Node *state, *r, *s;
1059: - int k;
1060: -
1061: - for(k = 0; k < 256; k++)
1062: - c->step[k] = c->mindepth+1;
1063: - c->root->shift1 = 1;
1064: - c->root->shift2 = c->mindepth;
1065: - for(l = c->root->alts; l; l = l->next){
1066: -/* l->node->shift2 = c->root->shift2;/**/
1067: - ADD(l->node);
1068: - l->node->fail = 0;
1069: - }
1070: - while(qhead){
1071: - r = qhead->node;
1072: - DEL();
1073: - r->shift1 = c->mindepth;
1074: - r->shift2 = c->mindepth;
1075: - if(state = r->fail){
1076: - do {
1077: - k = r->d - state->d;
1078: - if(k < state->shift1){
1079: - state->shift1 = k;
1080: - }
1081: - if(r->out && (k < state->shift2)){
1082: - state->shift2 = k;
1083: - }
1084: - } while(state = state->fail);
1085: - }
1086: - for(l = r->alts; l; l = l->next){
1087: - s = l->node;
1088: - ADD(s);
1089: - }
1090: - }
1091: - shiftprop(c, c->root);
1092: - shifttab(c->root);
1093: - c->step[0] = 1;
1094: -}
1095: -
1096: -static void
1097: -shifttab(register Node *n)
1098: -{
1099: - register Link *l;
1100: - register Node **nn;
1101: -
1102: - n->tab = nn = (Node **)calloc(256, sizeof(Node *));
1103: - for(l = n->alts; l; l = l->next)
1104: - nn[l->l] = l->node;
1105: -}
1106: -
1107: -static void
1108: -shiftprop(register re_cw *c, register Node *n)
1109: -{
1110: - register Link *l;
1111: - register Node *nn;
1112: -
1113: - for(l = n->alts; l; l = l->next){
1114: - if(c->step[l->l] > l->node->d)
1115: - c->step[l->l] = l->node->d;
1116: - nn = l->node;
1117: - if(n->shift2 < nn->shift2)
1118: - nn->shift2 = n->shift2;
1119: - shiftprop(c, nn);
1120: - }
1121: -}
1122: -
1123: -void
1124: -re_cwcomp(re_cw *c)
1125: -{
1126: - if(c->seenerror)
1127: - return;
1128: - fail(c, c->root);
1129: - shift(c);
1130: -#ifdef DEBUG
1131: - cwpr(c->root);
1132: -#endif
1133: -}
1134: -
1135: -re_cwexec(void *re_c, RDFN rdfn, MATCHFN matchfn)
1136: -{
1137: - re_cw *c = (re_cw*)re_c;
1138: - register Node *state;
1139: - register Link *l;
1140: - register unsigned char *sp;
1141: - register unsigned char *e, *s;
1142: - register Node *ostate;
1143: - register k;
1144: - unsigned char *rs, *re;
1145: - unsigned char fake[1];
1146: - unsigned char mappedsp;
1147: -
1148: - if(c->seenerror)
1149: - return(-1);
1150: - fake[0] = 0;
1151: - state = c->root;
1152: - for(rs = 0; (k = (*rdfn)((char**)&rs,(char**) &re)) > 0;){
1153: -doneline:
1154: - s = rs+c->mindepth-1;
1155: - e = re;
1156: - while(s < e){
1157: - /* scan */
1158: - for(sp = s; ostate = state;){
1159: - if(state->tab){
1160: - if((state = state->tab[c->map[*sp]]) == 0)
1161: - goto nomatch;
1162: - } else {
1163: - mappedsp = c->map[*sp];
1164: - for(l = state->alts; ; l = l->next){
1165: - if(l == 0)
1166: - goto nomatch;
1167: - if(l->l == mappedsp){
1168: - state = l->node;
1169: - break;
1170: - }
1171: - }
1172: - }
1173: -#ifdef DEBUG
1174: -print("state %d -0x%x-> state %d (out=%d)\n", ostate->id, *sp&0xFF, state->id, state->out);
1175: -#endif
1176: - if(state->out){
1177: - unsigned char *bm = sp, *em = s+1;
1178: - if((k = (*matchfn)((char**)&bm, (char**)&em)) <= 0)
1179: - return(k);
1180: - rs = bm;
1181: - re = em;
1182: - state = c->root;
1183: - goto doneline;
1184: - }
1185: - if(--sp < rs){
1186: - sp = fake;
1187: - break;
1188: - }
1189: - }
1190: - nomatch:
1191: - k = c->step[c->map[*sp]]-ostate->d-1;
1192: - if(k < ostate->shift1)
1193: - k = ostate->shift1;
1194: - if(k > ostate->shift2)
1195: - k = ostate->shift2;
1196: - s += k;
1197: - state = c->root;
1198: - }
1199: -#ifdef DEBUG
1200: -print("end of s<e loop: s=%d e=%d, rs=%d, re=%d\n", s, e, rs, re);
1201: -#endif
1202: - rs = re; /* we have analysed evrything up to here */
1203: - }
1204: - return(k? -1:0);
1205: -}
1206: -
1207: -static void
1208: -freenode(Node *n)
1209: -{
1210: - register Link *l, *ll;
1211: -
1212: - if(n->tab)
1213: - free((char *)n->tab);
1214: - for(l = n->alts; l; l = ll){
1215: - ll = l->next;
1216: - freenode(l->node);
1217: - }
1218: - free((char *)n);
1219: -}
1220: -
1221: -void
1222: -re_cwfree(re_cw *cw)
1223: -{
1224: - register Link *l;
1225: -
1226: - while(froot){
1227: - l = froot->next;
1228: - free((char *)froot);
1229: - froot = l;
1230: - }
1231: - freenode(cw->root);
1232: - free((char *)cw);
1233: -}
1234: -
1235: -static Node *
1236: -newnode(re_cw *c, int d)
1237: -{
1238: - static Node *next = 0, *lim = 0;
1239: - static incr = 1000;
1240: -
1241: - if(next == lim){
1242: - next = (Node *)malloc(incr*sizeof(Node));
1243: - if(next == 0){
1244: - re_error("node malloc fail");
1245: - return 0;
1246: - }
1247: - lim = next+incr;
1248: - }
1249: - next->d = d;
1250: - if(d > c->maxdepth) c->maxdepth = d;
1251: - next->id = c->nodeid++;
1252: - next->alts = 0;
1253: - next->tab = 0;
1254: - next->out = 0;
1255: - return(next++);
1256: -}
1257: -
1258: -static Link *
1259: -newlink(re_cw *c, int l, Node *n)
1260: -{
1261: - static Link *next = 0, *lim = 0;
1262: - static incr = 1000;
1263: -
1264: - if(next == lim){
1265: - next = (Link *)malloc(incr*sizeof(Node));
1266: - if(next == 0){
1267: - re_error("link malloc fail");
1268: - return 0;
1269: - }
1270: - lim = next+incr;
1271: - }
1272: - next->l = c->map[l];
1273: - next->node = n;
1274: - next->next = 0;
1275: - return(next++);
1276: -}
1277: //GO.SYSIN DD cw.c
1278: echo bm.c 1>&2
1279: sed 's/.//' >bm.c <<'//GO.SYSIN DD bm.c'
1280: -#include "re.h"
1281: -#include "lre.h"
1282: -#include "hdr.h"
1283: -
1284: -/*
1285: - this next one is dirty but i can't think of a good way out now.
1286: - essentially, LARGE has to be a bit bigger than the biggest buffer
1287: - we are ever given by rdfn
1288: -*/
1289: -#define LARGE (100000000+2)
1290: -
1291: -static int bb(re_bm *, unsigned char*, unsigned char*);
1292: -
1293: -re_bm *
1294: -re_bmcomp(char *ppb, char *ppe, unsigned char *map)
1295: -{
1296: - register unsigned char *pb = (unsigned char *)ppb;
1297: - register unsigned char *pe = (unsigned char *)ppe;
1298: - register int j;
1299: - int delta[256];
1300: - register re_bm *b;
1301: -
1302: - b = (re_bm *)malloc(sizeof *b);
1303: - if(b == 0){
1304: - re_error("b malloc fail");
1305: - return 0;
1306: - }
1307: - b->patlen = pe-pb;
1308: - memmove((char *)b->cmap, (char *)map, sizeof b->cmap);
1309: - b->bmpat = malloc(b->patlen);
1310: - if(b->bmpat == 0){
1311: - re_error("bmpat malloc fail");
1312: - free((char*)b);
1313: - return 0;
1314: - }
1315: - if (bb(b, pb, pe) == 0){
1316: - free((char*)b->bmpat);
1317: - free((char*)b);
1318: - return 0;
1319: - }
1320: - for(j = 0; pb+j < pe; j++)
1321: - b->bmpat[j] = b->cmap[pb[j]];
1322: - for(j = 0; j < 256; j++)
1323: - delta[j] = b->patlen;
1324: - for(pe--; pb < pe; pb++)
1325: - delta[b->cmap[*pb]] = pe-pb;
1326: - delta[b->cmap[*pb]] = LARGE;
1327: - for(j = 0; j < 256; j++)
1328: - b->delta0[j] = delta[b->cmap[j]];
1329: - return(b);
1330: -}
1331: -
1332: -static int
1333: -bb(register re_bm *b, register unsigned char *pb, register unsigned char *pe)
1334: -{
1335: - int *f;
1336: - register m = pe-pb;
1337: - register i, k, j;
1338: -
1339: - f = (int *)malloc(sizeof(int)*(m+1));
1340: - if(f == 0){
1341: - re_error("delta2 f malloc");
1342: - return 0;
1343: - }
1344: - pb--;
1345: - b->delta2 = (int *)malloc(sizeof(int)*(b->patlen+1));
1346: - if(b->delta2 == 0){
1347: - re_error("delta2 malloc");
1348: - free((char*)f);
1349: - return 0;
1350: - }
1351: - for(i = 1; i <= m; i++)
1352: - b->delta2[i] = 2*m-i;
1353: - j = m;
1354: - k = m+1;
1355: - while(j > 0){
1356: - f[j] = k;
1357: - while((k <= m) && (pb[j] != pb[k])){
1358: - if(m-j < b->delta2[k])
1359: - b->delta2[k] = m-j;
1360: - k = f[k];
1361: - }
1362: - j--;
1363: - k--;
1364: - }
1365: - for(i = 1; i <= k; i++){
1366: - if(b->delta2[i] > m+k-i)
1367: - b->delta2[i] = m+k-i;
1368: - }
1369: - free((char *)f);
1370: - return 1;
1371: -}
1372: -
1373: -re_bmexec(void *re_b, RDFN rdfn, MATCHFN matchfn)
1374: -{
1375: - register re_bm *b = (re_bm*)re_b;
1376: - register unsigned char *sp;
1377: - register unsigned char *e, *s;
1378: - unsigned char *re, *rs;
1379: - register k;
1380: -
1381: - for(rs = 0; (k = (*rdfn)((char**)&rs, (char**)&re)) > 0; rs = s, re = e){
1382: - e = re;
1383: - s = rs;
1384: - while(s < e){
1385: - while((s += b->delta0[*s]) < e)
1386: - ;
1387: - if(s < e+b->patlen){ /* no match */
1388: - s = e;
1389: - break;
1390: - }
1391: - s -= LARGE;
1392: - for(k = b->patlen-2, sp = s-1; k >= 0; k--)
1393: - if(b->cmap[*sp--] != b->bmpat[k])
1394: - break;
1395: -/*print("k=%d s=%d sp=%d\n", k, s, sp);/**/
1396: - if(k < 0){
1397: - unsigned char *bm = ++sp, *em = s+1;
1398: - if((k = (*matchfn)((char**)&bm, (char**)&em)) <= 0)
1399: - return(k);
1400: - s = bm;
1401: - e = em;
1402: - } else {
1403: - /*j = b->delta2[k+1];
1404: - k = b->delta0[cmap[*++sp]];
1405: - if((j > k) || (k == LARGE))
1406: - k = j;
1407: - s = sp+k;*/s++;
1408: - }
1409: - }
1410: - }
1411: - return(k);
1412: -}
1413: -
1414: -void
1415: -re_bmfree(re_bm *pat)
1416: -{
1417: - free((char *)pat->delta2);
1418: - free(pat->bmpat);
1419: - free((char *)pat);
1420: -}
1421: //GO.SYSIN DD bm.c
1422: echo re.c 1>&2
1423: sed 's/.//' >re.c <<'//GO.SYSIN DD re.c'
1424: -#include "re.h"
1425: -#include "lre.h"
1426: -#include "hdr.h"
1427: -
1428: -re_re *
1429: -re_recomp(char *b, char *e, unsigned char *map)
1430: -{
1431: - return(egprep(greparse, (unsigned char *)b, (unsigned char *)e, map, 1));
1432: -}
1433: -
1434: -re_reexec(re_re *pat, char *b, char *e, char *match[10][2])
1435: -{
1436: - unsigned char *mb[10], *me[10], **rb, **re;
1437: - int n, i;
1438: -
1439: - if(match)
1440: - rb = mb, re = me;
1441: - else
1442: - rb = re = 0;
1443: - n = eg_match(pat, (unsigned char *)b, (unsigned char *)e, rb, re);
1444: - if(match)
1445: - for(i = 0; i < 10; i++){
1446: - match[i][0] = (char *)mb[i];
1447: - match[i][1] = (char *)me[i];
1448: - }
1449: - return(n);
1450: -}
1451: -
1452: -static void
1453: -freeexpr(register Expr *e)
1454: -{
1455: - switch(e->type)
1456: - {
1457: - case Literal:
1458: - case Dot:
1459: - case Carat:
1460: - case Dollar:
1461: - if(e->follow)
1462: - free((char *)e->follow);
1463: - break;
1464: - case Compcharclass:
1465: - case Charclass:
1466: - free((char *)e->r);
1467: - break;
1468: - case Cat:
1469: - case Alternate:
1470: - freeexpr(e->l);
1471: - freeexpr(e->r);
1472: - break;
1473: - case Star:
1474: - case Plus:
1475: - case Quest:
1476: - case Group:
1477: - case EOP:
1478: - freeexpr(e->l);
1479: - break;
1480: - case Backref:
1481: - default:
1482: - break;
1483: - }
1484: -}
1485: -
1486: -void
1487: -re_refree(re_re *re)
1488: -{
1489: - if(re == 0)
1490: - return;
1491: - if(re->posbase)
1492: - free((char *)re->posbase);
1493: - if(re->root)
1494: - freeexpr(re->root);
1495: - if(re->ptr)
1496: - free((char *)re->ptr);
1497: - if(re->states)
1498: - free((char *)re->states);
1499: - /* leave br alone for now; it is hard to get right */
1500: - free((char *)re);
1501: -}
1502: //GO.SYSIN DD re.c
1503: echo eg.c 1>&2
1504: sed 's/.//' >eg.c <<'//GO.SYSIN DD eg.c'
1505: -#include "re.h"
1506: -#include "lre.h"
1507: -#include "hdr.h"
1508: -
1509: -int re_debug = 0;
1510: -
1511: -#define RESET(r, ps) COPY(r, ps, begin)
1512: -#define SET(r, ps, n) {if(r->ps.base[n] == 0) r->ps.count++, r->ps.base[n] = r->ps.last, r->ps.last = n; }
1513: -#define GET(ps, n) for(n = ps.last; n > 0; n = ps.base[n])
1514: -#define COPY(r, to, from) memmove((char *)r->to.base, (char *)r->from.base, r->maxid*sizeof(int)), r->to.count = r->from.count, r->to.last = r->from.last
1515: -
1516: -static State *addstate(re_re *r, Positionset *ps);
1517: -static int first(re_re *, Expr *);
1518: -static int match(re_re *, Expr *, int);
1519: -static State *nextstate(re_re *, State *, int);
1520: -#ifdef DEBUG
1521: -static void ppr(Positionset *, char *);
1522: -#endif
1523: -
1524: -typedef enum { NORMAL, ACCEPT, ACCEPT_EOP, FAIL } Out;
1525: -
1526: -static void
1527: -eptr(register re_re *r, register Expr *e)
1528: -{
1529: - if((e->id < 0) || (e->id >= r->maxid)){
1530: - EPR "eptr abort: r=%ld[maxid=%d] e=%ld[id=%d]\n", r, r->maxid, e, e->id);
1531: - abort();
1532: - }
1533: - r->ptr[e->id] = e;
1534: - if((e->type != Charclass) && (e->type != Compcharclass)){
1535: - if(e->l)
1536: - eptr(r, e->l);
1537: - if(e->r)
1538: - eptr(r, e->r);
1539: - }
1540: -}
1541: -
1542: -re_re *
1543: -egprep(enum Parsetype parser, unsigned char *b, unsigned char *e, unsigned char *map, int dotstar)
1544: -{
1545: - register re_re *r;
1546: - Expr *ecomp;
1547: - int i;
1548: -
1549: - r = (re_re *)egmalloc(sizeof (re_re), "allocating re_re");
1550: - if(r == 0)
1551: - return 0;
1552: - memset((char *)r, 0, sizeof (re_re));
1553: - eg_lexinit((char *)b, (char *)e);
1554: - if(map)
1555: - memmove(r->mymap, (char *)map, 256);
1556: - else
1557: - for(i = 0; i < 256; i++)
1558: - r->mymap[i] = i;
1559: - eg_lex();
1560: - if(dotstar){
1561: - ecomp = eg_newexpr(Star, 0, eg_newexpr(Dot, '.', (Expr *)0, (Expr *)0), (Expr *)0);
1562: - ecomp = eg_newexpr(Cat, 0, ecomp, eg_eall(parser, r->mymap));
1563: - } else
1564: - ecomp = eg_eall(parser, r->mymap);
1565: - r->root = eg_newexpr(EOP, '#', ecomp, (Expr *)0);
1566: - egpost(r);
1567: - r->carat = 0;
1568: - if(r->backref || r->parens)
1569: - egbr(r);
1570: - else
1571: - eginit(r, dotstar);
1572: - return(r);
1573: -}
1574: -
1575: -void
1576: -eginit(register re_re *r, int dotstar)
1577: -{
1578: - int n;
1579: -
1580: -#ifdef DEBUG
1581: - if(TRACE(6))
1582: - PR "eginit(r=%d, dotstar=%d)\n", r, dotstar);
1583: -#endif
1584: -#ifdef DEBUG
1585: - if(TRACE(10)){
1586: - char buf[EPRINTSIZE];
1587: - eg_epr(r->root, buf, 0);
1588: - PR "eginit: r=%d expr='%s'\n", r, buf);
1589: - }
1590: -#endif
1591: - r->ptr = (Expr **)egmalloc(r->maxid*sizeof(Expr *), "ptr");
1592: - if (!r->ptr)
1593: - return;
1594: - eptr(r, r->root);
1595: - r->firstpos.base = (int *)egmalloc(n = r->maxid*sizeof(int), "first base");
1596: - if (!r->firstpos.base){
1597: - free((char*)r->ptr);
1598: - return;
1599: - }
1600: - r->begin.base = (int *)egmalloc(n, "begin base");
1601: - if (!r->begin.base){
1602: - free((char*)r->firstpos.base);
1603: - free((char*)r->ptr);
1604: - return;
1605: - }
1606: - r->tmp.base = (int *)egmalloc(n, "tmp base");
1607: - if (!r->tmp.base){
1608: - free((char*)r->begin.base);
1609: - free((char*)r->firstpos.base);
1610: - free((char*)r->ptr);
1611: - return;
1612: - }
1613: - memset((char *)r->begin.base, 0, n);
1614: - r->begin.count = 0;
1615: - r->begin.last = -1;
1616: - r->carat = dotstar;
1617: - RESET(r, firstpos);
1618: - if(first(r, r->root->l) == 0){
1619: - /*
1620: - nullable, so include me
1621: - */
1622: - SET(r, firstpos, r->root->id)
1623: - }
1624: - if(dotstar)
1625: - COPY(r, begin, firstpos);
1626: - eg_stateinit(r);
1627: - eg_clrstates(r);
1628: - eg_posinit(r);
1629: - (void)addstate(r, &r->firstpos);
1630: - eg_savestate(r, dotstar? nextstate(r, r->states, RE_CARAT):r->states);
1631: - eg_posset(r);
1632: -}
1633: -
1634: -unsigned char *
1635: -eg_quickmatch(register re_re *r, register unsigned char *b, register unsigned char *e, int endpts)
1636: -{
1637: - register State *s, *t;
1638: -
1639: -#ifdef DEBUG
1640: - if(TRACE(10)){
1641: - char buf[EPRINTSIZE];
1642: - eg_epr(r->root, buf, 0);
1643: - PR "qm: r=%d expr='%s' endpts=%d\n", r, buf, endpts);
1644: - }
1645: -#endif
1646: - s = eg_startstate(r);
1647: - if(endpts&RE_BEG){
1648: - if(!r->carat){
1649: - if(t = s->tab[RE_CARAT])
1650: - s = t;
1651: - else
1652: - s = nextstate(r, s, RE_CARAT);
1653: - if(s->out == FAIL)
1654: - s = eg_startstate(r);
1655: - }
1656: - if(s->out){
1657: -#ifdef DEBUG
1658: - if(TRACE(6))
1659: - PR "match at ^: '%s' out=%d\n", b, s->out);
1660: -#endif
1661: - return((s->out == FAIL)? 0:b);
1662: - }
1663: - }
1664: - while(b < e){
1665: -#ifdef DEBUG
1666: - if(TRACE(4))
1667: - PR "state %d@%d[%d pos]: char '%c'\n", s-r->states, (int)s, s->npos, *b);
1668: -#endif
1669: - if(t = s->tab[*(unsigned char *)b])
1670: - s = t;
1671: - else
1672: - s = nextstate(r, s, *(unsigned char *)b);
1673: - if(s->out){
1674: -#ifdef DEBUG
1675: - if(TRACE(6))
1676: - PR "match at input '%s' out=%d\n", b, s->out);
1677: -#endif
1678: - return((s->out == FAIL)? 0:b);
1679: - }
1680: - b++;
1681: - }
1682: - if(endpts&RE_END){
1683: - if(t = s->tab[RE_DOLLAR])
1684: - s = t;
1685: - else
1686: - s = nextstate(r, s, RE_DOLLAR);
1687: - }
1688: - if(s->out){
1689: -#ifdef DEBUG
1690: - if(TRACE(6))
1691: - PR "match at $ '%s' out=%d\n", b, s->out);
1692: -#endif
1693: - return((s->out == FAIL)? 0:b);
1694: - }
1695: -#ifdef DEBUG
1696: - if(TRACE(3)){
1697: - char buf[EPRINTSIZE];
1698: -
1699: - eg_epr(r->root, buf, 1);
1700: - PR "pat = %s\n", buf);
1701: - }
1702: -#endif
1703: - return(0);
1704: -}
1705: -
1706: -unsigned char *
1707: -eg_lquickmatch(register re_re *r, register unsigned char *b, register unsigned char *e, int endpts)
1708: -{
1709: - register State *s, *t;
1710: - int outedness = 0;
1711: -
1712: -#ifdef DEBUG
1713: - if(TRACE(10)){
1714: - char buf[EPRINTSIZE];
1715: - eg_epr(r->root, buf, 0);
1716: - PR "lqm: r=%d carat=%d expr='%s' endpts=%d\n", r, r->carat, buf, endpts);
1717: - }
1718: -#endif
1719: - s = eg_startstate(r);
1720: - if(endpts&RE_BEG){
1721: - if(!r->carat){
1722: - if(t = s->tab[RE_CARAT])
1723: - s = t;
1724: - else
1725: - s = nextstate(r, s, RE_CARAT);
1726: - if(s->out == FAIL)
1727: - s = eg_startstate(r);
1728: - }
1729: - if(s->out){
1730: -#ifdef DEBUG
1731: - if(TRACE(6))
1732: - PR "match at ^: '%s' out=%d\n", b, s->out);
1733: -#endif
1734: - if(s->out == ACCEPT_EOP)
1735: - return(b);
1736: - else if(s->out == FAIL)
1737: - return(0);
1738: - outedness = 1;
1739: - }
1740: - }
1741: - /*
1742: - look for first match
1743: - */
1744: - if(outedness == 0)
1745: - for(; b < e; b++){
1746: -#ifdef DEBUG
1747: - if(TRACE(4))
1748: - PR "state %d@%d[%d pos]: char '%c'\n", s-r->states, (int)s, s->npos, *b);
1749: -#endif
1750: - if(t = s->tab[*(unsigned char *)b])
1751: - s = t;
1752: - else
1753: - s = nextstate(r, s, *(unsigned char *)b);
1754: - if(s->out){
1755: -#ifdef DEBUG
1756: - if(TRACE(4))
1757: - PR " out=%d, state %d@%d\n", s->out,
1758: - s-r->states, (int)s);
1759: -#endif
1760: - b++;
1761: - if((s->out == ACCEPT_EOP) || (s->out == FAIL))
1762: - goto finish;
1763: - outedness = 1;
1764: - break;
1765: - }
1766: - }
1767: - /*
1768: - in the following loop, we have seen a match already
1769: - because only way outedness is zero is if b>=e
1770: - */
1771: - for(; b < e; b++){
1772: -#ifdef DEBUG
1773: - if(TRACE(4))
1774: - PR "statex %d@%d[%d pos]: char '%c'\n", s-r->states, (int)s, s->npos, *b);
1775: -#endif
1776: - if(t = s->tab[*(unsigned char *)b])
1777: - s = t;
1778: - else
1779: - s = nextstate(r, s, *(unsigned char *)b);
1780: - if(s->out == ACCEPT)
1781: - continue;
1782: - if((s->out == NORMAL) || (s->out == FAIL)){
1783: -#ifdef DEBUG
1784: - if(TRACE(6))
1785: - PR "unmatch at input '%s' out=%d\n", b, s->out);
1786: -#endif
1787: - return(b);
1788: - }
1789: - }
1790: - if(endpts&RE_END){
1791: - if(t = s->tab[RE_DOLLAR])
1792: - s = t;
1793: - else
1794: - s = nextstate(r, s, RE_DOLLAR);
1795: - }
1796: -finish:
1797: - if((s->out && (s->out != FAIL)) || outedness){
1798: -#ifdef DEBUG
1799: - if(TRACE(6))
1800: - PR "match at $ '%s' out=%d\n", b, s->out);
1801: -#endif
1802: - return(b);
1803: - }
1804: -#ifdef DEBUG
1805: - if(TRACE(3)){
1806: - char buf[EPRINTSIZE];
1807: -
1808: - eg_epr(r->root, buf, 1);
1809: - PR "lqm('%s') failed; out=%d, s->out=%d \n", buf, outedness, s->out);
1810: - }
1811: -#endif
1812: - return(0);
1813: -}
1814: -
1815: -static
1816: -match(register re_re *r, register Expr *e, int a)
1817: -{
1818: - switch(e->type)
1819: - {
1820: - case Dollar: return(a == RE_DOLLAR);
1821: - case Carat: return(a == RE_CARAT);
1822: - case Dot: return(a < 256);
1823: - case Literal: return(r->mymap[a] == r->mymap[e->lit]);
1824: - case Charclass: if(a >= 256) return(0);
1825: - return(memchr((char *)e->r, r->mymap[a], (int)e->l) != 0);
1826: - case Compcharclass:
1827: - if(a >= 256) return(0);
1828: - return(memchr((char *)e->r, r->mymap[a], (int)e->l) == 0);
1829: - }
1830: - return(0);
1831: -}
1832: -
1833: - /*
1834: - generates the followset for a node in firstpos
1835: - */
1836: -
1837: -static void
1838: -follow(register re_re *r, register Expr *e)
1839: -{
1840: - register Expr *p;
1841: -
1842: - if(e->type == EOP)
1843: - return;
1844: - else
1845: - p = e->parent;
1846: - switch(p->type)
1847: - {
1848: - case EOP:
1849: - SET(r, firstpos, p->id)
1850: - break;
1851: - case Plus:
1852: - case Star:
1853: - (void)first(r, e);
1854: - follow(r, p);
1855: - break;
1856: - case Quest:
1857: - case Alternate:
1858: - follow(r, p);
1859: - break;
1860: - case Cat:
1861: - if(e == p->l){
1862: - if(first(r, p->r) == 0){
1863: - follow(r, p);
1864: - break;
1865: - }
1866: - } else
1867: - follow(r, p);
1868: - break;
1869: - case Group:
1870: - follow(r, p);
1871: - break;
1872: - }
1873: -}
1874: -
1875: - /*
1876: - first returns 0 if e is nullable and in the process,
1877: - sets up firstpos.
1878: - */
1879: -
1880: -static
1881: -first(register re_re *r, register Expr *e)
1882: -{
1883: - int k;
1884: -
1885: - switch(e->type)
1886: - {
1887: - case Carat:
1888: - case Dollar:
1889: - case Literal:
1890: - case Dot:
1891: - case Charclass:
1892: - case Compcharclass:
1893: - SET(r, firstpos, e->id)
1894: - return(1);
1895: - case EOP:
1896: - case Star:
1897: - case Quest:
1898: - (void)first(r, e->l);
1899: - return(0);
1900: - case Group:
1901: - case Plus:
1902: - return(first(r, e->l));
1903: - case Cat:
1904: - return(first(r, e->l) || first(r, e->r));
1905: - case Alternate:
1906: - k = first(r, e->r);
1907: - return(first(r, e->l) && k);
1908: - default:
1909: - EPR "bad type %d\n", e->type);
1910: - abort();
1911: - return(0);
1912: - }
1913: -}
1914: -
1915: -static void
1916: -efollow(register re_re *r, register Expr *e)
1917: -{
1918: - register i, *p;
1919: -
1920: - RESET(r, firstpos);
1921: - follow(r, e);
1922: - e->flen = r->firstpos.count;
1923: - e->follow = (int *)malloc((unsigned)(e->flen*sizeof(int)));
1924: - if(e->follow == 0){
1925: - char buf[100];
1926: - SPR buf, "efollow malloc fail(%ld)\n", e->flen);
1927: - re_error(buf);
1928: - return;
1929: - }
1930: - p = e->follow;
1931: - GET(r->firstpos, i)
1932: - *p++ = i;
1933: - if(p != e->follow+e->flen){
1934: - char buf[100];
1935: - SPR buf, "efollow length error: %d %ld\n", p-e->follow, e->flen);
1936: - re_error(buf);
1937: - return;
1938: - }
1939: -}
1940: -
1941: -static State *
1942: -addstate(register re_re *r, register Positionset *ps)
1943: -{
1944: - register *p, j;
1945: - register State *s;
1946: -
1947: - s = r->states + eg_getstate(r);
1948: - memset((char *)s->tab, 0, sizeof(s->tab));
1949: - s->pos = eg_posalloc(r, (int)ps->count);
1950: - s->npos = ps->count;
1951: - p = r->posbase+s->pos;
1952: - GET((*ps), j)
1953: - *p++ = j;
1954: - if(s->out = (ps->base[r->root->id] != 0)){
1955: - if((ps->base[r->root->id] <= 0) && (ps->last == r->root->id))
1956: - s->out = ACCEPT_EOP; /* marker for only the EOP marker */
1957: - else
1958: - s->out = ACCEPT;
1959: - }
1960: - if(s->npos == 0)
1961: - s->out = FAIL;
1962: -#ifdef DEBUG
1963: - if(TRACE(3)){
1964: - char buf[2000];
1965: - eg_spr(s->npos, s->pos+r->posbase, buf);
1966: - PR "new state[%d]@%d %s,pos=%d out=%d\n", s-r->states, s, buf, s->pos, s->out);
1967: - }
1968: -#endif
1969: - return(s);
1970: -}
1971: -
1972: -static State *
1973: -nextstate(register re_re *r, register State *s, int a)
1974: -{
1975: - register int p, *q, *eq;
1976: - register long i;
1977: - State *news;
1978: - Expr *e;
1979: -
1980: - RESET(r, tmp);
1981: -#ifdef DEBUG
1982: - if(TRACE(5)){
1983: - char buf[2000];
1984: - ppr(&r->tmp, buf);
1985: - PR "nextstate: reset: %s\n", buf);
1986: - }
1987: -#endif
1988: - for(i = s->npos, p = s->pos; i > 0; i--){
1989: - e = r->ptr[r->posbase[p++]];
1990: -#ifdef DEBUG
1991: - if(TRACE(11)){
1992: - PR "i=%d e->type=%d\n", i, e->type);
1993: - }
1994: -#endif
1995: - if(e->type == EOP) continue;
1996: - if(match(r, e, a)){
1997: -#ifdef DEBUG
1998: - if(TRACE(11)){PR "matched %c\n", a);}
1999: -#endif
2000: - if(e->follow == 0)
2001: - efollow(r, e);
2002: - for(q = e->follow, eq = q+e->flen; q < eq; q++){
2003: - SET(r, tmp, *q)
2004: - }
2005: - }
2006: - }
2007: -#ifdef DEBUG
2008: - if(TRACE(5)){
2009: - char buf[2000];
2010: - ppr(&r->tmp, buf);
2011: - PR "nextstate(%d, '%c'): found %s\n", s-r->states, a, buf);
2012: - }
2013: -#endif
2014: - if(news = eg_stateof(r, &r->tmp)){
2015: - if(a <= RE_DOLLAR)
2016: - s->tab[a] = news;
2017: - } else
2018: - news = addstate(r, &r->tmp);
2019: -#ifdef DEBUG
2020: - if(TRACE(5)){
2021: - PR "nextstate(%d, '%c'): returning %ld %d out=%d\n", s-r->states, a,
2022: - (long)news, news-r->states, news->out);
2023: - }
2024: -#endif
2025: - return(news);
2026: -}
2027: -
2028: -void *
2029: -egmalloc(int n, char *s)
2030: -{
2031: - char *x;
2032: - char buf[256];
2033: -
2034: - if((x = malloc(n)) == 0){
2035: - SPR buf, "malloc fail(%d): %s", n, s);
2036: - re_error(buf);
2037: - return 0;
2038: - }
2039: - return((void *)x);
2040: -}
2041: -
2042: -void *
2043: -egrealloc(char *p, int n, char *s)
2044: -{
2045: - char *x;
2046: - char buf[256];
2047: -
2048: - if((x = realloc(p, n)) == 0){
2049: - SPR buf, "realloc fail(%d): %s", n, s);
2050: - re_error(buf);
2051: - return 0;
2052: - }
2053: - return((void *)x);
2054: -}
2055: -
2056: -#ifdef DEBUG
2057: -static void
2058: -ppr(register Positionset *ps, register char *p)
2059: -{
2060: - register n;
2061: -
2062: - if(ps->count < 1){
2063: - SPR p, "{}");
2064: - return;
2065: - }
2066: - *p++ = '{';
2067: - GET((*ps), n){
2068: - SPR p, "%d[=%d],", n, ps->base[n]);
2069: - p = strchr(p, 0);
2070: - }
2071: - p[-1] = '}';
2072: -}
2073: -#endif
2074: //GO.SYSIN DD eg.c
2075: echo egcomp.c 1>&2
2076: sed 's/.//' >egcomp.c <<'//GO.SYSIN DD egcomp.c'
2077: -#include "re.h"
2078: -#include "lre.h"
2079: -#include "hdr.h"
2080: -
2081: -static Exprtype toktype;
2082: -static int toklit;
2083: -static char *beg, *end;
2084: -static int maxid;
2085: -static Expr *e0(void);
2086: -static Expr *d0(void);
2087: -static Expr *r18(void);
2088: -static void err(char*);
2089: -static int parno;
2090: -static jmp_buf gohome;
2091: -static unsigned char *mymap;
2092: -
2093: -void
2094: -egpost(re_re *r)
2095: -{
2096: - r->maxid = maxid;
2097: - r->backref = r->root->backref;
2098: - r->parens = r->root->parens;
2099: -}
2100: -
2101: -Expr *
2102: -eg_newexpr(Exprtype t, int l, Expr *left, Expr *right)
2103: -{
2104: - register Expr *e = (Expr *)egmalloc(sizeof(Expr), "eg_newexpr");
2105: -
2106: - if (!e)
2107: - return 0;
2108: - e->type = t;
2109: - e->parent = 0;
2110: - e->lit = l;
2111: - if(e->lit)
2112: - e->id = maxid++;
2113: - else
2114: - e->id = 0;
2115: - e->backref = 0;
2116: - e->parens = 0;
2117: - if(e->l = left){
2118: - left->parent = e;
2119: - if(left->backref) e->backref = 1;
2120: - if(left->parens) e->parens = 1;
2121: - }
2122: - if(e->r = right){
2123: - right->parent = e;
2124: - if(right->backref) e->backref = 1;
2125: - if(right->parens) e->parens = 1;
2126: - }
2127: - e->follow = 0;
2128: - e->flen = 0;
2129: - e->reallit = 0;
2130: - return(e);
2131: -}
2132: -
2133: -void
2134: -eg_lexinit(char *b, char *e)
2135: -{
2136: - beg = b;
2137: - end = e;
2138: - maxid = 1;
2139: - parno = 1;
2140: -}
2141: -
2142: -void
2143: -eg_lex(void)
2144: -{
2145: - if(beg == end){
2146: - toktype = EOP;
2147: - toklit = -1;
2148: - } else switch(toklit = *beg++)
2149: - {
2150: - case '.': toktype = Dot; break;
2151: - case '*': toktype = Star; break;
2152: - case '+': toktype = Plus; break;
2153: - case '?': toktype = Quest; break;
2154: - case '^': toktype = Carat; break;
2155: - case '$': toktype = Dollar; break;
2156: - case '[': toktype = Charclass; break;
2157: - case '\n':
2158: - case '|': toktype = Alternate; break;
2159: - case '(': toktype = Lpar; break;
2160: - case ')': toktype = Rpar; break;
2161: - case '\\': toktype = Backslash;
2162: - if(beg == end)
2163: - err("bad \\");
2164: - else
2165: - toklit = *beg++;
2166: - break;
2167: - default: toktype = Literal; break;
2168: - }
2169: -}
2170: -
2171: -void
2172: -eg_epr(register Expr *e, char *res, int doset)
2173: -{
2174: - char r1[EPRINTSIZE], r2[EPRINTSIZE], rid[EPRINTSIZE];
2175: - int ids = 0; /* sort of a debugging flag */
2176: -
2177: - if(e == 0){
2178: - SPR res, "!0!");
2179: - return;
2180: - }
2181: - r1[0] = 0;
2182: - if(ids)
2183: - SPR rid, "%d:", e->id);
2184: - else
2185: - rid[0] = 0;
2186: - switch(e->type)
2187: - {
2188: - case Literal:
2189: - if(doset)
2190: - eg_spr(e->flen, e->follow, r1);
2191: - SPR res, "%s'%c'%s", rid, e->lit, r1);
2192: - break;
2193: - case Dot:
2194: - case Carat:
2195: - case Dollar:
2196: - if(doset)
2197: - eg_spr(e->flen, e->follow, r1);
2198: - SPR res, "%s%c%s", rid, e->lit, r1);
2199: - break;
2200: - case Compcharclass:
2201: - case Charclass:
2202: - *res++ = '[';
2203: - if(e->type == Compcharclass)
2204: - *res++ = '^';
2205: - memmove(res, (char *)e->r, (int)e->l);
2206: - res += (int)e->l;
2207: - *res++ = ']';
2208: - *res = 0;
2209: - break;
2210: - case Cat:
2211: - eg_epr(e->l, r1, doset);
2212: - eg_epr(e->r, r2, doset);
2213: - SPR res, "%s%s%s", rid, r1, r2);
2214: - break;
2215: - case Alternate:
2216: - eg_epr(e->l, r1, doset);
2217: - eg_epr(e->r, r2, doset);
2218: - SPR res, "%s(%s|%s)", rid, r1, r2);
2219: - break;
2220: - case Star:
2221: - eg_epr(e->l, r1, doset);
2222: - SPR res, "%s(%s)*", rid, r1);
2223: - break;
2224: - case Plus:
2225: - eg_epr(e->l, r1, doset);
2226: - SPR res, "%s(%s)+", rid, r1);
2227: - break;
2228: - case Quest:
2229: - eg_epr(e->l, r1, doset);
2230: - SPR res, "%s(%s)?", rid, r1);
2231: - break;
2232: - case Group:
2233: - eg_epr(e->l, r1, doset);
2234: - SPR res, "%sG<%s>", rid, r1);
2235: - break;
2236: - case EOP:
2237: - eg_epr(e->l, r1, doset);
2238: - SPR res, "%s%s<EOP>", rid, r1);
2239: - break;
2240: - case Backref:
2241: - SPR res, "%s\\%d", rid, e->lit);
2242: - break;
2243: - default:
2244: - SPR res, "<undef type %d>", e->type);
2245: - err(res);
2246: - break;
2247: - }
2248: -}
2249: -
2250: -static void
2251: -ccl(int *count, char **str, int oldrange)
2252: -{
2253: - register n;
2254: - int cnt;
2255: - char tab[256], *s;
2256: - int range, lastc, i;
2257: -
2258: -#define TSET(b) {if(tab[n = mymap[(b)]] == 0){ tab[n] = 1; cnt++; } }
2259: -
2260: - cnt = 0;
2261: - memset(tab, 0, sizeof tab);
2262: - lastc = -1;
2263: - range = 0;
2264: - /* scan for chars */
2265: - for(; (beg < end); beg++){
2266: - toklit = *beg;
2267: - if(*beg == ']'){
2268: - if(!oldrange)
2269: - break;
2270: - if(lastc >= 0)
2271: - break;
2272: - }
2273: - if(*beg == '-'){
2274: - if(lastc < 0){
2275: - TSET('-')
2276: - lastc = *(unsigned char *)beg;
2277: - } else
2278: - range = 1;
2279: - continue;
2280: - }
2281: - if(*beg == '\\'){
2282: - if(++beg >= end){
2283: - err("unexpected eop after \\ in char class");
2284: - beg--;
2285: - }
2286: - }
2287: - if(range){
2288: - for(i = *(unsigned char *)beg; i >= lastc; i--)
2289: - TSET(i)
2290: - range = 0;
2291: - } else
2292: - TSET(*(unsigned char *)beg)
2293: - lastc = *(unsigned char *)beg;
2294: - }
2295: - if(range){
2296: - if(oldrange)
2297: - TSET('-')
2298: - else
2299: - err("unterminated range in []");
2300: - }
2301: - if(beg < end)
2302: - beg++;
2303: - else
2304: - err("eop during ccl");
2305: - if(cnt == 0)
2306: - err("empty charclass");
2307: - eg_lex();
2308: - *count = cnt;
2309: - *str = s = (char *)egmalloc(cnt, "charclass defn");
2310: - if (!s)
2311: - return;
2312: - for(n = 0; n < 256; n++)
2313: - if(tab[n])
2314: - *s++ = n;
2315: -}
2316: -
2317: -/*
2318: - gre patterns:
2319: -
2320: - e0: e1 { '|' e1 }*
2321: - e1: e2 { e2 }*
2322: - e2: e3 { '*' | '?' | '+' | \{ m,n \} }*
2323: - e3: lit | '.' | '^' | '$' | '(' e0 ')'
2324: -*/
2325: -
2326: -static Expr *
2327: -e3(void)
2328: -{
2329: - Expr *e;
2330: - Exprtype t;
2331: - int cnt;
2332: - char *s;
2333: -
2334: - switch(toktype)
2335: - {
2336: - case Backslash:
2337: - if((toklit >= '1') && (toklit <= '9')){
2338: - e = eg_newexpr(Backref, toklit-'0', (Expr *)0, (Expr *)0);
2339: - e->backref = 1;
2340: - } else
2341: - e = eg_newexpr(Literal, toklit, (Expr *)0, (Expr *)0);
2342: - eg_lex();
2343: - break;
2344: - case Literal:
2345: - e = eg_newexpr(Literal, toklit, (Expr *)0, (Expr *)0);
2346: - eg_lex();
2347: - break;
2348: - case Dot:
2349: - e = eg_newexpr(Dot, '.', (Expr *)0, (Expr *)0);
2350: - eg_lex();
2351: - break;
2352: - case Carat:
2353: - e = eg_newexpr(Carat, '^', (Expr *)0, (Expr *)0);
2354: - eg_lex();
2355: - break;
2356: - case Dollar:
2357: - e = eg_newexpr(Dollar, '$', (Expr *)0, (Expr *)0);
2358: - eg_lex();
2359: - break;
2360: - case Charclass:
2361: - t = toktype;
2362: - if(*beg == '^'){
2363: - t = Compcharclass;
2364: - beg++;
2365: - }
2366: - ccl(&cnt, &s, 0);
2367: - e = eg_newexpr(t, '[', (Expr *)0, (Expr *)0);
2368: - e->l = (Expr *)cnt; /* num of chars */
2369: - e->r = (Expr *)s; /* chars */
2370: - break;
2371: - case Lpar:
2372: - eg_lex();
2373: - cnt = parno++;
2374: - e = e0();
2375: - if(toktype == Rpar)
2376: - eg_lex();
2377: - else
2378: - err("expected a ')'");
2379: - e = eg_newexpr(Group, cnt, e, (Expr *)0);
2380: - e->parens = 1;
2381: - return(e);
2382: - case EOP:
2383: - default:
2384: - err("expected a lit or '('");
2385: - e = 0;
2386: - }
2387: - return(e);
2388: -}
2389: -
2390: -static int
2391: -integer(void)
2392: -{
2393: - int n;
2394: -
2395: - n = 0;
2396: - while((toktype == Literal) && (toklit >= '0') && (toklit <= '9')){
2397: - n = 10*n + toklit-'0';
2398: - eg_lex();
2399: - }
2400: - return(n);
2401: -}
2402: -
2403: -static Expr *
2404: -ecopy(Expr *e)
2405: -{
2406: - Expr *ee;
2407: - char res[256];
2408: -
2409: - if(e == 0)
2410: - return(e);
2411: - switch(e->type)
2412: - {
2413: - case Literal:
2414: - case Dot:
2415: - case Carat:
2416: - case Dollar:
2417: - case Backref:
2418: - return(eg_newexpr(e->type, e->lit, (Expr *)0, (Expr *)0));
2419: - case Compcharclass:
2420: - case Charclass:
2421: - ee = eg_newexpr(e->type, e->lit, (Expr *)0, (Expr *)0);
2422: - ee->r = (Expr *)egmalloc((int)e->l, "expr copy");
2423: - if (!ee->r)
2424: - return 0;
2425: - ee->l = e->l;
2426: - memmove((char *)ee->r, (char *)e->r, (int)e->l);
2427: - return(ee);
2428: - case Cat:
2429: - case Alternate:
2430: - return(eg_newexpr(e->type, e->lit, ecopy(e->l), ecopy(e->r)));
2431: - case Star:
2432: - case Plus:
2433: - case Quest:
2434: - case Group:
2435: - case EOP:
2436: - return(eg_newexpr(e->type, e->lit, ecopy(e->l), (Expr *)0));
2437: - default:
2438: - SPR res, "<undef type %d>", e->type);
2439: - err(res);
2440: - return((Expr *)0);
2441: - }
2442: -}
2443: -
2444: -static Expr *
2445: -edup(Expr *expr, int n, int opt)
2446: -{
2447: - if(n == 1){
2448: - expr = ecopy(expr);
2449: - if(opt)
2450: - expr = eg_newexpr(Quest, 0, expr, (Expr *)0);
2451: - return(expr);
2452: - }
2453: - return(eg_newexpr(Cat, 0, edup(expr, n-n/2, opt), edup(expr, n/2, opt)));
2454: -}
2455: -
2456: -static Expr *
2457: -range(Expr *expr)
2458: -{
2459: - int beg, end;
2460: - Expr *e, *e1;
2461: -
2462: - if((toktype == Literal) && (toklit >= '0') && (toklit <= '9'))
2463: - beg = integer();
2464: - else
2465: - err("expected a number in range");
2466: - if((toktype == Literal) && (toklit == ',')){
2467: - end = -1;
2468: - eg_lex();
2469: - } else
2470: - end = -2;
2471: - if((toktype == Literal) && (toklit >= '0') && (toklit <= '9'))
2472: - end = integer();
2473: - if((toktype == Backslash) && (toklit == '}'))
2474: - eg_lex();
2475: - else
2476: - err("expected \\} in range");
2477: - e1 = edup(expr, beg, 0);
2478: - if(end == -2)
2479: - e = e1;
2480: - else if(end == -1)
2481: - e = eg_newexpr(Cat, 0, e1, eg_newexpr(Star, 0, expr, (Expr *)0));
2482: - else {
2483: - if(end < beg)
2484: - err("bad range specification");
2485: - e = (end > beg)? eg_newexpr(Cat, 0, e1, edup(expr, end-beg, 1)) : e1;
2486: - }
2487: - return(e);
2488: -}
2489: -
2490: -static Expr *
2491: -e2(void)
2492: -{
2493: - Expr *e;
2494: - Exprtype t;
2495: -
2496: - e = e3();
2497: - while((toktype == Star) || (toktype == Plus) || (toktype == Quest)
2498: - || ((toktype == Backslash) && (toklit == '{'))){
2499: - if((toktype == Backslash) && (toklit == '{')){
2500: - eg_lex();
2501: - e = range(e);
2502: - } else {
2503: - t = toktype;
2504: - eg_lex();
2505: - e = eg_newexpr(t, 0, e, (Expr *)0);
2506: - }
2507: - }
2508: - return(e);
2509: -}
2510: -
2511: -static Expr *
2512: -e1(void)
2513: -{
2514: - Expr *e, *f;
2515: -
2516: - e = e2();
2517: - while((toktype == Literal) || (toktype == Dot) || (toktype == Lpar)
2518: - || (toktype == Backslash) || (toktype == Dollar)
2519: - || (toktype == Carat) || (toktype == Charclass)){
2520: - f = e2();
2521: - e = eg_newexpr(Cat, 0, e, f);
2522: - }
2523: - return(e);
2524: -}
2525: -
2526: -static Expr *
2527: -e0(void)
2528: -{
2529: - Expr *e, *f;
2530: -
2531: - e = e1();
2532: - while(toktype == Alternate){
2533: - eg_lex();
2534: - if(toktype == EOP)
2535: - continue;
2536: - f = e1();
2537: - e = eg_newexpr(Alternate, 0, e, f);
2538: - }
2539: - return(e);
2540: -}
2541: -
2542: -/*
2543: - egrep patterns:
2544: -
2545: - d0: d1 { '|' d1 }*
2546: - d1: d2 { d2 }*
2547: - d2: d3 { '*' | '?' | '+' }
2548: - d3: lit | '.' | '^' | '$' | '(' d0 ')'
2549: -*/
2550: -
2551: -static Expr *
2552: -d3(void)
2553: -{
2554: - Expr *e;
2555: - Exprtype t;
2556: - int cnt;
2557: - char *s;
2558: -
2559: - switch(toktype)
2560: - {
2561: - case Backslash:
2562: - case Literal:
2563: - e = eg_newexpr(Literal, toklit, (Expr *)0, (Expr *)0);
2564: - eg_lex();
2565: - break;
2566: - case Dot:
2567: - e = eg_newexpr(Dot, '.', (Expr *)0, (Expr *)0);
2568: - eg_lex();
2569: - break;
2570: - case Carat:
2571: - e = eg_newexpr(Carat, '^', (Expr *)0, (Expr *)0);
2572: - eg_lex();
2573: - break;
2574: - case Dollar:
2575: - e = eg_newexpr(Dollar, '$', (Expr *)0, (Expr *)0);
2576: - eg_lex();
2577: - break;
2578: - case Charclass:
2579: - t = toktype;
2580: - if(*beg == '^'){
2581: - t = Compcharclass;
2582: - beg++;
2583: - }
2584: - ccl(&cnt, &s, 1);
2585: - e = eg_newexpr(t, '[', (Expr *)0, (Expr *)0);
2586: - e->l = (Expr *)cnt; /* num of chars */
2587: - e->r = (Expr *)s; /* chars */
2588: - break;
2589: - case Lpar:
2590: - eg_lex();
2591: - e = d0();
2592: - if(toktype == Rpar)
2593: - eg_lex();
2594: - else
2595: - err("expected a ')'");
2596: - return(e);
2597: - default:
2598: - err("expected a lit or '('");
2599: - e = 0;
2600: - }
2601: - return(e);
2602: -}
2603: -
2604: -static Expr *
2605: -d2(void)
2606: -{
2607: - Expr *e;
2608: - Exprtype t;
2609: -
2610: - e = d3();
2611: - while((toktype == Star) || (toktype == Plus) || (toktype == Quest)){
2612: - t = toktype;
2613: - eg_lex();
2614: - e = eg_newexpr(t, 0, e, (Expr *)0);
2615: - }
2616: - return(e);
2617: -}
2618: -
2619: -static Expr *
2620: -d1(void)
2621: -{
2622: - Expr *e, *f;
2623: -
2624: - e = d2();
2625: - while((toktype == Literal) || (toktype == Dot) || (toktype == Lpar)
2626: - || (toktype == Dollar) || (toktype == Backslash)
2627: - || (toktype == Carat) || (toktype == Charclass)){
2628: - f = d2();
2629: - e = eg_newexpr(Cat, 0, e, f);
2630: - }
2631: - return(e);
2632: -}
2633: -
2634: -static Expr *
2635: -d0(void)
2636: -{
2637: - Expr *e, *f;
2638: -
2639: - e = d1();
2640: - while(toktype == Alternate){
2641: - eg_lex();
2642: - if(toktype == EOP)
2643: - continue;
2644: - f = d1();
2645: - e = eg_newexpr(Alternate, 0, e, f);
2646: - }
2647: - return(e);
2648: -}
2649: -
2650: -/*
2651: - grep patterns:
2652: -
2653: - r0: r18 | '^' r18 | '^' r18 '$' | r18 '$'
2654: - r18: r17 { r17 }*
2655: - r17: r14 | r14 '*' | '\(' r18 '\)'
2656: - r14: lit | '.' | '*' | '\' d
2657: -*/
2658: -
2659: -static Expr *
2660: -r14(void)
2661: -{
2662: - Expr *e;
2663: - Exprtype t;
2664: - int cnt;
2665: - char *s;
2666: -
2667: - switch(toktype)
2668: - {
2669: - case Alternate:
2670: - case Plus:
2671: - case Quest:
2672: - case Star:
2673: - case Lpar:
2674: - case Rpar:
2675: - case Dollar:
2676: - case Carat:
2677: - case Literal:
2678: - e = eg_newexpr(Literal, toklit, (Expr *)0, (Expr *)0);
2679: - eg_lex();
2680: - break;
2681: - case Backslash:
2682: - if((toklit >= '1') && (toklit <= '9')){
2683: - e = eg_newexpr(Backref, toklit-'0', (Expr *)0, (Expr *)0);
2684: - e->backref = 1;
2685: - } else {
2686: - e = eg_newexpr(Literal, toklit, (Expr *)0, (Expr *)0);
2687: - e->reallit = 1;
2688: - }
2689: - eg_lex();
2690: - break;
2691: - case Dot:
2692: - e = eg_newexpr(Dot, '.', (Expr *)0, (Expr *)0);
2693: - eg_lex();
2694: - break;
2695: - case Charclass:
2696: - t = toktype;
2697: - if(*beg == '^'){
2698: - t = Compcharclass;
2699: - beg++;
2700: - }
2701: - ccl(&cnt, &s, 1);
2702: - e = eg_newexpr(t, '[', (Expr *)0, (Expr *)0);
2703: - e->l = (Expr *)cnt; /* num of chars */
2704: - e->r = (Expr *)s; /* chars */
2705: - break;
2706: - default:
2707: - err("expected a one-char RE");
2708: - eg_lex(); /* make sure we don't loop */
2709: - e = 0;
2710: - }
2711: - return(e);
2712: -}
2713: -
2714: -static Expr *
2715: -r17(void)
2716: -{
2717: - Expr *e;
2718: - int cnt;
2719: -
2720: - if((toktype == Backslash) && (toklit == '(')){
2721: - eg_lex();
2722: - cnt = parno++;
2723: - e = r18();
2724: - if((toktype == Backslash) && (toklit == ')'))
2725: - eg_lex();
2726: - else
2727: - err("expected a closing \\)");
2728: - e = eg_newexpr(Group, cnt, e, (Expr *)0);
2729: - e->parens = 1;
2730: - } else {
2731: - e = r14();
2732: - if(toktype == Star){
2733: - e = eg_newexpr(Star, 0, e, (Expr *)0);
2734: - eg_lex();
2735: - }
2736: - }
2737: - return(e);
2738: -}
2739: -
2740: -static Expr *
2741: -r18(void)
2742: -{
2743: - Expr *e, *f;
2744: -
2745: - e = r17();
2746: - while(toktype != EOP){
2747: - if((toktype == Backslash) && (toklit == ')'))
2748: - break;
2749: - f = r17();
2750: - e = eg_newexpr(Cat, 0, e, f);
2751: - }
2752: - return(e);
2753: -}
2754: -
2755: -static Expr *
2756: -r0(void)
2757: -{
2758: - Expr *e, *e1;
2759: -
2760: - if(toktype == Carat){
2761: - e1 = eg_newexpr(Carat, '^', (Expr *)0, (Expr *)0);
2762: - eg_lex();
2763: - } else
2764: - e1 = 0;
2765: - if(toktype == EOP)
2766: - e = e1;
2767: - else {
2768: - e = r18();
2769: - /* did we see a dollar that is not a literal? */
2770: - if(e && (toktype == EOP)){
2771: - /* singleton dollar */
2772: - if((e->type == Literal) && (e->lit == '$'))
2773: - e->type = Dollar;
2774: - /* any other dollar */
2775: - if((e->type == Cat) && !e->r->reallit && (e->r->type == Literal)
2776: - && (e->r->lit == '$'))
2777: - e->r->type = Dollar;
2778: - }
2779: - if(e1){
2780: - if(e)
2781: - e = eg_newexpr(Cat, 0, e1, e);
2782: - else
2783: - e = e1;
2784: - }
2785: - }
2786: - if(toktype == Dollar){
2787: - if(e)
2788: - e = eg_newexpr(Cat, 0, e, eg_newexpr(Dollar, '$', (Expr *)0, (Expr *)0));
2789: - else
2790: - e = eg_newexpr(Dollar, '$', (Expr *)0, (Expr *)0);
2791: - eg_lex();
2792: - }
2793: - return(e);
2794: -}
2795: -
2796: -Expr *
2797: -eg_eall(enum Parsetype type, unsigned char *map)
2798: -{
2799: - Expr *e;
2800: -
2801: - mymap = map;
2802: - if(setjmp(gohome) == 0){
2803: - if(type == egrepparse)
2804: - while(toktype == Alternate) /* bogus but user-friendly */
2805: - eg_lex();
2806: - switch(type)
2807: - {
2808: - case greparse: e = e0(); break;
2809: - case grepparse: e = r0(); break;
2810: - case egrepparse: e = d0(); break;
2811: - }
2812: - if(type == egrepparse)
2813: - while(toktype == Alternate) /* bogus but user-friendly */
2814: - eg_lex();
2815: - if(toktype != EOP)
2816: - err("expected end of pattern");
2817: - } else
2818: - e = 0;
2819: -/*{char buf1[4096]; e, buf1, 0); print("e='%s'\n", buf1);}/**/
2820: - return(e);
2821: -}
2822: -
2823: -void
2824: -eg_spr(long c, int *p, register char *buf)
2825: -{
2826: - if(c > 0){
2827: - *buf++ = '{';
2828: - *buf = 0;
2829: - while(--c > 0){
2830: - SPR buf, "%d,", *p++);
2831: - buf = strchr(buf, 0);
2832: - }
2833: - SPR buf, "%d}", *p);
2834: - } else
2835: - SPR buf, "{}");
2836: -}
2837: -
2838: -static void
2839: -err(char *s)
2840: -{
2841: - char buf[4096];
2842: -
2843: - if(toklit < 0)
2844: - SPR buf, "expression error: %s but got end of expression", s);
2845: - else
2846: - SPR buf, "expression error: %s near '%c'", s, toklit);
2847: - re_error(buf);
2848: - longjmp(gohome, 1);
2849: -}
2850: //GO.SYSIN DD egcomp.c
2851: echo eglit.c 1>&2
2852: sed 's/.//' >eglit.c <<'//GO.SYSIN DD eglit.c'
2853: -#include "re.h"
2854: -#include "lre.h"
2855: -#include "hdr.h"
2856: -
2857: -static void traverse(Expr *);
2858: -
2859: -#define MAXLIT 256 /* is plenty big enough */
2860: -static unsigned char tmp[MAXLIT], best[MAXLIT];
2861: -static unsigned char *p;
2862: -static int bestlen;
2863: -#define START { p = tmp ; }
2864: -#define ADD(c) { if(p >= &tmp[MAXLIT]) p--; *p++ = c; }
2865: -#define FINISH { ADD(0) if((p-tmp) > bestlen) memmove((char *)best, (char *)tmp, bestlen = p-tmp); }
2866: -
2867: -re_lit(re_re *r, unsigned char **b, unsigned char **e)
2868: -{
2869: - bestlen = 0;
2870: - START
2871: - traverse(r->root);
2872: - FINISH
2873: - if(bestlen < 3)
2874: - return(0);
2875: - *b = best;
2876: - *e = best+bestlen-1;
2877: - return(1);
2878: -}
2879: -
2880: -static void
2881: -traverse(register Expr *e)
2882: -{
2883: - switch(e->type)
2884: - {
2885: - case Literal:
2886: - ADD(e->lit)
2887: - break;
2888: - case Charclass:
2889: - if((int)e->l == 1)
2890: - ADD(*(char *)e->r)
2891: - else {
2892: - FINISH
2893: - START
2894: - }
2895: - break;
2896: - case Cat:
2897: - traverse(e->l);
2898: - traverse(e->r);
2899: - break;
2900: - case Plus:
2901: - traverse(e->l);
2902: - FINISH /* can't go on past a + */
2903: - START /* but we can start with one! */
2904: - traverse(e->l);
2905: - break;
2906: - case EOP:
2907: - FINISH
2908: - START
2909: - traverse(e->l);
2910: - break;
2911: - default:
2912: - FINISH
2913: - START
2914: - break;
2915: - }
2916: -}
2917: //GO.SYSIN DD eglit.c
2918: echo egpos.c 1>&2
2919: sed 's/.//' >egpos.c <<'//GO.SYSIN DD egpos.c'
2920: -#include "re.h"
2921: -#include "lre.h"
2922: -#include "hdr.h"
2923: -
2924: -#ifndef POSSTEP
2925: -#define POSSTEP (8*1024)
2926: -#endif
2927: -
2928: -void
2929: -eg_posinit(re_re *r)
2930: -{
2931: - if(r->nposalloc <= 0)
2932: - r->nposalloc = POSSTEP;
2933: - r->posbase = (int *)egmalloc(r->nposalloc*sizeof(int), "posbase");
2934: - if (!r->posbase)
2935: - return;
2936: - r->posnext = 0;
2937: -}
2938: -
2939: -void
2940: -eg_posset(re_re *r)
2941: -{
2942: - r->posreset = r->posnext;
2943: -}
2944: -
2945: -eg_posalloc(re_re *r, int n)
2946: -{
2947: - register j;
2948: -
2949: - if(n < 0){
2950: - r->posnext = r->posreset;
2951: - return(-1);
2952: - }
2953: - j = r->posnext;
2954: - r->posnext += n;
2955: - if(r->posnext >= r->nposalloc){
2956: - while((r->nposalloc < r->posnext) && (r->nposalloc < 256*1024))
2957: - r->nposalloc *= 2;
2958: - if(r->nposalloc < r->posnext){
2959: - r->nposalloc = (r->posnext+POSSTEP-1)/POSSTEP;
2960: - r->nposalloc *= POSSTEP;
2961: - }
2962: - r->posbase = (int *)egrealloc((char *)r->posbase, r->nposalloc*sizeof(int), "posbase");
2963: - if (!r->posbase)
2964: - return(-1);
2965: - }
2966: - return(j);
2967: -}
2968: //GO.SYSIN DD egpos.c
2969: echo egstate.c 1>&2
2970: sed 's/.//' >egstate.c <<'//GO.SYSIN DD egstate.c'
2971: -#include "re.h"
2972: -#include "lre.h"
2973: -#include "hdr.h"
2974: -
2975: -#ifndef MINSTATE
2976: -#define MINSTATE 32
2977: -#endif
2978: -
2979: -void
2980: -eg_stateinit(re_re *r)
2981: -{
2982: - r->statelim = MINSTATE;
2983: - r->states = 0;
2984: - r->threshhold = 2;
2985: -}
2986: -
2987: -void
2988: -eg_clrstates(re_re *r)
2989: -{
2990: - r->nstates = 0;
2991: - if(r->states == 0){
2992: - r->states = (State *)egmalloc(r->statelim*sizeof(State), "states");
2993: - if (!r->states)
2994: - return;
2995: - }
2996: -}
2997: -
2998: -void
2999: -eg_savestate(re_re *r, State *s)
3000: -{
3001: - r->initialstate = s-r->states;
3002: - r->istate = r->states[r->initialstate]; /* save for reset */
3003: - r->istate.init = 1;
3004: - r->flushed = 0;
3005: -}
3006: -
3007: -State *
3008: -eg_startstate(re_re *r)
3009: -{
3010: - register i;
3011: -
3012: - if(r->flushed > r->threshhold){
3013: - int slim = r->statelim*2;
3014: - if(slim > 512)
3015: - slim = 512;
3016: - if(slim > r->statelim){
3017: - for(i = 0; i < r->statelim; i++)
3018: - memset((char *)r->states[i].tab, 0, sizeof r->states[i].tab);
3019: - r->states = (State *)egrealloc((char *)r->states,
3020: - (r->statelim = slim)*sizeof(State), "states");
3021: - if (!r->states)
3022: - return 0;
3023: - }
3024: - r->flushed = 0;
3025: - r->threshhold++;
3026: - r->states[r->initialstate] = r->istate;
3027: - r->nstates = r->initialstate+1;
3028: - }
3029: - return(r->states+r->initialstate);
3030: -}
3031: -
3032: -eg_getstate(register re_re *r)
3033: -{
3034: - if(r->nstates >= r->statelim){
3035: - r->nstates = r->initialstate+1;
3036: - r->states[r->initialstate] = r->istate;
3037: - (void)eg_posalloc(r, -1);
3038: - r->flushed++;
3039: - }
3040: - r->states[r->nstates].init = 0;
3041: - return(r->nstates++);
3042: -}
3043: -
3044: -State *
3045: -eg_stateof(re_re *r, register Positionset *ps)
3046: -{
3047: - register State *s;
3048: - register i;
3049: - register *p, *e;
3050: -
3051: - for(i = 0, s = r->states; i < r->nstates; i++, s++){
3052: - if(s->npos == ps->count){
3053: - for(p = s->pos+r->posbase, e = p+s->npos; p < e;)
3054: - if(ps->base[*p++] == 0){
3055: - goto next;
3056: - }
3057: - return(s);
3058: - }
3059: - next:;
3060: - }
3061: - return(0);
3062: -}
3063: //GO.SYSIN DD egstate.c
3064: echo egcw.c 1>&2
3065: sed 's/.//' >egcw.c <<'//GO.SYSIN DD egcw.c'
3066: -#include "re.h"
3067: -#include "lre.h"
3068: -#include "hdr.h"
3069: -
3070: -static altlist(Expr*, unsigned char *);
3071: -static word(Expr*, unsigned char*);
3072: -static re_cw *pat;
3073: -
3074: -re_cw *
3075: -re_recw(re_re *r, unsigned char *map)
3076: -{
3077: - unsigned char buf[20000];
3078: - register Expr *e, *root = r->root;
3079: -
3080: - if(root->type != EOP)
3081: - return(0);
3082: - if(root->l->type != Cat)
3083: - return(0);
3084: - if(root->l->l->type != Star)
3085: - return(0);
3086: - if(root->l->l->l->type != Dot)
3087: - return(0);
3088: - e = root->l->r;
3089: - pat = re_cwinit(map);
3090: - if(altlist(e, buf) == 0)
3091: - return(0);
3092: - re_cwcomp(pat);
3093: - return(pat);
3094: -}
3095: -
3096: -static
3097: -altlist(Expr *e, unsigned char *buf)
3098: -{
3099: - if(e->type == Alternate)
3100: - return(altlist(e->l, buf) && altlist(e->r, buf));
3101: - return(word(e, buf));
3102: -}
3103: -
3104: -static unsigned char *p;
3105: -
3106: -static
3107: -word(Expr *e, unsigned char *buf)
3108: -{
3109: - if(buf)
3110: - p = buf;
3111: - if(e->type == Cat){
3112: - if(word(e->l, (unsigned char *)0) == 0)
3113: - return(0);
3114: - if(word(e->r, (unsigned char *)0) == 0)
3115: - return(0);
3116: - } else if(e->type == Literal)
3117: - *p++ = e->lit;
3118: - else
3119: - return(0);
3120: - if(buf)
3121: - re_cwadd(pat, buf, p);
3122: - return(1);
3123: -}
3124: -
3125: //GO.SYSIN DD egcw.c
3126: echo egbr.c 1>&2
3127: sed 's/.//' >egbr.c <<'//GO.SYSIN DD egbr.c'
3128: -#include "re.h"
3129: -#include "lre.h"
3130: -#include "hdr.h"
3131: -
3132: -#define DEBUG
3133: -
3134: -static Br *seq(Expr *);
3135: -static Br *spew(Br_type, Expr*, int);
3136: -
3137: -static Expr *eop;
3138: -
3139: -static char tabs[] = { '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t',
3140: - '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t', 0
3141: -};
3142: -#define SPACE(d) (&tabs[sizeof tabs - (d) - 1])
3143: -
3144: -static void
3145: -init1(register Br *br, re_re *r)
3146: -{
3147: - switch(br->type)
3148: - {
3149: - case br_re:
3150: - br->r = (re_re *)egmalloc(sizeof(re_re), "egbr");
3151: -#ifdef DEBUG
3152: - if(TRACE(3))
3153: - PR "b@%ld->r = %ld\n", br, br->r);
3154: -#endif
3155: - if(!br->r)
3156: - return;
3157: - memcpy((char *)br->r, (char *)r, sizeof(*r));
3158: - if(br->e->type != EOP)
3159: - br->e = eg_newexpr(EOP, '#', br->e, (Expr *)0);
3160: - br->r->root = br->e;
3161: - br->e->id = eop->id;
3162: - br->r->br = br;
3163: - br->r->backref = br->r->root->backref;
3164: - br->r->parens = br->r->root->parens;
3165: - eginit(br->r, br == r->br);
3166: - break;
3167: - case br_star:
3168: - case br_plus:
3169: - case br_quest:
3170: - case br_group:
3171: - init1(br->lb, r);
3172: - break;
3173: - case br_cat:
3174: - case br_alt:
3175: - init1(br->lb, r);
3176: - init1(br->rb, r);
3177: - break;
3178: - }
3179: -}
3180: -
3181: -void
3182: -egbr(re_re *r)
3183: -{
3184: - eop = 0;
3185: -/*
3186: -#ifdef DEBUG
3187: - if(1||TRACE(3)){
3188: - char buf[EPRINTSIZE];
3189: -
3190: - eg_epr(r->root, buf, 0);
3191: - PR "egbr(%s) ->\n", buf);
3192: - eg_brpr(seq(r->root));
3193: - }
3194: -#endif
3195: -/**/
3196: - egcanon(r->root);
3197: - r->br = seq(r->root);
3198: -#ifdef DEBUG
3199: - if(TRACE(3)){
3200: - char buf[EPRINTSIZE];
3201: -
3202: - eg_epr(r->root, buf, 0);
3203: - PR "egbr(%s) ->\n", buf);
3204: - eg_brpr(r->br);
3205: - }
3206: -#endif
3207: - init1(r->br, r);
3208: -}
3209: -
3210: -#ifdef DEBUG
3211: -static void
3212: -brpr1(Br *b, int depth)
3213: -{
3214: - char buf[EPRINTSIZE];
3215: -
3216: - PR "%s%d@", SPACE(depth), (int)b);
3217: - switch(b->type)
3218: - {
3219: - case br_br:
3220: - PR "BR %d\n", b->group);
3221: - break;
3222: - case br_re:
3223: - eg_epr((Expr *)b->e, buf, 0);
3224: - if(((Expr *)b->e)->backref) PR "X");
3225: - if(((Expr *)b->e)->parens) PR "()");
3226: - PR "RE/%s/%d\n", buf, (int)b->r);
3227: - break;
3228: - case br_group:
3229: - PR "GROUP %d\n", b->group);
3230: - brpr1(b->lb, depth+1);
3231: - break;
3232: - case br_quest:
3233: - PR "BR?");
3234: - brpr1(b->lb, depth+1);
3235: - break;
3236: - case br_plus:
3237: - PR "BR+\n");
3238: - brpr1(b->lb, depth+1);
3239: - break;
3240: - case br_star:
3241: - PR "BR*\n");
3242: - brpr1(b->lb, depth+1);
3243: - break;
3244: - case br_cat:
3245: - PR "BR CAT\n");
3246: - brpr1(b->lb, depth+1);
3247: - brpr1(b->rb, depth+1);
3248: - break;
3249: - case br_alt:
3250: - PR "BR |\n");
3251: - brpr1(b->lb, depth+1);
3252: - brpr1(b->rb, depth+1);
3253: - break;
3254: - default:
3255: - PR "BADTYPE/%d/\n", b->type);
3256: - break;
3257: - }
3258: -}
3259: -
3260: -void
3261: -eg_brpr(Br *br)
3262: -{
3263: - brpr1(br, 0);
3264: -}
3265: -#endif
3266: -
3267: -static Br *
3268: -seq(Expr *e)
3269: -{
3270: - Br *br;
3271: -
3272: - if(e->type == EOP)
3273: - eop = e;
3274: - if(!e->backref && !e->parens)
3275: - return(spew(br_re, e, -1));
3276: - switch(e->type)
3277: - {
3278: - case Cat:
3279: - br = spew(br_cat, (Expr *)0, -1);
3280: - br->lb = seq(e->l);
3281: - br->rb = seq(e->r);
3282: - return(br);
3283: - case Alternate:
3284: - br = spew(br_alt, (Expr *)0, -1);
3285: - br->lb = seq(e->l);
3286: - br->rb = seq(e->r);
3287: - return(br);
3288: - case Star:
3289: - br = spew(br_star, (Expr *)0, -1);
3290: - br->lb = seq(e->l);
3291: - return(br);
3292: - case Plus:
3293: - br = spew(br_plus, (Expr *)0, -1);
3294: - br->lb = seq(e->l);
3295: - return(br);
3296: - case Quest:
3297: - br = spew(br_quest, (Expr *)0, -1);
3298: - br->lb = seq(e->l);
3299: - return(br);
3300: - case Group:
3301: - br = spew(br_group, (Expr *)0, e->lit);
3302: - br->lb = seq(e->l);
3303: - return(br);
3304: - case Backref:
3305: - return(spew(br_br, e->l, e->lit));
3306: - case EOP:
3307: - return(seq(e->l));
3308: - default:
3309: - return(spew(br_re, e, -1));
3310: - }
3311: -}
3312: -
3313: -static Br *
3314: -spew(Br_type t, Expr *d, int g)
3315: -{
3316: - Br *b;
3317: -
3318: - b = (Br *)egmalloc(sizeof(Br), "back ref malloc");
3319: - if(!b)
3320: - return(0);
3321: - b->type = t;
3322: - b->e = d;
3323: - b->group = g;
3324: - b->r = 0;
3325: - b->rb = b->lb = 0;
3326: - return(b);
3327: -}
3328: //GO.SYSIN DD egbr.c
3329: echo egerror.c 1>&2
3330: sed 's/.//' >egerror.c <<'//GO.SYSIN DD egerror.c'
3331: -#include <stdio.h>
3332: -#include "re.h"
3333: -
3334: -void
3335: -re_error(char *s)
3336: -{
3337: - fprintf(stderr, "pattern error: %s\n", s);
3338: - exit(1);
3339: - /* NOTREACHED */
3340: -}
3341: //GO.SYSIN DD egerror.c
3342: echo refile.c 1>&2
3343: sed 's/.//' >refile.c <<'//GO.SYSIN DD refile.c'
3344: -#include <string.h>
3345: -#include <stdio.h>
3346: -#if defined(__STDC__) || defined(c_plusplus) || defined(__cplusplus)
3347: -#include <stdlib.h>
3348: -#endif
3349: -#include "re.h"
3350: -
3351: -#ifdef MAIN
3352: -
3353: -main(argc, argv)
3354: - char **argv;
3355: -{
3356: - Expr *re;
3357: - re_re *r;
3358: - char *pat;
3359: - FILE *tmp;
3360: - char *tmpn;
3361: - extern char *tmpnam();
3362: - char e1[4096], e2[4096];
3363: - unsigned char map[256];
3364: - int n;
3365: -
3366: - if(argc != 2){
3367: - fprintf(stderr, "Usage: efile pattern\n");
3368: - exit(1);
3369: - }
3370: - pat = argv[1];
3371: - for(n = 0; n < 256; n++)
3372: - map[n] = n;
3373: - r = re_recomp(pat, pat+strlen(pat), map);
3374: - if(r == 0)
3375: - exit(1);
3376: - re = r->root;
3377: - tmpn = tmpnam((char *)0);
3378: - if((tmp = fopen(tmpn, "w+r")) == NULL){
3379: - perror(tmpn);
3380: - exit(1);
3381: - }
3382: - eg_epr(re, e1, 0);
3383: - re_refile(r, tmp);
3384: - rewind(tmp);
3385: - r = re_filere(tmp);
3386: - eg_epr(r->root, e2, 0);
3387: - if(strcmp(e1, e2))
3388: - printf("MISMATCH!!\nbefore:\n%s\nafter:\n%s\n", e1, e2);
3389: - else
3390: - printf("ok\n");
3391: - re_refree(r);
3392: - exit(0);
3393: -}
3394: -#else
3395: -
3396: -#include "lre.h"
3397: -
3398: -#if defined(__STDC__) || defined(c_plusplus) || defined(__cplusplus)
3399: -static void etofile(Expr *, FILE *);
3400: -static Expr *filetoe(FILE *);
3401: -#else
3402: -static void etofile();
3403: -static Expr *filetoe();
3404: -#endif
3405: -
3406: -#define REVERSION 2
3407: -
3408: -void
3409: -re_refile(re_re *re, FILE *fp)
3410: -{
3411: - if(re == 0)
3412: - return;
3413: - if(putc(REVERSION, fp) != REVERSION){
3414: - re_error("couldn't write version");
3415: - return;
3416: - }
3417: - if(fwrite(re->mymap, 256, 1, fp) != 1){
3418: - re_error("couldn't write char map");
3419: - return;
3420: - }
3421: - putw(re->carat, fp);
3422: - etofile(re->root, fp);
3423: -}
3424: -
3425: -static void
3426: -etofile(Expr *e, FILE *fp)
3427: -{
3428: - Expr ee;
3429: -
3430: - if(e == 0){
3431: - e = ⅇ
3432: - e->type = Null;
3433: - }
3434: - putw(e->type, fp);
3435: - putw(e->lit, fp);
3436: - putc(e->backref, fp);
3437: - putc(e->parens, fp);
3438: - switch(e->type)
3439: - {
3440: - case Null:
3441: - case Literal:
3442: - case Dot:
3443: - case Carat:
3444: - case Dollar:
3445: - case Backref:
3446: - break;
3447: - case Compcharclass:
3448: - case Charclass:
3449: - putw((int)e->l, fp);
3450: - fwrite((char *)e->r, (int)e->l, 1, fp);
3451: - break;
3452: - case Cat:
3453: - case Alternate:
3454: - etofile(e->l, fp);
3455: - etofile(e->r, fp);
3456: - break;
3457: - case Star:
3458: - case Plus:
3459: - case Quest:
3460: - case Group:
3461: - case EOP:
3462: - etofile(e->l, fp);
3463: - break;
3464: - }
3465: -}
3466: -
3467: -re_re *
3468: -re_filere(FILE *fp)
3469: -{
3470: - register re_re *r;
3471: -
3472: - r = (re_re *)egmalloc(sizeof (re_re), "allocating re_re");
3473: - if(r == 0)
3474: - return(0);
3475: - memset((char *)r, 0, sizeof (re_re));
3476: - if(getc(fp) != REVERSION){
3477: - re_error("read bad version number");
3478: - goto err;
3479: - }
3480: - if(fread(r->mymap, 256, 1, fp) != 1){
3481: - re_error("couldn't read char map");
3482: - goto err;
3483: - }
3484: - r->carat = getw(fp);
3485: - eg_lexinit((char *)0, (char *)0);
3486: - if((r->root = filetoe(fp)) == 0){
3487: -err:
3488: - free((char *)r);
3489: - return(0);
3490: - }
3491: - egpost(r);
3492: - if(r->backref || r->parens)
3493: - egbr(r);
3494: - else
3495: - eginit(r, r->carat);
3496: - return(r);
3497: -}
3498: -
3499: -static Expr *
3500: -filetoe(FILE *fp)
3501: -{
3502: - Expr *ee, *er, *el, *ret;
3503: - int t, l;
3504: - Exprtype et;
3505: - char res[256];
3506: - int br, parens;
3507: -
3508: - t = getw(fp);
3509: - if((t == EOF) && feof(fp))
3510: - return(0);
3511: - et = (Exprtype)t;
3512: - l = getw(fp);
3513: - br = getc(fp);
3514: - parens = getc(fp);
3515: - switch(et)
3516: - {
3517: - case Null:
3518: - return(0);
3519: - case Literal:
3520: - case Dot:
3521: - case Carat:
3522: - case Dollar:
3523: - case Backref:
3524: - ret = eg_newexpr(et, l, (Expr *)0, (Expr *)0);
3525: - break;
3526: - case Compcharclass:
3527: - case Charclass:
3528: - ee = eg_newexpr(et, l, (Expr *)0, (Expr *)0);
3529: - l = getw(fp);
3530: - ee->r = (Expr *)egmalloc(l, "filetoe copy");
3531: - if (!ee->r)
3532: - return 0;
3533: - ee->l = (Expr *)l;
3534: - fread((char *)ee->r, l, 1, fp);
3535: - ret = ee;
3536: - break;
3537: - case Cat:
3538: - case Alternate:
3539: - el = filetoe(fp);
3540: - er = filetoe(fp);
3541: - ret = eg_newexpr(et, l, el, er);
3542: - break;
3543: - case Star:
3544: - case Plus:
3545: - case Quest:
3546: - case Group:
3547: - case EOP:
3548: - el = filetoe(fp);
3549: - ret = eg_newexpr(et, l, el, (Expr *)0);
3550: - break;
3551: - default:
3552: - SPR res, "<reading expr undef type %d lit=%d>", t, l);
3553: - re_error(res);
3554: - return((Expr *)0);
3555: - }
3556: - ret->backref = br;
3557: - ret->parens = parens;
3558: - return(ret);
3559: -}
3560: -#endif
3561: //GO.SYSIN DD refile.c
3562: echo egparen.c 1>&2
3563: sed 's/.//' >egparen.c <<'//GO.SYSIN DD egparen.c'
3564: -#include "re.h"
3565: -#include "lre.h"
3566: -#include "hdr.h"
3567: -
3568: -static int egparen(Expr *e);
3569: -
3570: -int
3571: -re_paren(re_re *re)
3572: -{
3573: - return egparen(re->root);
3574: -}
3575: -
3576: -static int
3577: -egparen(Expr *e)
3578: -{
3579: - if(e == 0)
3580: - return(0);
3581: - switch(e->type)
3582: - {
3583: - case Null:
3584: - case Literal:
3585: - case Dot:
3586: - case Carat:
3587: - case Dollar:
3588: - case Backref:
3589: - case Compcharclass:
3590: - case Charclass:
3591: - break;
3592: - case Cat:
3593: - case Alternate:
3594: - return(egparen(e->l)+egparen(e->r));
3595: - case Star:
3596: - case Plus:
3597: - case Quest:
3598: - case EOP:
3599: - return(egparen(e->l));
3600: - case Group:
3601: - return(1+egparen(e->l));
3602: - }
3603: - return(0);
3604: -}
3605: //GO.SYSIN DD egparen.c
3606: echo egmatch.c 1>&2
3607: sed 's/.//' >egmatch.c <<'//GO.SYSIN DD egmatch.c'
3608: -#include "re.h"
3609: -#include "lre.h"
3610: -#include "hdr.h"
3611: -
3612: -#define DEBUG
3613: -
3614: -static unsigned char *eg_slowmatch(Br *, unsigned char *, unsigned char *, int);
3615: -static unsigned char *wholeb, *wholee;
3616: -static unsigned char *start[10];
3617: -static int len[10];
3618: -static void undobr(Br *); /* undo group assignements */
3619: -
3620: -eg_match(register re_re *r, register unsigned char *b, register unsigned char *e, unsigned char **rb, unsigned char **re)
3621: -{
3622: - int i, ret;
3623: -
3624: -#ifdef DEBUG
3625: - if(TRACE(2)){
3626: - PR "eg_match(%d->%d, %d, %d)\n", (int)r, (int)r->br, (int)b, (int)e);
3627: - if(r->br)
3628: - eg_brpr(r->br);
3629: - }
3630: -#endif
3631: - if((rb == 0) != (re == 0)){
3632: - re_error("must supply both or none of group pointers");
3633: - return(0);
3634: - }
3635: - if(r->backref || r->parens || rb){
3636: - wholeb = e;
3637: - for(i = 1; i < 10; i++)
3638: - start[i] = 0;
3639: - if(r->br == 0)
3640: - egbr(r);
3641: - ret = (wholee = eg_slowmatch(r->br, b, e, RE_BEG|RE_END)) != 0;
3642: - if(rb && ret){
3643: - rb[0] = wholeb;
3644: - re[0] = wholee;
3645: - for(i = 1; i < 10; i++){
3646: - rb[i] = start[i];
3647: - re[i] = rb[i]+len[i];
3648: - }
3649: -#ifdef DEBUG
3650: - if(TRACE(1)){
3651: - PR "eg_match groups:");
3652: - for(i = 0; i < 10; i++)
3653: - if(rb[i])PR " %d: %d@%d", i, rb[i], re[i]-rb[i]);
3654: - PR "\n");
3655: - }
3656: -#endif
3657: - }
3658: -#ifdef DEBUG
3659: - else {
3660: - if(TRACE(1)){
3661: - PR "eg_match groups: [%d - %d]\n", wholeb, wholee);
3662: - for(i = 1; i < 10; i++)
3663: - if(start[i])PR " %d: %d@%d", i, start[i], len[i]);
3664: - PR "\n");
3665: - }
3666: - }
3667: -#endif
3668: - } else
3669: - ret = eg_quickmatch(r, b, e, RE_BEG|RE_END) != 0;
3670: - return(ret);
3671: -}
3672: -
3673: -static unsigned char *
3674: -eg_slowmatch(Br *br, unsigned char *b, unsigned char *e, int endpts)
3675: -{
3676: - int i;
3677: - unsigned char *me, *end;
3678: - unsigned char *beg, *lbeg, *llbeg, *rbeg, *rend, *lm, *rm;
3679: -#ifdef DEBUG
3680: - char buf[EPRINTSIZE];
3681: - static id = 1;
3682: - int myid = id++;
3683: -#endif
3684: -
3685: -#define BOFF(x) ((x)? (endpts&~RE_BEG):endpts)
3686: -#define EOFF(x) ((x)? (endpts&~RE_END):endpts)
3687: -
3688: - if(br == 0) /* nothing to match - we won! */
3689: - return(b);
3690: -#ifdef DEBUG
3691: - if(TRACE(3))
3692: - PR "slowmatch(br=%d, [b,e]=%d,%d id=%d, endpt=%d)\n", br, b, e, myid, endpts);
3693: -#endif
3694: - switch(br->type)
3695: - {
3696: - case br_br:
3697: - i = br->group;
3698: -#ifdef DEBUG
3699: - if(TRACE(3))
3700: - PR "br[%d]: %d,%d b=%d,e=%d\n", i, (int)start[i], len[i], b, e);
3701: -#endif
3702: - if(start[i] == 0)
3703: - return(0);
3704: - if((len[i] > e-b) || memcmp((char *)b, (char *)start[i], len[i]))
3705: - return(0);
3706: - if(wholeb > b) wholeb = b;
3707: -#ifdef DEBUG
3708: - if(TRACE(3))
3709: - PR "br[%d]: matched\n", i);
3710: -#endif
3711: - return(b+len[i]);
3712: -
3713: - case br_re:
3714: -#ifdef DEBUG
3715: - if(TRACE(3)){
3716: - eg_epr(br->e, buf, 0);
3717: - PR "matching RE(%s)@%d against '", buf, br->r);
3718: - WR((char *)b, e-b);
3719: - PR "' id=%d\n", myid);
3720: - }
3721: -#endif
3722: - if((me = eg_lquickmatch(br->r, b, e, endpts)) == 0)
3723: - return(0);
3724: -#ifdef DEBUG
3725: - if(TRACE(3)){
3726: - PR "--%s matched '", buf);
3727: - WR((char *)b, me-b);
3728: - PR "'[%d %d] id=%d\n", (int)b, (int)me, myid);
3729: - }
3730: -#endif
3731: - if(wholeb > b)
3732: - wholeb = b;
3733: - return(me);
3734: -
3735: - case br_group:
3736: -#ifdef DEBUG
3737: - if(TRACE(3)){
3738: - PR "matching GROUP%d against '", br->group);
3739: - WR((char *)b, e-b);
3740: - PR "' id=%d\n", myid);
3741: - }
3742: -#endif
3743: - if((me = eg_slowmatch(br->lb, b, e, endpts)) == 0){
3744: - undobr(br->lb);
3745: - return(0);
3746: - }
3747: -#ifdef DEBUG
3748: - if(TRACE(3)){
3749: - PR "--G%d matched '", br->group);
3750: - WR((char *)b, me-b);
3751: - PR "'[%d %d]\n", (int)b, (int)me);
3752: - }
3753: -#endif
3754: - if(wholeb > b)
3755: - wholeb = b;
3756: - start[br->group] = b;
3757: - len[br->group] = me-b;
3758: - return(me);
3759: -
3760: - case br_quest:
3761: -#ifdef DEBUG
3762: - if(TRACE(3)){
3763: - PR "matching BR? against '", buf);
3764: - WR((char *)b, e-b);
3765: - PR "'\n");
3766: - }
3767: -#endif
3768: - if(lbeg = eg_slowmatch(br->lb, b, e, endpts)){
3769: - return(lbeg);
3770: - }
3771: - undobr(br->lb);
3772: - return(b);
3773: -
3774: - case br_plus:
3775: -#ifdef DEBUG
3776: - if(TRACE(3)){
3777: - PR "matching BR+ against '", buf);
3778: - WR((char *)b, e-b);
3779: - PR "' id=%d\n", myid);
3780: - }
3781: -#endif
3782: - if((lbeg = eg_slowmatch(br->lb, b, e, endpts)) == 0){
3783: - undobr(br->lb);
3784: - return(0);
3785: - }
3786: - llbeg = b;
3787: - while(beg = eg_slowmatch(br->lb, lbeg, e, BOFF(lbeg != b))){
3788: - llbeg = lbeg, lbeg = beg;
3789: - }
3790: -#ifdef DEBUG
3791: - if(TRACE(3)){
3792: - PR "--+ matched [%d %d]'", (int)llbeg, (int)lbeg);
3793: - WR((char *)llbeg, lbeg-llbeg);
3794: - PR "' id=%d\n", myid);
3795: - }
3796: -#endif
3797: - return(eg_slowmatch(br->lb, llbeg, e, BOFF(llbeg != b)));
3798: -
3799: - case br_star:
3800: -#ifdef DEBUG
3801: - if(TRACE(3)){
3802: - PR "matching BR* against '", buf);
3803: - WR((char *)b, e-b);
3804: - PR "'\n");
3805: - }
3806: -#endif
3807: - llbeg = lbeg = b;
3808: - while(beg = eg_slowmatch(br->lb, lbeg, e, BOFF(lbeg != b)))
3809: - llbeg = lbeg, lbeg = beg;
3810: -#ifdef DEBUG
3811: - if(TRACE(3)){
3812: - PR "--* matched '");
3813: - WR((char *)lbeg, lbeg-llbeg);
3814: - PR "'[%d %d]\n", (int)llbeg, (int)lbeg);
3815: - }
3816: -#endif
3817: - if(beg = eg_slowmatch(br->lb, llbeg, e, BOFF(llbeg != b)))
3818: - return(beg);
3819: - undobr(br->lb);
3820: - return(b);
3821: -
3822: - case br_cat:
3823: -#ifdef DEBUG
3824: - if(TRACE(3)){
3825: - PR "matching BRcat against '", buf);
3826: - WR((char *)b, e-b);
3827: - PR "' id=%d\n", myid);
3828: - }
3829: -#endif
3830: - /*
3831: - this is not so hard.
3832: - we try all possible matches of the left half,
3833: - and record the match that gave the longest
3834: - valid match on the right half
3835: - */
3836: - rend = 0;
3837: - for(end = e; b <= e; e = beg-1){
3838: - if((beg = eg_slowmatch(br->lb, b, e, EOFF(e != end))) == 0){
3839: - break;
3840: - }
3841: -#ifdef DEBUG
3842: - if(TRACE(3)){
3843: - PR "--cat matched '");
3844: - WR((char *)b, beg-b);
3845: - PR "'[%d %d] id=%d\n", (int)b, (int)beg, myid);
3846: - }
3847: -#endif
3848: - if((me = eg_slowmatch(br->rb, beg, end, BOFF(beg != b))) == 0){
3849: - continue; /* no match of right half */
3850: - }
3851: -#ifdef DEBUG
3852: - if(TRACE(3)){
3853: - PR "----cat matched '");
3854: - WR((char *)b, beg-b);
3855: - PR "'[%d %d] id=%d\n", (int)b, (int)beg, myid);
3856: - }
3857: -#endif
3858: - if(me > rend){
3859: - rend = me;
3860: - rbeg = beg;
3861: -#ifdef DEBUG
3862: - if(TRACE(3)){
3863: - PR "--++-- cat new max rb=%d re=%d\n", (int)rbeg, (int)rend);
3864: - }
3865: -#endif
3866: - }
3867: - }
3868: - if(rend == 0){
3869: - undobr(br->lb);
3870: - undobr(br->rb);
3871: - return(0);
3872: - }
3873: - (void)eg_slowmatch(br->lb, b, rbeg, EOFF(rbeg != end));
3874: - return(eg_slowmatch(br->rb, rbeg, end, BOFF(rbeg != b)));
3875: -
3876: - case br_alt:
3877: -#ifdef DEBUG
3878: - if(TRACE(3)){
3879: - PR "matching BR| against '", buf);
3880: - WR((char *)b, e-b);
3881: - PR "'\n");
3882: - }
3883: -#endif
3884: - if(lm = eg_slowmatch(br->lb, b, e, endpts)){
3885: -#ifdef DEBUG
3886: - if(TRACE(3)){
3887: - PR "--|L matched '");
3888: - WR((char *)b, lm-b);
3889: - PR "'[%d %d]\n", (int)b, (int)lm);
3890: - }
3891: -#endif
3892: - }
3893: - if(rm = eg_slowmatch(br->rb, b, e, endpts)){
3894: -#ifdef DEBUG
3895: - if(TRACE(3)){
3896: - PR "--|R matched '");
3897: - WR((char *)b, rm-b);
3898: - PR "'[%d %d]\n", (int)b, (int)rm);
3899: - }
3900: -#endif
3901: - }
3902: - if(lm > rm){
3903: - undobr(br->rb);
3904: - return(eg_slowmatch(br->lb, b, e, endpts));
3905: - } else {
3906: - if(rm == 0){
3907: - undobr(br->lb);
3908: - undobr(br->rb);
3909: - return(0);
3910: - } else {
3911: - undobr(br->lb);
3912: - return(beg);
3913: - }
3914: - }
3915: - }
3916: - abort();
3917: - return(0);
3918: -}
3919: -
3920: -static void
3921: -undobr(register Br *br)
3922: -{
3923: - switch(br->type)
3924: - {
3925: - case br_group:
3926: - start[br->group] = 0;
3927: - undobr(br->lb);
3928: - break;
3929: - case br_star:
3930: - case br_plus:
3931: - case br_quest:
3932: - undobr(br->lb);
3933: - break;
3934: - case br_cat:
3935: - case br_alt:
3936: - undobr(br->lb);
3937: - undobr(br->rb);
3938: - break;
3939: - }
3940: -}
3941: //GO.SYSIN DD egmatch.c
3942: echo egcanon.c 1>&2
3943: sed 's/.//' >egcanon.c <<'//GO.SYSIN DD egcanon.c'
3944: -#include "re.h"
3945: -#include "lre.h"
3946: -#include "hdr.h"
3947: -
3948: -#define DEBUG
3949: -
3950: -static Expr **proot;
3951: -
3952: -#define PURE(e) (!(e)->backref && !(e)->parens)
3953: -#define PROC(kid) if(ee = proc(kid)){ ee->parent = (kid)->parent; free((char *)kid); kid = ee; }
3954: -
3955: -static Expr *
3956: -proc(Expr *e)
3957: -{
3958: - Expr *ee;
3959: -
3960: - if(e->type == Cat){
3961: - if(PURE(e->l)){
3962: - if(proot){
3963: - *proot = eg_newexpr(Cat, 0, *proot, e->l);
3964: - return((ee = proc(e->r))? ee:e->r);
3965: - } else
3966: - proot = &e->l;
3967: - } else {
3968: - PROC(e->l)
3969: - }
3970: - if(PURE(e->r)){
3971: - if(proot){
3972: - *proot = eg_newexpr(Cat, 0, *proot, e->r);
3973: - return(e->l);
3974: - } else
3975: - proot = &e->r;
3976: - } else {
3977: - PROC(e->r)
3978: - }
3979: - return(0);
3980: - }
3981: - proot = 0;
3982: - switch(e->type)
3983: - {
3984: - case Alternate:
3985: - PROC(e->l)
3986: - proot = 0;
3987: - PROC(e->r)
3988: - break;
3989: - case Star:
3990: - case Plus:
3991: - case Quest:
3992: - case EOP:
3993: - case Group:
3994: - PROC(e->l)
3995: - break;
3996: - }
3997: - proot = 0;
3998: - return(0);
3999: -}
4000: -
4001: -void
4002: -egcanon(Expr *e)
4003: -{
4004: -#ifdef DEBUG
4005: - char before[EPRINTSIZE], after[EPRINTSIZE];
4006: -#endif
4007: -
4008: -#ifdef DEBUG
4009: - eg_epr(e, before, 0);
4010: - if(TRACE(3)){
4011: - PR "egcanon(%s):\n", before);
4012: - }
4013: -#endif
4014: - proot = 0;
4015: - if(!PURE(e))
4016: - proc(e);
4017: -#ifdef DEBUG
4018: - eg_epr(e, after, 0);
4019: - if(TRACE(3)){
4020: - PR "egcanon returns %s\n", after);
4021: - }
4022: - if(strcmp(before, after)){
4023: - EPR "URK! egcanon did not preserve!\nbefore=%s\n after=%s\n", before, after);
4024: - exit(1);
4025: - }
4026: -#endif
4027: -}
4028: //GO.SYSIN DD egcanon.c
4029: echo hdr.h 1>&2
4030: sed 's/.//' >hdr.h <<'//GO.SYSIN DD hdr.h'
4031: -#ifdef MAIN
4032: -#define EXTERN
4033: -#else
4034: -#define EXTERN extern
4035: -#endif
4036: -
4037: -#include "io.h"
4038: -#include <setjmp.h>
4039: -
4040: -EXTERN int ifd;
4041: -
4042: -EXTERN long lnum;
4043: -EXTERN long nbytes;
4044: -EXTERN long noverflow;
4045: -EXTERN int bflag;
4046: -EXTERN int cflag;
4047: -EXTERN int hflag;
4048: -EXTERN int iflag;
4049: -EXTERN int lflag;
4050: -EXTERN int Lflag;
4051: -EXTERN int nflag;
4052: -EXTERN int oneflag;
4053: -EXTERN int sflag;
4054: -EXTERN int vflag;
4055: -EXTERN int xflag;
4056: -EXTERN long nmatch;
4057: -EXTERN char *progname;
4058: -EXTERN char *curfile;
4059: -EXTERN int prname;
4060: -EXTERN int offsetunit;
4061: -EXTERN jmp_buf env;
4062: -EXTERN int longlinewarned;
4063: -
4064: -extern char *optarg;
4065: -extern int optind;
4066: -extern int getopt(int, char**, char*);
4067: -extern void *memcpy(void*, const void*, int);
4068: -#ifndef MEMMOVE
4069: -#define memmove(to, from, n) memcpy(to, from, n)
4070: -#else
4071: -extern void *memmove(void*, const void*, int);
4072: -#endif
4073: -extern void *memchr(void*, int, int);
4074: -extern char *memset(void*, int, int);
4075: -extern int memcmp(void*, void*, int);
4076: -extern int strlen(char *);
4077: -extern int strcmp(char *, char *);
4078: -extern char *strchr(char *, int);
4079: -extern char *strrchr(char *, int);
4080: -extern void *calloc(int, int);
4081: -extern void free(void*);
4082: -extern void *malloc(int);
4083: -extern void *realloc(void*, int);
4084: -extern int open(char *, int, ...);
4085: -extern int read(int, char*, unsigned);
4086: -extern int close(int);
4087: -extern int tolower(int);
4088: -extern void abort(void);
4089: -extern void perror(char*);
4090: -extern void exit(int);
4091: -
4092: -typedef void (*SUCCFN)(char*,char*);
4093: -extern void count(char *, char *); /* updates lnum,nbytes */
4094: -extern void count_m(char *, char *); /* updates lnum,nbytes */
4095: -extern int cwxrd(char**,char**);
4096: -extern int cwxmatch(char**,char**);
4097: -extern int bmxmatch(char**,char**); /* variants for -x for cw/bm */
4098: -extern void dogre(Parsetype, char*, char*, unsigned char*, PROCFN*, void**, RDFN*, MATCHFN*);
4099: -extern void dofgrep(char*, char*, unsigned char*, PROCFN*, void**, RDFN*, MATCHFN*);
4100: -extern re_re *egprep(enum Parsetype, unsigned char*, unsigned char*, unsigned char*, int);
4101: -extern int greprd(char**, char**);
4102: -extern int grepmatch(char**, char**); /* normal arguments to *find */
4103: -extern void inc(char*, char*);
4104: -extern void inc_m(char*, char*); /* increments nmatch */
4105: -extern void null(char*, char*); /* does nothing */
4106: -extern void oneshot(char*, char*); /* increments nmatch, does the longjmp */
4107: -extern void pr(char*, char*);
4108: -extern void pr_m(char*, char*);
4109: -extern int re_lit(re_re*, unsigned char**, unsigned char**);
4110: -
4111: -EXTERN SUCCFN succfn, failfn, succ2fn;
4112: -EXTERN re_re *globre; /* the current re */
4113: -
4114: -#define MAXLINE 65536
4115: -
4116: -#ifdef c_plusplus
4117: -#define UNUSED
4118: -#define UNUSED2
4119: -#else
4120: -#ifdef __cplusplus
4121: -#define UNUSED
4122: -#define UNUSED2
4123: -#else
4124: -#define UNUSED unused
4125: -#define UNUSED2 unused2
4126: -#endif
4127: -#endif
4128: //GO.SYSIN DD hdr.h
4129: echo io.h 1>&2
4130: sed 's/.//' >io.h <<'//GO.SYSIN DD io.h'
4131: -#ifndef EPR
4132: -
4133: -#ifdef USE_STDIO
4134: -#define PR printf(
4135: -#define EPR fprintf(stderr,
4136: -#define SPR sprintf(
4137: -#define WR(b,n) fwrite(b, 1, n, stdout)
4138: -#define FLUSH fflush(stdout)
4139: -#else
4140: -#include <fio.h>
4141: -extern int fprint(int, char*, ...);
4142: -extern int sprint(char*, char*, ...);
4143: -
4144: -#define PR fprint(1,
4145: -#define EPR fprint(2,
4146: -#define SPR sprint(
4147: -#define WR(b,n) write(1, b, (long)(n))
4148: -#define FLUSH Fflush(1)
4149: -#endif
4150: -
4151: -#endif
4152: //GO.SYSIN DD io.h
4153: echo re.h 1>&2
4154: sed 's/.//' >re.h <<'//GO.SYSIN DD re.h'
4155: -#ifndef RE_H
4156: -#define RE_H
4157: -
4158: -# if defined(__cplusplus)
4159: -extern "C" { /* C++ 2.0 */
4160: -# endif
4161: -
4162: -typedef struct re_bm
4163: -{
4164: - int delta0[256], *delta2;
4165: - unsigned char cmap[256];
4166: - char *bmpat;
4167: - int patlen;
4168: -} re_bm;
4169: -
4170: -typedef struct re_cw
4171: -{
4172: - int maxdepth, mindepth;
4173: - char seenerror; /* set if we called re_error */
4174: - long nodeid;
4175: - int step[256];
4176: - unsigned char map[256];
4177: - struct Node *root;
4178: -} re_cw;
4179: -
4180: -typedef enum
4181: -{
4182: - Literal, Dot, Carat, Dollar, Charclass, Compcharclass, /* 0-5 */
4183: - Cat, Alternate, Star, Plus, Quest, Backref, Group, EOP, /* 6-13 */
4184: - /* not in grammar, just helping */
4185: - Lpar, Rpar, Backslash, Null
4186: -} Exprtype;
4187: -
4188: -typedef struct Expr
4189: -{
4190: - Exprtype type;
4191: - char reallit; /* just for dollar and -G, dammit! */
4192: - char backref; /* backref used here or below */
4193: - char parens; /* parens used here or below */
4194: - char seenerror; /* set if we called re_error */
4195: - int id;
4196: - unsigned int lit;
4197: - long flen;
4198: - int *follow;
4199: - struct Expr *l, *r, *parent;
4200: -} Expr;
4201: -typedef enum Parsetype { greparse, grepparse, egrepparse } Parsetype;
4202: -
4203: -#define RE_DOLLAR 256
4204: -#define RE_CARAT 257
4205: -#define RE_HIGH 258 /* always 1+last constant */
4206: -
4207: -typedef struct State
4208: -{
4209: - struct State *tab[RE_HIGH];
4210: - char out; /* matched */
4211: - char init; /* inital state */
4212: - long npos;
4213: - int pos; /* index into posbase */
4214: -} State;
4215: -
4216: -typedef struct Positionset
4217: -{
4218: - long count;
4219: - int last;
4220: - int *base;
4221: -} Positionset;
4222: -
4223: -typedef enum {
4224: - br_re, br_group, br_br, br_cat, br_alt, br_star, br_plus, br_quest
4225: -} Br_type;
4226: -
4227: -typedef struct Br
4228: -{
4229: - Br_type type;
4230: - Expr *e;
4231: - int group;
4232: - struct re_re *r;
4233: - struct Br *lb, *rb;
4234: -} Br;
4235: -
4236: -typedef struct re_re
4237: -{
4238: - int *posbase;
4239: - int nposalloc, posnext, posreset;
4240: - int maxid;
4241: - Expr *root;
4242: - Expr **ptr;
4243: - unsigned char mymap[256];
4244: - Positionset firstpos, begin, tmp;
4245: - int nstates, statelim;
4246: - State *states;
4247: - State istate;
4248: - int initialstate;
4249: - int carat;
4250: - int flushed;
4251: - int threshhold; /* resize cache every threshhold flushes */
4252: - int backref;
4253: - int parens;
4254: - Br *br;
4255: -} re_re;
4256: -
4257: -/*
4258: - matching routine endpoint markers
4259: -*/
4260: -#define RE_BEG 1 /* beginning matches ^ */
4261: -#define RE_END 2 /* end matches $ */
4262: -
4263: -# ifdef USE_STDIO
4264: -# include <stdio.h>
4265: -# if defined(__STDC__) || defined(c_plusplus) || defined(__cplusplus)
4266: -extern void re_refile(re_re*, FILE*);
4267: -extern re_re *re_filere(FILE*);
4268: -# else
4269: -extern void re_refile();
4270: -extern re_re *re_filere();
4271: -# endif
4272: -# endif /* USE_STDIO */
4273: -
4274: -# if defined(__STDC__) || defined(c_plusplus) || defined(__cplusplus)
4275: -# define VOID void
4276: -typedef int (*RDFN)(char**, char**);
4277: -typedef int (*MATCHFN)(char**,char**);
4278: -typedef int (*PROCFN)(VOID*, RDFN, MATCHFN);
4279: -extern re_bm *re_bmcomp(char*, char*, unsigned char*);
4280: -extern int re_bmexec(VOID*, RDFN, MATCHFN);
4281: -extern void re_bmfree(re_bm*);
4282: -extern void re_cwadd(re_cw*, unsigned char*, unsigned char*);
4283: -extern void re_cwcomp(re_cw*);
4284: -extern int re_cwexec(VOID*, RDFN, MATCHFN);
4285: -extern void re_cwfree(re_cw*);
4286: -extern re_cw *re_cwinit(unsigned char*);
4287: -extern void re_error(char*);
4288: -extern int re_paren(re_re *e);
4289: -extern re_re *re_recomp(char*, char*, unsigned char*);
4290: -extern re_cw *re_recw(re_re*, unsigned char*);
4291: -extern int re_reexec(re_re*, char*, char*, char*[10][2]);
4292: -extern void re_refree(re_re*);
4293: -#else
4294: -# define VOID char
4295: -typedef int (*RDFN)();
4296: -typedef int (*MATCHFN)();
4297: -typedef int (*PROCFN)();
4298: -extern re_bm *re_bmcomp();
4299: -extern int re_bmexec();
4300: -extern void re_bmfree();
4301: -extern void re_cwadd();
4302: -extern void re_cwcomp();
4303: -extern int re_cwexec();
4304: -extern void re_cwfree();
4305: -extern re_cw *re_cwinit();
4306: -extern void re_error();
4307: -extern int re_paren();
4308: -extern re_re *re_recomp();
4309: -extern re_cw *re_recw();
4310: -extern int re_reexec();
4311: -extern void re_refree();
4312: -# endif
4313: -
4314: -# if defined(__cplusplus)
4315: -} /* C++ 2.0 */
4316: -# endif
4317: -#endif
4318: //GO.SYSIN DD re.h
4319: echo lre.h 1>&2
4320: sed 's/.//' >lre.h <<'//GO.SYSIN DD lre.h'
4321: -#ifndef LRE_H
4322: -#define LRE_H
4323: -
4324: -# if defined(__cplusplus)
4325: -extern "C" { /* C++ 2.0 */
4326: -# endif
4327: -
4328: -#include "io.h"
4329: -
4330: -#ifndef MEMMOVE
4331: -#define memmove(to, from, n) memcpy(to, from, n)
4332: -#endif
4333: -
4334: -#define TRACE(n) (n < re_debug)
4335: -#define EPRINTSIZE 32767
4336: -extern int re_debug;
4337: -
4338: -# if defined(__STDC__) || defined(c_plusplus) || defined(__cplusplus)
4339: -extern void eg_clrstates(re_re*);
4340: -extern Expr *eg_eall(enum Parsetype, unsigned char*);
4341: -extern void egbr(re_re*);
4342: -extern int egdfabr(re_re*, unsigned char*, unsigned char*, unsigned char**, unsigned char**);
4343: -extern int eg_match(re_re*, unsigned char*, unsigned char*, unsigned char**, unsigned char**);
4344: -extern void eginit(re_re*, int);
4345: -extern void *egmalloc(int, char*);
4346: -extern void egpost(re_re*);
4347: -extern void egcanon(Expr *);
4348: -extern re_re *egprep(enum Parsetype, unsigned char*, unsigned char*, unsigned char*, int);
4349: -extern void *egrealloc(char*, int, char*);
4350: -extern void eg_epr(Expr*, char*, int);
4351: -extern void eg_brpr(Br *);
4352: -extern int eg_getstate(re_re*);
4353: -extern void eg_lexinit(char*, char*);
4354: -extern void eg_lex(void);
4355: -extern Expr *eg_newexpr(Exprtype, int, Expr*, Expr*);
4356: -extern int eg_posalloc(re_re*, int);
4357: -extern void eg_posinit(re_re*);
4358: -extern void eg_posset(re_re*);
4359: -State *eg_startstate(re_re*);
4360: -State *eg_stateof(re_re*, Positionset*);
4361: -extern void eg_savestate(re_re*, State*);
4362: -extern void eg_spr(long, int*, char*);
4363: -extern void eg_stateinit(re_re*);
4364: -extern unsigned char *eg_quickmatch(re_re *, unsigned char *, unsigned char *, int);
4365: -extern unsigned char *eg_lquickmatch(re_re *, unsigned char *, unsigned char *, int);
4366: -#else
4367: -extern void clrstates();
4368: -extern Expr *eg_eall();
4369: -extern void egbr();
4370: -extern int egdfabr();
4371: -extern int eg_match();
4372: -extern void eginit();
4373: -extern char *egmalloc();
4374: -extern void egpost();
4375: -extern void egcanon();
4376: -extern re_re *egprep();
4377: -extern char *egrealloc();
4378: -extern void eg_epr();
4379: -extern void eg_brpr();
4380: -extern int eg_getstate();
4381: -extern void eg_lex();
4382: -extern void eg_lexinit();
4383: -extern Expr *eg_newexpr();
4384: -extern int eg_posalloc();
4385: -extern void eg_posinit();
4386: -extern void eg_posset();
4387: -extern void eg_savestate();
4388: -extern void eg_spr();
4389: -extern State *eg_startstate();
4390: -extern void eg_stateinit();
4391: -extern State *eg_stateof();
4392: -extern unsigned char *eg_quickmatch();
4393: -extern unsigned char *eg_lquickmatch();
4394: -# endif
4395: -
4396: -# if defined(__cplusplus)
4397: -} /* C++ 2.0 */
4398: -# endif
4399: -#endif
4400: //GO.SYSIN DD lre.h
4401: echo libc.h 1>&2
4402: sed 's/.//' >libc.h <<'//GO.SYSIN DD libc.h'
4403: -/* system calls */
4404: -extern unsigned alarm();
4405: -extern void nap(), pause();
4406: -extern char *sbrk();
4407: -extern void exit(), _exit();
4408: -extern long lseek();
4409: -extern void nice();
4410: -extern void profil();
4411: -extern unsigned long settod();
4412: -extern void sync();
4413: -extern long time();
4414: -
4415: -/* libc et al */
4416: -extern long lcm();
4417: -extern double atof(), strtod();
4418: -extern long atol();
4419: -extern char *crypt();
4420: -extern char *ctime();
4421: -extern char *ecvt(), *fcvt(), *gcvt();
4422: -extern char *galloc();
4423: -extern char *getenv();
4424: -extern char *getlogin();
4425: -extern char *getpass();
4426: -extern char *getwd(), *getcwd();
4427: -extern char *malloc(), *realloc(), *calloc();
4428: -extern char *memcpy(), *memchr(), *memccpy(), *memset(), *memmove();
4429: -extern char *mktemp();
4430: -extern double frand();
4431: -extern char *setfields();
4432: -extern char *strcpy(), *strncpy(), *strcat(), *strncat(), *strchr(), *strrchr();
4433: -extern char *strpbrk(), *strtok(), *strdup();
4434: -extern int atoi();
4435: -extern char *tgetstr(), tgoto();
4436: -extern char *ttyname(), *cttyname();
4437: -
4438: -#define NONEXIT 33
4439: //GO.SYSIN DD libc.h
4440: echo getopt.c 1>&2
4441: sed 's/.//' >getopt.c <<'//GO.SYSIN DD getopt.c'
4442: -#include "re.h"
4443: -#include "lre.h"
4444: -#include "hdr.h"
4445: -
4446: -#define ERR(str, chr) if(opterr){fprint(2, "%s%s%c\n", argv[0], str, chr);}
4447: -#define EOF -1
4448: -#define NULL 0
4449: -int opterr = 1;
4450: -int optind = 1;
4451: -int optopt;
4452: -char *optarg;
4453: -
4454: -int
4455: -getopt(int argc, char **argv, char *opts)
4456: -{
4457: - static int sp = 1;
4458: - register c;
4459: - register char *cp;
4460: -
4461: - if (sp == 1)
4462: - if (optind >= argc ||
4463: - argv[optind][0] != '-' || argv[optind][1] == '\0')
4464: - return EOF;
4465: - else if (strcmp(argv[optind], "--") == NULL) {
4466: - optind++;
4467: - return EOF;
4468: - }
4469: - optopt = c = argv[optind][sp];
4470: - if (c == ':' || (cp=strchr(opts, c)) == NULL) {
4471: - ERR (": illegal option -- ", c);
4472: - if (argv[optind][++sp] == '\0') {
4473: - optind++;
4474: - sp = 1;
4475: - }
4476: - return '?';
4477: - }
4478: - if (*++cp == ':') {
4479: - if (argv[optind][sp+1] != '\0')
4480: - optarg = &argv[optind++][sp+1];
4481: - else if (++optind >= argc) {
4482: - ERR (": option requires an argument -- ", c);
4483: - sp = 1;
4484: - return '?';
4485: - } else
4486: - optarg = argv[optind++];
4487: - sp = 1;
4488: - } else {
4489: - if (argv[optind][++sp] == '\0') {
4490: - sp = 1;
4491: - optind++;
4492: - }
4493: - optarg = NULL;
4494: - }
4495: - return c;
4496: -}
4497: //GO.SYSIN DD getopt.c
4498: echo regress.d/complex 1>&2
4499: sed 's/.//' >regress.d/complex <<'//GO.SYSIN DD regress.d/complex'
4500: -did=verified
4501: -for i in `ls t*.sh | sed -e 's/.sh$//' | sort +0.1n`
4502: -do
4503: - sh $i.sh > temp
4504: - if cmp -s temp $i.out
4505: - then
4506: - :
4507: - else
4508: - echo "test $i failed"
4509: - fi
4510: - rm temp
4511: - did="$did $i"
4512: -done
4513: -echo "$did"
4514: //GO.SYSIN DD regress.d/complex
4515: echo regress.d/lt0.c 1>&2
4516: sed 's/.//' >regress.d/lt0.c <<'//GO.SYSIN DD regress.d/lt0.c'
4517: -/*
4518: -From pegasus.ATT.COM!hansen Tue Oct 9 00:34 EDT 1990
4519: -Received: by pyxis; Tue Oct 9 00:34 EDT 1990
4520: -FROM: [email protected] (t.l.hansen)
4521: -TO: research!andrew
4522: -DATE: 9 Oct 1990 0:27 EDT
4523: -SUBJECT: bug in re_reexec()!
4524: -
4525: -Compile and link the following program. The expected output is:
4526: -
4527: -parens = 2
4528: -matched
4529: -0: 0x80881430 - 0x80881445
4530: -"!nosuchsystem!testing"
4531: -1: 0x80886334 - 0xc0020c1c
4532: -"nosuchsystem"
4533: -2: 0xc0020a78 - 0x80883924
4534: -"testing"
4535: -
4536: -Instead, I get this. (Note the strings after 1: and 2:.)
4537: -
4538: -parens = 2
4539: -matched
4540: -0: 0x80881430 - 0x80881445
4541: -"!nosuchsystem!testing"
4542: -1: 0x80886334 - 0xc0020c1c
4543: -""
4544: -2: 0xc0020a78 - 0x80883924
4545: -""
4546: -
4547: -Can you please look into this soon? If not, let me know so that I can hunt
4548: -for it. I probably won't be able to find it as quickly as you, though. This
4549: -showed up within mail and I have an MR haunting me. Thanks.
4550: -
4551: - Tony
4552: -
4553: -----------------------------------------------------------------
4554: -*/
4555: -#include <stdio.h>
4556: -#include <ctype.h>
4557: -#include "re.h"
4558: -#include "lre.h"
4559: -
4560: -void prc(c)
4561: -unsigned char c;
4562: -{
4563: - if (c >= 0200)
4564: - {
4565: - (void) printf("M-");
4566: - c -= 0200;
4567: - }
4568: - if (isprint(c)) putchar(c);
4569: - else
4570: - {
4571: - putchar('^');
4572: - putchar(c ^ 0100);
4573: - }
4574: -}
4575: -
4576: -void pr(i, mb, me)
4577: -int i;
4578: -char *mb;
4579: -char *me;
4580: -{
4581: - (void) printf("%d: %#x - %#x\n", i, mb, me);
4582: - putchar('"');
4583: - for (; mb < me; mb++)
4584: - {
4585: - if (!*mb)
4586: - break;
4587: - prc(*mb);
4588: - }
4589: - putchar('"');
4590: - putchar('\n');
4591: -}
4592: -
4593: -main()
4594: -{
4595: - re_re *regex;
4596: - int i;
4597: - unsigned char re_map[256];
4598: - static char lname[] = "!nosuchsystem!testing";
4599: - static char pat[] = "!([^!]+)!(.+)";
4600: - char *match[10][2];
4601: - int parens;
4602: -
4603: - for (i = 0; i < 256; i++)
4604: - re_map[i] = i;
4605: - regex = re_recomp(pat, pat+strlen(pat), re_map);
4606: - parens = re_paren(regex);
4607: - (void) printf("parens = %d\n", parens);
4608: - if (parens != 2)
4609: - return 0;
4610: - if (!re_reexec(regex, lname, lname+strlen(lname), match))
4611: - {
4612: - (void) printf("no match\n");
4613: - return 0;
4614: - }
4615: -
4616: - (void) printf("matched\n");
4617: - for (i = 0; i <= parens; i++)
4618: - pr(i, match[i][0], match[i][1]);
4619: - return 0;
4620: -}
4621: //GO.SYSIN DD regress.d/lt0.c
4622: echo regress.d/makefile 1>&2
4623: sed 's/.//' >regress.d/makefile <<'//GO.SYSIN DD regress.d/makefile'
4624: -GRE=gre
4625: -
4626: -all:
4627: - @echo "checking $(GRE):"
4628: - @GRE=$(GRE) sh simple
4629: - @GRE=$(GRE) sh complex
4630: //GO.SYSIN DD regress.d/makefile
4631: echo regress.d/simple 1>&2
4632: sed 's/.//' >regress.d/simple <<'//GO.SYSIN DD regress.d/simple'
4633: -awk '
4634: -BEGIN {
4635: - sq = "'"'"'"
4636: - FS = "\t"
4637: - gre = "'"$GRE"'"
4638: -}
4639: -NF == 0 {
4640: - next
4641: -}
4642: -$1 != "" { # new test
4643: - re = $1
4644: - if($4 == ""){
4645: - nopts = 1; opts[0] = ""
4646: - } else if(substr($4, 1, 1) == "-"){
4647: - nopts = 1; opts[0] = " " $4
4648: - } else {
4649: - for(nopts = 0; nopts < length($4); nopts++){
4650: - x = substr($4, nopts, 1)
4651: - if(x == "~") opts[nopts] = ""
4652: - else opts[nopts] = " -" x
4653: - }
4654: - }
4655: -}
4656: -$2 != "" { # either ~ or !~
4657: - op = $2
4658: - if (op == "~")
4659: - neg = 0
4660: - else if (op == "!~")
4661: - neg = 1
4662: -}
4663: -$3 != "" { # new test string
4664: - str = $3
4665: -}
4666: -$3 == "\"\"" { # explicit empty line
4667: - $3 = ""
4668: -}
4669: -NF > 2 { # generate a test
4670: - input = $3
4671: - for(i = 0; i < nopts; i++){
4672: - ntests++;
4673: - if(neg){
4674: - printf("if echo %s | %s -s %s; then echo %s%d fails %s %s %s %s%s ;else :; fi\n", sq input sq, gre opts[i], sq re sq, sq, NR, opts[i], re, op, input, sq)
4675: - } else {
4676: - printf("if echo %s | %s -s %s; then :; else echo %s%d fails %s %s %s %s%s ; fi\n", sq input sq, gre opts[i], sq re sq, sq, NR, opts[i], re, op, input, sq)
4677: - }
4678: - }
4679: -}
4680: -END { print "echo " sq ntests " simple tests" sq }
4681: -' > regress.i <<\!!!
4682: -a ~ a
4683: - ba
4684: - bab
4685: - !~ ""
4686: - x
4687: - xxxxx
4688: -. ~ x
4689: - xxx
4690: - !~ ""
4691: -.a ~ xa
4692: - xxa
4693: - xax
4694: - !~ a
4695: - ab
4696: - ""
4697: -$ ~ x
4698: - ""
4699: -.$ ~ x
4700: - !~ ""
4701: -a$ ~ a
4702: - ba
4703: - bbba
4704: - !~ ab
4705: - x
4706: - ""
4707: -^ ~ x
4708: - ""
4709: - ^
4710: -^a$ ~ a
4711: - !~ xa
4712: - ax
4713: - xax
4714: - ""
4715: -^a.$ ~ ax
4716: - aa
4717: - !~ xa
4718: - aaa
4719: - axy
4720: - ""
4721: -^$ ~ ""
4722: - !~ x
4723: - ^
4724: -^.a ~ xa
4725: - xaa
4726: - !~ a
4727: - ""
4728: -^.*a ~ a
4729: - xa
4730: - xxxxxxa
4731: - !~ ""
4732: -^.+a ~ xa
4733: - xxxxxxa
4734: - !~ ""
4735: - a
4736: - ax
4737: -a* ~ ""
4738: - a
4739: - aaaa
4740: - xa
4741: - xxxx
4742: -aa* ~ a
4743: - aaa
4744: - xa
4745: - !~ xxxx
4746: - ""
4747: -\$ ~ x$
4748: - $
4749: - $x
4750: - !~ ""
4751: - x
4752: -\. ~ .
4753: - !~ x
4754: - ""
4755: -.^$ ~ a^ -G
4756: - !~ ""
4757: - a^$
4758: -^x$ ~ x -G
4759: - !~ yx
4760: - xy
4761: -a\$ ~ a$ -G
4762: - !~ a
4763: -\(ab\)$ ~ cab -G
4764: - ab
4765: - !~ ab$
4766: -xr+y ~ xry ~E
4767: - xrry
4768: - xrrrrrry
4769: - !~ ry
4770: - xy
4771: -xr?y ~ xy ~E
4772: - xry
4773: - !~ xrry
4774: -a(bc|def)g ~ abcg ~E
4775: - adefg
4776: - !~ abc
4777: - abg
4778: - adef
4779: - adeg
4780: -[0-9] ~ 1
4781: - 567
4782: - x0y
4783: - !~ abc
4784: - ""
4785: -[^0-9] !~ 1
4786: - 567
4787: - ""
4788: - ~ abc
4789: - x0y
4790: -x[0-9]+y ~ x0y ~E
4791: - x23y
4792: - x12345y
4793: - !~ 0y
4794: - xy
4795: -x[0-9]?y ~ xy ~E
4796: - x1y
4797: - !~ x23y
4798: -X ~ x -i
4799: -read ~ read -x
4800: - !~ xy read
4801: - x read y
4802: - xread
4803: - readx
4804: -read ~ read -xF
4805: - !~ xy read
4806: - x read y
4807: - xread
4808: - readx
4809: -read ~ read -F
4810: - xy read
4811: - x read y
4812: - xread
4813: - readx
4814: -[.]de.. ~ .dexx
4815: - .deyyy
4816: - !~ .de
4817: - .dex
4818: -^|s ~ |sec -G
4819: - !~ sec
4820: -..B ~ CDAB -G
4821: - !~ ABCD
4822: -$.*tt.*\$ ~ $tt$ -G
4823: -^([a-z]+)\1$ ~ vivi
4824: - !~ vivify
4825: -([a-z]+)\1 ~ vivi
4826: - vivify
4827: - revivi
4828: - !~ vovify
4829: - viv
4830: -\(....\).*\1 ~ beriberi -G
4831: -(....).*\1 ~ beriberi
4832: -^$ ~
4833: -^$ ~ -G
4834: -[ab]\{2\}k ~ abk
4835: - xyaak
4836: - zabak
4837: - !~ zad
4838: - bq
4839: - abq
4840: -[ab]\{2,\}d ~ abd
4841: - abababad
4842: - !~ ad
4843: - ababaq
4844: -q[ab]\{2,4\}d ~ qabd
4845: - qababd
4846: - qaaad
4847: - !~ qad
4848: - qababad
4849: -a[]]b ~ a]b -E
4850: -a[]]b ~ a]b -G
4851: -a[^]b]c ~ adc -E
4852: -a[^]b]c ~ adc -G
4853: -angel[^e] ~ angelo -i
4854: - ~ ANGELH
4855: - !~ angel
4856: - ANGEL
4857: - angele
4858: - ANGELE
4859: -^[^-].*> ~ abc> -G
4860: - !~ -a>
4861: -^[A-Z] ~ abc -i
4862: - ABC
4863: -^[^A-Z] !~ abc -i
4864: - ABC
4865: - ~ 123
4866: -|abc ~ |abc -G
4867: - !~ abc
4868: -\(ac*\)c*d[ac]*\1 ~ acdacaaa -G
4869: -(ac*)c*d[ac]*\1 ~ acdacaaa
4870: -ram|am ~ am
4871: -.|.. !~ abc -x
4872: -[a-za-za-za-za-za-za-za-za-za-z] ~ for this line -E
4873: -[a-za-za-za-za-za-za-za-za-za-z] ~ for this line
4874: -[a-za-za-za-za-za-za-za-za-z] ~ but watch out -E
4875: -[a-za-za-za-za-za-za-za-za-z] ~ but watch out
4876: -!!!
4877: -cp regress.i ../temp
4878: -sh < regress.i && rm regress.i
4879: -echo "verified simple"
4880: //GO.SYSIN DD regress.d/simple
4881: echo regress.d/t1.i 1>&2
4882: sed 's/.//' >regress.d/t1.i <<'//GO.SYSIN DD regress.d/t1.i'
4883: -.xxxxxxxxxxx
4884: -.xxxxxxxxxxxxxxxxxxx
4885: -.xxxxxxxxxxxxxxxxxxxxxxxx
4886: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4887: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4888: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4889: -.xxxxxxxxxxxxxxxxxxxxxxxx
4890: -.xxxxxxxxxxxxxxxxxxxxxxxx
4891: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4892: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4893: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4894: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4895: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4896: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4897: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4898: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4899: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxx
4900: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4901: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4902: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4903: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4904: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4905: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4906: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4907: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4908: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4909: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4910: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4911: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4912: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4913: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4914: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4915: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4916: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4917: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4918: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4919: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4920: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4921: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4922: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4923: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4924: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4925: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4926: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4927: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4928: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4929: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4930: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4931: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4932: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4933: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4934: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4935: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4936: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4937: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4938: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4939: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4940: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4941: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4942: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4943: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4944: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4945: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4946: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4947: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4948: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4949: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4950: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4951: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4952: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4953: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4954: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4955: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4956: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxx
4957: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4958: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4959: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4960: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4961: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4962: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4963: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxx
4964: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4965: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4966: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4967: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4968: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4969: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4970: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4971: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4972: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4973: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4974: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4975: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4976: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4977: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4978: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4979: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4980: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4981: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4982: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4983: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4984: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4985: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4986: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4987: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4988: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4989: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4990: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4991: -.xxxxxxxxxxxxxxxxxxxxxxx
4992: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4993: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4994: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4995: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4996: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4997: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4998: -.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4999: //GO.SYSIN DD regress.d/t1.i
5000: echo regress.d/t1.out 1>&2
5001: sed 's/.//' >regress.d/t1.out <<'//GO.SYSIN DD regress.d/t1.out'
5002: //GO.SYSIN DD regress.d/t1.out
5003: echo regress.d/t1.sh 1>&2
5004: sed 's/.//' >regress.d/t1.sh <<'//GO.SYSIN DD regress.d/t1.sh'
5005: -cat t1.i | $GRE -v '^\.x'
5006: //GO.SYSIN DD regress.d/t1.sh
5007: echo regress.d/t10.i 1>&2
5008: sed 's/.//' >regress.d/t10.i <<'//GO.SYSIN DD regress.d/t10.i'
5009: -at
5010: -hematic
5011: //GO.SYSIN DD regress.d/t10.i
5012: echo regress.d/t10.out 1>&2
5013: sed 's/.//' >regress.d/t10.out <<'//GO.SYSIN DD regress.d/t10.out'
5014: //GO.SYSIN DD regress.d/t10.out
5015: echo regress.d/t10.sh 1>&2
5016: sed 's/.//' >regress.d/t10.sh <<'//GO.SYSIN DD regress.d/t10.sh'
5017: -$GRE -xvFf t10.i t10.i
5018: //GO.SYSIN DD regress.d/t10.sh
5019: echo regress.d/t11.i 1>&2
5020: sed 's/.//' >regress.d/t11.i <<'//GO.SYSIN DD regress.d/t11.i'
5021: -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxyz
5022: -abc
5023: //GO.SYSIN DD regress.d/t11.i
5024: echo regress.d/t11.out 1>&2
5025: sed 's/.//' >regress.d/t11.out <<'//GO.SYSIN DD regress.d/t11.out'
5026: -gre: t11.i: warning: line too long (> 500 chars); text skipped
5027: -abc
5028: //GO.SYSIN DD regress.d/t11.out
5029: echo regress.d/t11.sh 1>&2
5030: sed 's/.//' >regress.d/t11.sh <<'//GO.SYSIN DD regress.d/t11.sh'
5031: -$GRE abc t11.i 2>&1
5032: //GO.SYSIN DD regress.d/t11.sh
5033: echo regress.d/t12.i 1>&2
5034: sed 's/.//' >regress.d/t12.i <<'//GO.SYSIN DD regress.d/t12.i'
5035: -AAA n
5036: -AAAS n
5037: -Aaron n
5038: -AAU n
5039: -AAUP d
5040: -AAUW d
5041: -ABA n
5042: -Ababa pc
5043: -aback d
5044: -abacus n
5045: -abaft d
5046: -abalone n
5047: -abandon v,er,va
5048: -abase v,er,va
5049: -abash v,er,va
5050: -abate v,er,va
5051: -abattoir n
5052: -abbe n
5053: -abbess n
5054: -abbey n
5055: -abbot n
5056: -Abbott n
5057: -abbreviate v,ion
5058: -abc n
5059: -abdicate v,ion,va
5060: -abdomen n
5061: -abdominal a
5062: -abduct v,ion
5063: -Abe pc
5064: -abeam d
5065: -abed d
5066: -Abel pc
5067: -Abelian pc
5068: -Abelson n
5069: -Aberdeen pc
5070: -Abernathy n
5071: -aberrant n,a
5072: -aberrate v,ion
5073: -abet v,va,ms
5074: -abettor n
5075: -abeyant a
5076: -abhor v,er,ms
5077: -abhorrent a
5078: -abide v,er
5079: -Abidjan pc
5080: -Abigail pc
5081: -abject a,ion
5082: -abjuration n
5083: -abjure v,er
5084: -ablate v,ion
5085: -ablaut n
5086: -ablaze d
5087: -able v,a,comp,va
5088: -abloom d
5089: -ablution n
5090: -ABM n
5091: -abnegate v,ion
5092: -Abner pc
5093: -abnormal n,a
5094: -aboard d
5095: -abode n
5096: -abolish v,er,va
5097: -abolition n,na
5098: -abolitionary n
5099: -abominable a
5100: -abominate v,ion
5101: -aboriginal n,a
5102: -aborigine n
5103: -aborning d
5104: -abort v,er,ion
5105: -abortifacient n
5106: -abound vi
5107: -about d,nopref
5108: -above d
5109: -aboveboard d
5110: -aboveground d
5111: -abovementioned d
5112: -abracadabra n
5113: -abrade v,er,va
5114: -Abraham n
5115: -Abram n
5116: -Abramson n
5117: -abrasion n,na
5118: -abreact v,ion
5119: -abreast d
5120: -abridge v,er,va
5121: -abridgment n
5122: -abroad d
5123: -abrogate v,ion
5124: -abrupt a,ion
5125: -abscess n,v
5126: -abscissa n
5127: -abscissae d
5128: -abscission n
5129: -abscond v,er
5130: -absent v,a
5131: -absentee n
5132: -absenteeism n
5133: -absentia n
5134: -absentminded a
5135: -absinthe n
5136: -absolute n,a,na
5137: -absolution n
5138: -absolve v,er
5139: -absorb v,er,va
5140: -absorbent a
5141: -absorption n,na
5142: -abstain v,er
5143: -abstemious a
5144: -abstention n
5145: -abstinent a
5146: -abstract n,v,a,er,ion
5147: -abstruse a
5148: -absurd a,na
5149: -abuilding d
5150: -abundant a
5151: -abuse n,v,er,va
5152: -abusive a
5153: -abut v,er,va,ms
5154: -abysmal a
5155: -abyss n
5156: -abyssal a
5157: -Abyssinia pc
5158: -AC d
5159: -acacia n
5160: -academe pc,na
5161: -academia pc
5162: -academic n,na
5163: -academician n
5164: -academy n
5165: -Acadia pc
5166: -acanthus n
5167: -Acapulco pc
5168: -accede v
5169: -accelerando d
5170: -accelerate v,ion
5171: -accelerometer n
5172: -accent n,v,na
5173: -accentual a
5174: -accentuate v,ion
5175: -accept v,er,va
5176: -acceptant a
5177: -acceptor n
5178: -access n,v
5179: -accessible a,in
5180: -accession n,v,na
5181: -accessory n,na
5182: -accident n,a
5183: -accidental a
5184: -accipiter n
5185: -acclaim n,v,er
5186: -acclamation n
5187: -acclimate n,v,ion
5188: -acclimatize v,er,ion
5189: -accolade n
5190: -accommodate v,ion
5191: -accompaniment n
5192: -accompanist n
5193: -accompany v,na
5194: -accompli d
5195: -accomplice n
5196: -accomplish v,er,va
5197: -accord n,v
5198: -accordant a
5199: -accordion n,na
5200: -accost v
5201: -account n,v,va
5202: -accountant n,a,na
5203: -Accra pc
5204: -accredit v,va
5205: -accreditation n
5206: -accrete v
5207: -accretion n,na
5208: -accretionary n
5209: -accrual a
5210: -accrue v,va
5211: -acculturate v,ion
5212: -accumulate v,ion
5213: -accuracy n,in
5214: -accurate a,in
5215: -accursed a
5216: -accusation n,na
5217: -accusatory d
5218: -accuse v,er
5219: -accustom v
5220: -ace n,v,nopref
5221: -acentric d
5222: -acerb a
5223: -acerbic a
5224: -acetaldehyde n
5225: -acetate n
5226: -acetic d
5227: -acetone n
5228: -acetyl n,na
5229: -acetylene n
5230: -ache n,v,er
5231: -achieve v,er,va
5232: -Achilles pc
5233: -aching a
5234: -achondrite n,na
5235: -achromatic a
5236: -acid n,a
5237: -acidic d
5238: -acidify v,er,ion
5239: -acidimeter n,na
5240: -acidulous a
5241: -Ackerman n
5242: -Ackley n
5243: -acknowledge v,va
5244: -acknowledgeable d
5245: -ACLU pc
5246: -ACM pc
5247: -acme pc
5248: -acne n
5249: -acolyte n
5250: -acorn n
5251: -acoustic n,a
5252: -acoustician n
5253: -acoustoelectric a,na
5254: -acoustooptic n,a,na
5255: -acquaint v
5256: -acquaintance n,na
5257: -acquiesce v
5258: -acquiescent a
5259: -acquire v,va
5260: -acquisition n,na
5261: -acquit v,ms
5262: -acquittal n
5263: -acre n
5264: -acreage pc
5265: -acrid a
5266: -acrimonious a
5267: -acrimony n
5268: -acrobat n
5269: -acrobatic n,na
5270: -acrolein n
5271: -acronym n
5272: -acrophobia n
5273: -acropolis n
5274: -across d
5275: -acrostic a
5276: -acrylate n
5277: -acrylic n
5278: -ACS pc
5279: -act n,v,ion,va
5280: -Actaeon pc
5281: -actinic na
5282: -actinide n
5283: -actinium n
5284: -actinometer n,na
5285: -activate v,ion,in
5286: -activism pc
5287: -Acton n
5288: -actress n
5289: -actual a,na
5290: -actuarial a
5291: -actuary n
5292: -actuate v,ion
5293: -acuity n
5294: -acumen n
5295: -acupuncture n
5296: -acute a
5297: -acyclic a
5298: -acyl n
5299: -ad n
5300: -Ada pc
5301: -adage n
5302: -adagio n
5303: -Adair pc
5304: -Adam pc
5305: -adamant a
5306: -adamantine a
5307: -Adams n
5308: -Adamson n
5309: -adapt v,er,ion,va
5310: -adaptation n,na
5311: -adaptive a
5312: -adaptor n
5313: -add v,er,va
5314: -addend n
5315: -addenda pc
5316: -addendum pc
5317: -addict n,v,ion
5318: -Addis pc
5319: -Addison n
5320: -addition n,na
5321: -addle v
5322: -address n,v,er,na,va
5323: -addressee n
5324: -Addressograph pc
5325: -adduce v,er,va
5326: -Adelaide pc
5327: -Adele pc
5328: -Adelia pc
5329: -Aden pc
5330: -adenoid n,na
5331: -adenoma n
5332: -adenosine n
5333: -adept n,a
5334: -adequacy n,in
5335: -adequate a,in
5336: -adhere v
5337: -adherent n,a
5338: -adhesion n,na
5339: -adiabatic n
5340: -adieu n
5341: -adipose a
5342: -Adirondack n
5343: -adjacent a
5344: -adjectival a
5345: -adjective n,a
5346: -adjoin v
5347: -adjoint n
5348: -adjourn v,va
5349: -adjudge v
5350: -adjudicate v,ion
5351: -adjunct n,a,ion
5352: -adjuration n
5353: -adjure v
5354: -adjust v,er,va
5355: -adjutant n,a
5356: -Adkins n
5357: -Adler n
5358: -administer v
5359: -administrable d
5360: -administrate v,ion
5361: -administratrix d
5362: -admiral n
5363: -admiralty n
5364: -admiration n
5365: -admire v,er,va
5366: -admissible a,in
5367: -admission n,na
5368: -admit v,er,ms
5369: -admittance n
5370: -admix v
5371: -admixture n
5372: -admonish v,er,va
5373: -admonition n
5374: -admonitory a
5375: -ado d,nopref
5376: -adobe n,er
5377: -adolescent n,a
5378: -Adolph pc
5379: -Adolphus pc
5380: -Adonis pc
5381: -adopt v,er,ion,va
5382: -adoration n
5383: -adore v,er,va
5384: -adorn v,er,va
5385: -adrenal n,a
5386: -adrenaline n
5387: -Adrian pc
5388: -Adriatic pc
5389: -Adrienne pc
5390: -adrift d
5391: -adroit a,comp
5392: -adsorb v,va
5393: -adsorbate n
5394: -adsorbent n
5395: -adsorption n,na
5396: -adulate v,ion
5397: -adult n,a
5398: -adulterant n
5399: -adulterate v,ion
5400: -adulterer n
5401: -adulteress n
5402: -adulterous a
5403: -adultery n
5404: -adumbrate v,ion
5405: -advance v,er,va
5406: -advantage n,v
5407: -advantageous a
5408: -advection n,na
5409: -advent n,na
5410: -adventitial a
5411: -adventitious a
5412: -adventure n,v,er,na
5413: -adventuresome a
5414: -adventuress n
5415: -adventurous a
5416: -adverb n
5417: -adverbial a
5418: -adversary n,a
5419: -adverse a
5420: -advert n,v
5421: -advertent a,in
5422: -advertise v,er,va
5423: -advice pc
5424: -advise v,er,va
5425: -advisee n
5426: -advisor n,y
5427: -advocacy n
5428: -advocate v,ion
5429: -adz n
5430: -adze n
5431: -Aegean pc
5432: -aegis n
5433: -Aeneas pc
5434: -Aeneid pc
5435: -aeolian d
5436: -Aeolus pc
5437: -aerate v,a,ion,va
5438: -aerial n,a,na
5439: -aerie n
5440: -Aerobacter pc
5441: -aerobatic n
5442: -aerobic n,na
5443: -aerodynamic n,na
5444: -aeronautic n,na
5445: -aerosol n,na
5446: -aerospace n
5447: -Aeschylus pc
5448: -aesthete n
5449: -aesthetic n,na
5450: -afar d
5451: -affable a,va
5452: -affair n
5453: -affect n,v,ion,va
5454: -affectation n
5455: -affectionate a
5456: -afferent a
5457: -affiance n,v
5458: -affidavit n
5459: -affiliate n,v,ion
5460: -affine n,ed,a
5461: -affinity n
5462: -affirm v,va
5463: -affirmation n,na
5464: -affix v,va
5465: -affixation n
5466: -afflatus n
5467: -afflict v,er,ion
5468: -affluent n,a
5469: -afford v,va
5470: -afforest v
5471: -afforestation n
5472: -affray n,v
5473: -affright n,v
5474: -affront n,v
5475: -afghan n
5476: -Afghanistan pc
5477: -aficionado n
5478: -afield d
5479: -afire d
5480: -AFL d
5481: -aflame d
5482: -afloat d
5483: -aflutter d
5484: -afoot d
5485: -aforementioned d
5486: -aforesaid d
5487: -aforethought d
5488: -afoul d
5489: -afraid d
5490: -afresh d
5491: -Africa pc
5492: -Afrikaner pc
5493: -afro n
5494: -aft er
5495: -afterbirth n
5496: -afterburner n
5497: -afterdeck n
5498: -aftereffect n
5499: -afterglow n
5500: -afterimage n
5501: -afterlife n
5502: -aftermath pc
5503: -aftermost pc
5504: -afternoon n
5505: -aftershock n
5506: -aftertaste n
5507: -afterthought n
5508: -afterward n
5509: -afterworld n
5510: -again d,nopref
5511: -against d,nopref
5512: -Agamemnon pc
5513: -agamic a
5514: -agape d
5515: -agar n,nopref
5516: -agate n,nopref
5517: -Agatha pc
5518: -agave n
5519: -age n,v
5520: -Agee n
5521: -agelong d
5522: -agenda pc,na
5523: -agendum pc
5524: -agent n,a
5525: -agglomerate v,ion
5526: -agglutinate v,ion
5527: -agglutinin n
5528: -aggrade v
5529: -aggravate v,ion
5530: -aggregate n,v,a,ion
5531: -aggression n,na
5532: -aggressor n
5533: -aggrieve v
5534: -aghast d
5535: -agile a
5536: -agitate v,ion
5537: -agitprop pc
5538: -agleam d
5539: -agley d
5540: -aglitter d
5541: -aglow d
5542: -Agnes pc
5543: -Agnew n
5544: -agnomen n
5545: -agnostic n,na
5546: -ago d,nopref
5547: -agog d
5548: -agon n
5549: -agone na
5550: -agony n
5551: -agora n
5552: -agoraphobia n
5553: -agouti n
5554: -agrarian n,na
5555: -agree v,va
5556: -agreeable a
5557: -agreeing d
5558: -agribusiness n
5559: -Agricola pc
5560: -agricultural a,na
5561: -agriculture n,na
5562: -agrimony n
5563: -agronomist n
5564: -agronomy n,na
5565: -aground d
5566: -ague n
5567: -Agway pc
5568: -ah n,nopref
5569: -Ahab pc
5570: -ahead d
5571: -ahem d
5572: -Ahmadabad pc
5573: -ahoy d
5574: -aid n,v,er,nopref
5575: -Aida pc
5576: -aide n,nopref
5577: -Aiken pc
5578: -ail n,v,nopref
5579: -ailanthus pc
5580: -Aileen pc
5581: -aileron n
5582: -ailment n
5583: -aim n,v
5584: -ain't d
5585: -Ainu n
5586: -air n,v,man,y
5587: -airborne d
5588: -airbrush n,v
5589: -Airbus n
5590: -aircraft n
5591: -airdrop n,v,va
5592: -Aires pc
5593: -airfare n
5594: -airfield n
5595: -airflow n
5596: -airfoil n
5597: -airframe n
5598: -airhead n
5599: -airlift n,v
5600: -airline n,er
5601: -airlock n
5602: -airmail n,v
5603: -airmass n
5604: -airpark n
5605: -airport n
5606: -airscrew n
5607: -airsick a
5608: -airspace n
5609: -airspeed n
5610: //GO.SYSIN DD regress.d/t12.i
5611: echo regress.d/t12.out 1>&2
5612: sed 's/.//' >regress.d/t12.out <<'//GO.SYSIN DD regress.d/t12.out'
5613: //GO.SYSIN DD regress.d/t12.out
5614: echo regress.d/t12.sh 1>&2
5615: sed 's/.//' >regress.d/t12.sh <<'//GO.SYSIN DD regress.d/t12.sh'
5616: -$GRE -Fxvf t12.i t12.i 2>&1
5617: //GO.SYSIN DD regress.d/t12.sh
5618: echo regress.d/t13.i 1>&2
5619: sed 's/.//' >regress.d/t13.i <<'//GO.SYSIN DD regress.d/t13.i'
5620: -/p1/usr/bin/pmxpc:
5621: - pm.sl 2.94
5622: - xdhu.sl 1.8
5623: - /lib/crt1.o.sl 1.1 4.0 01/15/86 12744 AT&T-SF
5624: - /usr/include/stdio.h.sl 1.1 4.0 01/15/86 4140 AT&T-SF
5625: - /usr/include/ctype.h.sl 1.1 4.0 01/15/86 45671 AT&T-SF
5626: - /usr/include/string.h.sl 1.1 4.0 01/15/86 51235 AT&T-SF
5627: - /usr/include/signal.h.sl 1.1 4.0 01/15/86 34302 AT&T-SF
5628: - /usr/include/sys/signal.h.sl 1.5 3.2 09/02/87 33640 AT&T-SF
5629: - /usr/include/sys/types.h.sl 1.3 3.1 06/02/86 48113 AT&T-SF
5630: - /usr/include/sys/stat.h.sl 1.3 3.0 12/19/85 41824
5631: - /usr/include/termio.h.sl 1.1 4.0 01/15/86 29141 AT&T-SF
5632: //GO.SYSIN DD regress.d/t13.i
5633: echo regress.d/t13.out 1>&2
5634: sed 's/.//' >regress.d/t13.out <<'//GO.SYSIN DD regress.d/t13.out'
5635: -/p1/usr/bin/pmxpc:
5636: - pm.sl 2.94
5637: - xdhu.sl 1.8
5638: //GO.SYSIN DD regress.d/t13.out
5639: echo regress.d/t13.sh 1>&2
5640: sed 's/.//' >regress.d/t13.sh <<'//GO.SYSIN DD regress.d/t13.sh'
5641: -$GRE 'pm|xdhu' < t13.i 2>&1
5642: //GO.SYSIN DD regress.d/t13.sh
5643: echo regress.d/t2.out 1>&2
5644: sed 's/.//' >regress.d/t2.out <<'//GO.SYSIN DD regress.d/t2.out'
5645: //GO.SYSIN DD regress.d/t2.out
5646: echo regress.d/t2.sh 1>&2
5647: sed 's/.//' >regress.d/t2.sh <<'//GO.SYSIN DD regress.d/t2.sh'
5648: -$GRE -v '^\.x' t1.i
5649: //GO.SYSIN DD regress.d/t2.sh
5650: echo regress.d/t3.i 1>&2
5651: sed 's/.//' >regress.d/t3.i <<'//GO.SYSIN DD regress.d/t3.i'
5652: -x
5653: -abcd
5654: -abcde
5655: -eabcd
5656: -defg
5657: -xdefg
5658: -defgx
5659: -abcd defg
5660: //GO.SYSIN DD regress.d/t3.i
5661: echo regress.d/t3.out 1>&2
5662: sed 's/.//' >regress.d/t3.out <<'//GO.SYSIN DD regress.d/t3.out'
5663: -abcd
5664: -defg
5665: //GO.SYSIN DD regress.d/t3.out
5666: echo regress.d/t3.sh 1>&2
5667: sed 's/.//' >regress.d/t3.sh <<'//GO.SYSIN DD regress.d/t3.sh'
5668: -$GRE -xF 'defg
5669: -abcd' t3.i
5670: //GO.SYSIN DD regress.d/t3.sh
5671: echo regress.d/t4.i 1>&2
5672: sed 's/.//' >regress.d/t4.i <<'//GO.SYSIN DD regress.d/t4.i'
5673: - 1 ZIPPORI, Israel
5674: - /usr/spool/ap/88/07/15/a0471: Israel-MonaLisa
5675: - 1 ZERIFIN, Israel
5676: - /usr/spool/ap/88/05/17/a0823: Israel-Baez
5677: - 1 ZEPHYRHILLS, Fla.
5678: - /usr/spool/ap/88/04/27/a0963: HelicopterEscape
5679: - 1 ZENICA, Yugoslavia
5680: - /usr/spool/ap/88/07/13/a0814: Yugoslavia
5681: - 1 ZAP, N.D.
5682: - /usr/spool/ap/88/03/13/a0776: CoalStrike
5683: - 1 ZAMBRANO, Honduras
5684: - /usr/spool/ap/88/03/24/a0512: Honduras-Soldiers
5685: - 1 ZACHARY, La.
5686: - /usr/spool/ap/88/04/05/a0745: Brites
5687: - 1 YUCCA VALLEY, Calif.
5688: - /usr/spool/ap/88/08/26/a0624: BRF--SoCalQuake
5689: - 1 YORKVILLE, Ill.
5690: - /usr/spool/ap/88/08/31/a0687: ReformedStudent
5691: - 1 YORK, Maine
5692: - /usr/spool/ap/88/10/09/a0772: SeaSearches
5693: - 1 YENAN, China
5694: - /usr/spool/ap/88/02/24/a0419: China-Yenan
5695: - 1 YELOWSTONE NATIONAL PARK, Wyo.
5696: - /usr/spool/ap/88/09/15/a0792: Dukakis
5697: - 1 YEADON, Pa.
5698: - /usr/spool/ap/88/05/14/a0689: Brites
5699: - 1 YATTA, Occupied West Bank
5700: - /usr/spool/ap/88/10/29/a0417: Israel-Undercover
5701: - 1 YASSIHOYUK, Turkey
5702: - /usr/spool/ap/88/09/09/a0423: MidasTomb
5703: - 1 YAPHANK, N.Y.
5704: - /usr/spool/ap/88/05/10/a0686: Brites
5705: - 1 YAMOUSSOUKRO, Ivory Coast
5706: - /usr/spool/ap/88/09/25/a0635: Africa-UN
5707: //GO.SYSIN DD regress.d/t4.i
5708: echo regress.d/t4.out 1>&2
5709: sed 's/.//' >regress.d/t4.out <<'//GO.SYSIN DD regress.d/t4.out'
5710: - 1 ZIPPORI, Israel
5711: - 1 ZERIFIN, Israel
5712: - 1 ZEPHYRHILLS, Fla.
5713: - 1 ZENICA, Yugoslavia
5714: - 1 ZAP, N.D.
5715: - 1 ZAMBRANO, Honduras
5716: - 1 ZACHARY, La.
5717: - 1 YUCCA VALLEY, Calif.
5718: - 1 YORKVILLE, Ill.
5719: - 1 YORK, Maine
5720: - 1 YENAN, China
5721: - 1 YELOWSTONE NATIONAL PARK, Wyo.
5722: - 1 YEADON, Pa.
5723: - 1 YATTA, Occupied West Bank
5724: - 1 YASSIHOYUK, Turkey
5725: - 1 YAPHANK, N.Y.
5726: - 1 YAMOUSSOUKRO, Ivory Coast
5727: //GO.SYSIN DD regress.d/t4.out
5728: echo regress.d/t4.sh 1>&2
5729: sed 's/.//' >regress.d/t4.sh <<'//GO.SYSIN DD regress.d/t4.sh'
5730: -$GRE -v : t4.i
5731: //GO.SYSIN DD regress.d/t4.sh
5732: echo regress.d/t5.i 1>&2
5733: sed 's/.//' >regress.d/t5.i <<'//GO.SYSIN DD regress.d/t5.i'
5734: -com 1037117850
5735: -com -113451303
5736: -com -253844186
5737: -com -591640727
5738: -com -192085666
5739: -com 875206176
5740: -com -688908411
5741: -com 116220732
5742: -com -815364609
5743: -com 393021566
5744: -com -197586762
5745: -com -979497332
5746: -com 580876342
5747: -com 857752251
5748: -com -282427433
5749: -com 440265772
5750: -com 903702654
5751: -com 377371259
5752: -com -790446649
5753: -com -407893353
5754: -com 601447097
5755: -com 311585929
5756: -com -990601410
5757: -com 273028495
5758: -com -421520583
5759: -com -620551282
5760: -com -768217422
5761: -com 722547274
5762: -com 313902943
5763: -com -729597068
5764: -com 306062132
5765: -com 773754585
5766: -com -678639313
5767: -com -345701409
5768: -com -290065002
5769: -com -974307104
5770: -com 1047184566
5771: -com 210828681
5772: -com 108982822
5773: -com 68031245
5774: -com -1047141482
5775: -com 227569703
5776: -com -530798398
5777: -com -822779044
5778: -com 440691738
5779: -com 624275796
5780: -com 843073732
5781: -com 228971433
5782: -com 258376249
5783: -com -308161170
5784: -com -995590232
5785: -com 856677272
5786: -com 132296249
5787: -com 633658628
5788: -com 25935234
5789: -com -1063085400
5790: -com 148654970
5791: -com -824172925
5792: -com -659459669
5793: -com 196909720
5794: -com -393774825
5795: -com 736667556
5796: -com 674673107
5797: -com 1007653812
5798: -com -261383312
5799: -com 263123663
5800: -com -946595190
5801: -com -396442
5802: -com -506832213
5803: -com 149702652
5804: -com -937852087
5805: -com -500943193
5806: -com -288026147
5807: -com -653808189
5808: -com 801559288
5809: -com -653395420
5810: -com -405217270
5811: -com -749529781
5812: -com 965720542
5813: -com 396739912
5814: -com 250804267
5815: -com 1058925867
5816: -com 121948720
5817: -com 129329115
5818: -com -503214654
5819: -com 758365427
5820: -com -569717820
5821: -com 191932303
5822: -com 1041195498
5823: -com -178872661
5824: -com 719024931
5825: -com 389365053
5826: -com -695930677
5827: -com -720993320
5828: -com 659352079
5829: -com -445359373
5830: -com -405581235
5831: -com -495515453
5832: -com -861910553
5833: -com -35979929
5834: -com 1056535300
5835: -com 188042833
5836: -com -220408267
5837: -com -766533595
5838: -com 718865736
5839: -com -614647852
5840: -com 637296265
5841: -com 607439702
5842: -com -996163547
5843: -com -354301843
5844: -com 187216170
5845: -com -524246340
5846: -com 165453004
5847: -com -922340816
5848: -com -392313676
5849: -com 933400965
5850: -com -357455062
5851: -com 876069330
5852: -com 619850004
5853: -com 34785127
5854: -com -204461692
5855: -com -1021142281
5856: -com 261505948
5857: -com 713447396
5858: -com -264424205
5859: -com -757624021
5860: -com -697742264
5861: -com -67902535
5862: -com 813305897
5863: -com 611213298
5864: -com 810009586
5865: -com -351033158
5866: -com -757580248
5867: -com -754765998
5868: -com 96550293
5869: -com 818835421
5870: -com 625544984
5871: -com -301866740
5872: -com -363940120
5873: -com 196940655
5874: -com -990799410
5875: -com -650380493
5876: -com -823008037
5877: -com 229313079
5878: -com 480371766
5879: -com 934025272
5880: -com -223072319
5881: -com 481173087
5882: -com 101019846
5883: -com -954562179
5884: -com -267806909
5885: -com 1004678320
5886: -com 267997081
5887: -com -691653747
5888: -com 821221633
5889: -com 11472834
5890: -com -852175935
5891: -com 145665121
5892: -com 636788309
5893: -com -38553220
5894: -com -594562227
5895: -com 893269786
5896: -com -515632420
5897: -com -504118519
5898: -com -795555924
5899: -com -896489800
5900: -com 381679431
5901: -com 451163332
5902: -com 945690716
5903: -com -474968721
5904: -com -181646048
5905: -com -477705084
5906: -com 179336691
5907: -com 944752723
5908: -com -106013482
5909: -com 295161509
5910: -com -1026918852
5911: -com -1008494120
5912: -com -368542058
5913: -com 6153383
5914: -com 269567191
5915: -com 221084616
5916: -com -1015567145
5917: -com 326752359
5918: -com -253427460
5919: -com -990923267
5920: -com -745673545
5921: -com -772482393
5922: -com 12783572
5923: -com 695087221
5924: -com 782623860
5925: -com 239322275
5926: -com -920492686
5927: -com -461345191
5928: -com 304590436
5929: -com -141131273
5930: -com -1024267294
5931: -com -289620401
5932: -com -495626460
5933: -com 948528218
5934: -com 87006518
5935: -com 395454722
5936: -com 577392034
5937: -com 814343604
5938: -com 497169207
5939: -com -567127307
5940: -com 764271483
5941: -com -866721319
5942: -com -387005272
5943: -com -501938820
5944: -com 567881079
5945: -com 453665993
5946: -com -790328887
5947: -com 390097892
5948: -com 141055035
5949: -com 990378016
5950: -com -730626518
5951: -com 732985962
5952: -com -286073373
5953: -com 22747858
5954: -com -326949321
5955: -com 1022500944
5956: -com 905679100
5957: -com -448120658
5958: -com 363118089
5959: -com 819248817
5960: -com -691522154
5961: -com 59581781
5962: -com -450349154
5963: -com -729823626
5964: -com 646115018
5965: -com -65922779
5966: -com -373376656
5967: -com 1004572328
5968: -com 466654801
5969: -com 128208377
5970: -com 958497476
5971: -com 22952708
5972: -com -822443770
5973: -com 689913706
5974: -com 726815914
5975: -com -128674860
5976: -com 779809535
5977: -com -316931412
5978: -com -1025891272
5979: -com 4804418
5980: -com 309313283
5981: -com 536922264
5982: -com -876904372
5983: -com 700688221
5984: -com 186984467
5985: -com 791829735
5986: -com 237211732
5987: -com 515173384
5988: -com -911728294
5989: -com -783718602
5990: -com 160345621
5991: -com -716237348
5992: -com -185346360
5993: -com -634816499
5994: -com -845917397
5995: -com 460946577
5996: -com 777785415
5997: -com -579223277
5998: -com -127944050
5999: -com -351414763
6000: -com -1006508563
6001: -com 934284417
6002: -com -414601720
6003: -com -328845777
6004: -com 701421432
6005: -com -680992028
6006: -com 444048798
6007: -com -277796693
6008: -com -1014985030
6009: -com 213438258
6010: -com -863232710
6011: -com -236044310
6012: -com -593324426
6013: -com -269273068
6014: -com -163992668
6015: -com -1026411186
6016: -com 537134594
6017: -com 321391768
6018: -com -872419201
6019: -com -795875760
6020: -com 373186979
6021: -com 616631783
6022: -com -567696334
6023: -com 554407297
6024: -com 723377442
6025: -com 1062001538
6026: -com 152160308
6027: -com 43834651
6028: -com 902450760
6029: -com -390697289
6030: -com 431114551
6031: -com -851289267
6032: -com 454377388
6033: -com 470923853
6034: -com -950885734
6035: -com -313255930
6036: -com -388083168
6037: -com -267037738
6038: -com -601696282
6039: -com -848277038
6040: -com 745209391
6041: -com -423687675
6042: -com 646585818
6043: -com -613632730
6044: -com 151442994
6045: -com 868010020
6046: -com -589969477
6047: -com 756495308
6048: -com 482257575
6049: -com -546245706
6050: -com -56416295
6051: -com -922688644
6052: -com -927591869
6053: -com -193091648
6054: -com 505183574
6055: -com -696294953
6056: -com -676843648
6057: -com -458233039
6058: -com 1016060900
6059: -com 235279194
6060: -com 255314418
6061: -com 821562352
6062: -com 677435672
6063: -com -137977226
6064: -com -296008805
6065: -com -284837634
6066: -com 992052324
6067: -com 848130900
6068: -com -612135722
6069: -com -242663012
6070: -com 40910582
6071: -com -633235255
6072: //GO.SYSIN DD regress.d/t5.i
6073: echo regress.d/t5.out 1>&2
6074: sed 's/.//' >regress.d/t5.out <<'//GO.SYSIN DD regress.d/t5.out'
6075: -com 1037117850
6076: -com -113451303
6077: -com -253844186
6078: -com -591640727
6079: -com -192085666
6080: -com 875206176
6081: -com -688908411
6082: -com 116220732
6083: -com -815364609
6084: -com 393021566
6085: -com -197586762
6086: -com -979497332
6087: -com 580876342
6088: -com 857752251
6089: -com -282427433
6090: -com 440265772
6091: -com 903702654
6092: -com 377371259
6093: -com -790446649
6094: -com -407893353
6095: -com 601447097
6096: -com 311585929
6097: -com -990601410
6098: -com 273028495
6099: -com -421520583
6100: -com -620551282
6101: -com -768217422
6102: -com 722547274
6103: -com 313902943
6104: -com -729597068
6105: -com 306062132
6106: -com 773754585
6107: -com -678639313
6108: -com -345701409
6109: -com -290065002
6110: -com -974307104
6111: -com 1047184566
6112: -com 210828681
6113: -com 108982822
6114: -com 68031245
6115: -com -1047141482
6116: -com 227569703
6117: -com -530798398
6118: -com -822779044
6119: -com 440691738
6120: -com 624275796
6121: -com 843073732
6122: -com 228971433
6123: -com 258376249
6124: -com -308161170
6125: -com -995590232
6126: -com 856677272
6127: -com 132296249
6128: -com 633658628
6129: -com 25935234
6130: -com -1063085400
6131: -com 148654970
6132: -com -824172925
6133: -com -659459669
6134: -com 196909720
6135: -com -393774825
6136: -com 736667556
6137: -com 674673107
6138: -com 1007653812
6139: -com -261383312
6140: -com 263123663
6141: -com -946595190
6142: -com -396442
6143: -com -506832213
6144: -com 149702652
6145: -com -937852087
6146: -com -500943193
6147: -com -288026147
6148: -com -653808189
6149: -com 801559288
6150: -com -653395420
6151: -com -405217270
6152: -com -749529781
6153: -com 965720542
6154: -com 396739912
6155: -com 250804267
6156: -com 1058925867
6157: -com 121948720
6158: -com 129329115
6159: -com -503214654
6160: -com 758365427
6161: -com -569717820
6162: -com 191932303
6163: -com 1041195498
6164: -com -178872661
6165: -com 719024931
6166: -com 389365053
6167: -com -695930677
6168: -com -720993320
6169: -com 659352079
6170: -com -445359373
6171: -com -405581235
6172: -com -495515453
6173: -com -861910553
6174: -com -35979929
6175: -com 1056535300
6176: -com 188042833
6177: -com -220408267
6178: -com -766533595
6179: -com 718865736
6180: -com -614647852
6181: -com 637296265
6182: -com 607439702
6183: -com -996163547
6184: -com -354301843
6185: -com 187216170
6186: -com -524246340
6187: -com 165453004
6188: -com -922340816
6189: -com -392313676
6190: -com 933400965
6191: -com -357455062
6192: -com 876069330
6193: -com 619850004
6194: -com 34785127
6195: -com -204461692
6196: -com -1021142281
6197: -com 261505948
6198: -com 713447396
6199: -com -264424205
6200: -com -757624021
6201: -com -697742264
6202: -com -67902535
6203: -com 813305897
6204: -com 611213298
6205: -com 810009586
6206: -com -351033158
6207: -com -757580248
6208: -com -754765998
6209: -com 96550293
6210: -com 818835421
6211: -com 625544984
6212: -com -301866740
6213: -com -363940120
6214: -com 196940655
6215: -com -990799410
6216: -com -650380493
6217: -com -823008037
6218: -com 229313079
6219: -com 480371766
6220: -com 934025272
6221: -com -223072319
6222: -com 481173087
6223: -com 101019846
6224: -com -954562179
6225: -com -267806909
6226: -com 1004678320
6227: -com 267997081
6228: -com -691653747
6229: -com 821221633
6230: -com 11472834
6231: -com -852175935
6232: -com 145665121
6233: -com 636788309
6234: -com -38553220
6235: -com -594562227
6236: -com 893269786
6237: -com -515632420
6238: -com -504118519
6239: -com -795555924
6240: -com -896489800
6241: -com 381679431
6242: -com 451163332
6243: -com 945690716
6244: -com -474968721
6245: -com -181646048
6246: -com -477705084
6247: -com 179336691
6248: -com 944752723
6249: -com -106013482
6250: -com 295161509
6251: -com -1026918852
6252: -com -1008494120
6253: -com -368542058
6254: -com 6153383
6255: -com 269567191
6256: -com 221084616
6257: -com -1015567145
6258: -com 326752359
6259: -com -253427460
6260: -com -990923267
6261: -com -745673545
6262: -com -772482393
6263: -com 12783572
6264: -com 695087221
6265: -com 782623860
6266: -com 239322275
6267: -com -920492686
6268: -com -461345191
6269: -com 304590436
6270: -com -141131273
6271: -com -1024267294
6272: -com -289620401
6273: -com -495626460
6274: -com 948528218
6275: -com 87006518
6276: -com 395454722
6277: -com 577392034
6278: -com 814343604
6279: -com 497169207
6280: -com -567127307
6281: -com 764271483
6282: -com -866721319
6283: -com -387005272
6284: -com -501938820
6285: -com 567881079
6286: -com 453665993
6287: -com -790328887
6288: -com 390097892
6289: -com 141055035
6290: -com 990378016
6291: -com -730626518
6292: -com 732985962
6293: -com -286073373
6294: -com 22747858
6295: -com -326949321
6296: -com 1022500944
6297: -com 905679100
6298: -com -448120658
6299: -com 363118089
6300: -com 819248817
6301: -com -691522154
6302: -com 59581781
6303: -com -450349154
6304: -com -729823626
6305: -com 646115018
6306: -com -65922779
6307: -com -373376656
6308: -com 1004572328
6309: -com 466654801
6310: -com 128208377
6311: -com 958497476
6312: -com 22952708
6313: -com -822443770
6314: -com 689913706
6315: -com 726815914
6316: -com -128674860
6317: -com 779809535
6318: -com -316931412
6319: -com -1025891272
6320: -com 4804418
6321: -com 309313283
6322: -com 536922264
6323: -com -876904372
6324: -com 700688221
6325: -com 186984467
6326: -com 791829735
6327: -com 237211732
6328: -com 515173384
6329: -com -911728294
6330: -com -783718602
6331: -com 160345621
6332: -com -716237348
6333: -com -185346360
6334: -com -634816499
6335: -com -845917397
6336: -com 460946577
6337: -com 777785415
6338: -com -579223277
6339: -com -127944050
6340: -com -351414763
6341: -com -1006508563
6342: -com 934284417
6343: -com -414601720
6344: -com -328845777
6345: -com 701421432
6346: -com -680992028
6347: -com 444048798
6348: -com -277796693
6349: -com -1014985030
6350: -com 213438258
6351: -com -863232710
6352: -com -236044310
6353: -com -593324426
6354: -com -269273068
6355: -com -163992668
6356: -com -1026411186
6357: -com 537134594
6358: -com 321391768
6359: -com -872419201
6360: -com -795875760
6361: -com 373186979
6362: -com 616631783
6363: -com -567696334
6364: -com 554407297
6365: -com 723377442
6366: -com 1062001538
6367: -com 152160308
6368: -com 43834651
6369: -com 902450760
6370: -com -390697289
6371: -com 431114551
6372: -com -851289267
6373: -com 454377388
6374: -com 470923853
6375: -com -950885734
6376: -com -313255930
6377: -com -388083168
6378: -com -267037738
6379: -com -601696282
6380: -com -848277038
6381: -com 745209391
6382: -com -423687675
6383: -com 646585818
6384: -com -613632730
6385: -com 151442994
6386: -com 868010020
6387: -com -589969477
6388: -com 756495308
6389: -com 482257575
6390: -com -546245706
6391: -com -56416295
6392: -com -922688644
6393: -com -927591869
6394: -com -193091648
6395: -com 505183574
6396: -com -696294953
6397: -com -676843648
6398: -com -458233039
6399: -com 1016060900
6400: -com 235279194
6401: -com 255314418
6402: -com 821562352
6403: -com 677435672
6404: -com -137977226
6405: -com -296008805
6406: -com -284837634
6407: -com 992052324
6408: -com 848130900
6409: -com -612135722
6410: -com -242663012
6411: -com 40910582
6412: -com -633235255
6413: //GO.SYSIN DD regress.d/t5.out
6414: echo regress.d/t5.sh 1>&2
6415: sed 's/.//' >regress.d/t5.sh <<'//GO.SYSIN DD regress.d/t5.sh'
6416: -$GRE '^com ' t5.i
6417: //GO.SYSIN DD regress.d/t5.sh
6418: echo regress.d/t6.i 1>&2
6419: sed 's/.//' >regress.d/t6.i <<'//GO.SYSIN DD regress.d/t6.i'
6420: -#include "alloc.h"
6421: -#include <libc.h>
6422: -
6423: -char *
6424: -emalloc(unsigned long n)
6425: -{
6426: - char *p;
6427: - p=malloc((unsigned)n);
6428: - if(p==0){
6429: - warn("out of memory; exiting");
6430: - exits("out of memory");
6431: - }
6432: - return p;
6433: -}
6434: -char *
6435: -erealloc(char *p, unsigned long n)
6436: -{
6437: - p=realloc(p, (unsigned)n);
6438: - if(p==0){
6439: - warn("out of memory; exiting");
6440: - exits("out of memory");
6441: - }
6442: - return p;
6443: -}
6444: -#include "alloc.h"
6445: -#include "word.h"
6446: -#include "store.h"
6447: -#include "comm.h"
6448: -#include <libc.h>
6449: -
6450: -/*
6451: - * Push constants
6452: - */
6453: -
6454: -ipushconst(Proc *proc)
6455: -{
6456: - *proc->sp++=(SWord)*++proc->pc;
6457: - return 1;
6458: -}
6459: -
6460: -ipush_2(Proc *proc)
6461: -{
6462: - *proc->sp++=-2;
6463: - return 1;
6464: -}
6465: -
6466: -ipush_1(Proc *proc)
6467: -{
6468: - *proc->sp++=-1;
6469: - return 1;
6470: -}
6471: -
6472: -ipush0(Proc *proc)
6473: -{
6474: - *proc->sp++=0;
6475: - return 1;
6476: -}
6477: -
6478: -ipush1(Proc *proc)
6479: -{
6480: - *proc->sp++=1;
6481: - return 1;
6482: -}
6483: -
6484: -ipush2(Proc *proc)
6485: -{
6486: - *proc->sp++=2;
6487: - return 1;
6488: -}
6489: -
6490: -ipush3(Proc *proc)
6491: -{
6492: - *proc->sp++=3;
6493: - return 1;
6494: -}
6495: -
6496: -ipush4(Proc *proc)
6497: -{
6498: - *proc->sp++=4;
6499: - return 1;
6500: -}
6501: -
6502: -ipush5(Proc *proc)
6503: -{
6504: - *proc->sp++=5;
6505: - return 1;
6506: -}
6507: -
6508: -ipush6(Proc *proc)
6509: -{
6510: - *proc->sp++=6;
6511: - return 1;
6512: -}
6513: -
6514: -ipush7(Proc *proc)
6515: -{
6516: - *proc->sp++=7;
6517: - return 1;
6518: -}
6519: -
6520: -ipush8(Proc *proc)
6521: -{
6522: - *proc->sp++=8;
6523: - return 1;
6524: -}
6525: -
6526: -ipush9(Proc *proc)
6527: -{
6528: - *proc->sp++=9;
6529: - return 1;
6530: -}
6531: -
6532: -ipush10(Proc *proc)
6533: -{
6534: - *proc->sp++=10;
6535: - return 1;
6536: -}
6537: -
6538: -/*
6539: - * Binary operators
6540: - */
6541: -ige(Proc *proc)
6542: -{
6543: - --proc->sp;
6544: - proc->sp[-1]=proc->sp[-1]>=proc->sp[0];
6545: - return 1;
6546: -}
6547: -
6548: -ile(Proc *proc)
6549: -{
6550: - --proc->sp;
6551: - proc->sp[-1]=proc->sp[-1]<=proc->sp[0];
6552: - return 1;
6553: -}
6554: -
6555: -ine(Proc *proc)
6556: -{
6557: - --proc->sp;
6558: - proc->sp[-1]=proc->sp[-1]!=proc->sp[0];
6559: - return 1;
6560: -}
6561: -
6562: -ieq(Proc *proc)
6563: -{
6564: - --proc->sp;
6565: - proc->sp[-1]=proc->sp[-1]==proc->sp[0];
6566: - return 1;
6567: -}
6568: -
6569: -igt(Proc *proc)
6570: -{
6571: - --proc->sp;
6572: - proc->sp[-1]=proc->sp[-1]>proc->sp[0];
6573: - return 1;
6574: -}
6575: -
6576: -ilt(Proc *proc)
6577: -{
6578: - --proc->sp;
6579: - proc->sp[-1]=proc->sp[-1]<proc->sp[0];
6580: - return 1;
6581: -}
6582: -
6583: -iadd(Proc *proc)
6584: -{
6585: - --proc->sp;
6586: - proc->sp[-1]+=proc->sp[0];
6587: - return 1;
6588: -}
6589: -
6590: -isub(Proc *proc)
6591: -{
6592: - --proc->sp;
6593: - proc->sp[-1]-=proc->sp[0];
6594: - return 1;
6595: -}
6596: -
6597: -imul(Proc *proc)
6598: -{
6599: - long l0, l1, l;
6600: - --proc->sp;
6601: - l0=proc->sp[-1];
6602: - l1=proc->sp[0];
6603: - l=l0*l1;
6604: - if(l1 && l/l1 != l0)
6605: - rerror("product overflow");
6606: - proc->sp[-1]=l;
6607: - return 1;
6608: -}
6609: -
6610: -idiv(Proc *proc)
6611: -{
6612: - --proc->sp;
6613: - if(proc->sp[0]==0)
6614: - rerror("zero divide");
6615: - proc->sp[-1]/=proc->sp[0];
6616: - return 1;
6617: -}
6618: -
6619: -imod(Proc *proc)
6620: -{
6621: - --proc->sp;
6622: - if(proc->sp[0]==0)
6623: - rerror("zero modulo");
6624: - proc->sp[-1]%=proc->sp[0];
6625: - return 1;
6626: -}
6627: -
6628: -iand(Proc *proc)
6629: -{
6630: - --proc->sp;
6631: - proc->sp[-1]&=proc->sp[0];
6632: - return 1;
6633: -}
6634: -
6635: -ior(Proc *proc)
6636: -{
6637: - --proc->sp;
6638: - proc->sp[-1]|=proc->sp[0];
6639: - return 1;
6640: -}
6641: -
6642: -ixor(Proc *proc)
6643: -{
6644: - --proc->sp;
6645: - proc->sp[-1]^=proc->sp[0];
6646: - return 1;
6647: -}
6648: -
6649: -ilsh(Proc *proc)
6650: -{
6651: - --proc->sp;
6652: - proc->sp[-1]<<=proc->sp[0];
6653: - return 1;
6654: -}
6655: -
6656: -irsh(Proc *proc)
6657: -{
6658: - --proc->sp;
6659: - proc->sp[-1]>>=proc->sp[0];
6660: - return 1;
6661: -}
6662: -
6663: -imax(Proc *proc)
6664: -{
6665: - SWord l;
6666: - l=*--proc->sp;
6667: - if(l>proc->sp[-1])
6668: - proc->sp[-1]=l;
6669: - return 1;
6670: -}
6671: -
6672: -/*
6673: - * Unary operators
6674: - */
6675: -
6676: -ineg(Proc *proc)
6677: -{
6678: - proc->sp[-1]=-proc->sp[-1];
6679: - return 1;
6680: -}
6681: -
6682: -inot(Proc *proc)
6683: -{
6684: - proc->sp[-1]=~proc->sp[-1];
6685: - return 1;
6686: -}
6687: -
6688: -ilnot(Proc *proc)
6689: -{
6690: - proc->sp[-1]=!proc->sp[-1];
6691: - return 1;
6692: -}
6693: -
6694: -iref(Proc *proc)
6695: -{
6696: - Store *s=(Store *)*--proc->sp;
6697: - *proc->sp++=s->ref-1;
6698: - decref(&s);
6699: - return 1;
6700: -}
6701: -
6702: -ilen(Proc *proc)
6703: -{
6704: - Store *s=(Store *)*--proc->sp;
6705: - *proc->sp++=s->len;
6706: - decref(&s);
6707: - return 1;
6708: -}
6709: -
6710: -/*
6711: - * String comparison: put value of strcmp() on stack
6712: - */
6713: -
6714: -istrcmp(Proc *proc)
6715: -{
6716: - int cmp;
6717: - Store *s1, *s2;
6718: - s1=(Store *)proc->sp[-2];
6719: - s2=(Store *)proc->sp[-1];
6720: - cmp=strcmp((char *)s1->data, (char *)s2->data);
6721: - decref(&s1);
6722: - decref(&s2);
6723: - proc->sp--;
6724: - proc->sp[-1]=cmp;
6725: - return 1;
6726: -}
6727: -
6728: -/*
6729: - * Print
6730: - */
6731: -
6732: -iprintint(Proc *proc)
6733: -{
6734: - pprint(proc, "%ld", *--proc->sp);
6735: - return 1;
6736: -}
6737: -
6738: -iprintnewline(Proc *proc)
6739: -{
6740: - pprint(proc, "\n");
6741: - return 1;
6742: -}
6743: -
6744: -iprintblank(Proc *proc)
6745: -{
6746: - pprint(proc, " ");
6747: - return 1;
6748: -}
6749: -
6750: -iprintunit(Proc *proc)
6751: -{
6752: - pprint(proc, "(unit)");
6753: - return 1;
6754: -}
6755: -
6756: -iprintchar(Proc *proc)
6757: -{
6758: - pprint(proc, "%c", *--proc->sp);
6759: - return 1;
6760: -}
6761: -
6762: -pprint(proc, fmt, a, b, c, d, e)
6763: - Proc *proc;
6764: - char *fmt;
6765: -{
6766: - char buf[1024];
6767: - long n;
6768: - n=sprint(buf, fmt, a, b, c, d, e);
6769: - if(proc->prbuf==0){
6770: - proc->prbuf=emalloc(64+n);
6771: - proc->maxprbuf=64+n;
6772: - proc->nprbuf=0;
6773: - }
6774: - if(n+proc->nprbuf+1>proc->maxprbuf){
6775: - proc->prbuf=erealloc(proc->prbuf, proc->maxprbuf+64+n);
6776: - proc->maxprbuf+=64+n;
6777: - }
6778: - strcpy(proc->prbuf+proc->nprbuf, buf);
6779: - proc->nprbuf+=n;
6780: -}
6781: -/*
6782: - * Stack management
6783: - */
6784: -
6785: -ipop(Proc *proc)
6786: -{
6787: - --proc->sp;
6788: - return 1;
6789: -}
6790: -
6791: -ipopptr(Proc *proc)
6792: -{
6793: - decref((Store **)(proc->sp-1));
6794: - --proc->sp;
6795: - return 1;
6796: -}
6797: -
6798: -idup(Proc *proc)
6799: -{
6800: - proc->sp++;
6801: - proc->sp[-1]=proc->sp[-2];
6802: - return 1;
6803: -}
6804: -
6805: -idupptr(Proc *proc)
6806: -{
6807: - proc->sp++;
6808: - proc->sp[-1]=proc->sp[-2];
6809: - ((Store *)(proc->sp[-1]))->ref++;
6810: - return 1;
6811: -}
6812: -#include "node.h"
6813: -#include "symbol.h"
6814: -#include "alloc.h"
6815: -#include "word.h"
6816: -#include "store.h"
6817: -#include "comm.h"
6818: -#include "inst.h"
6819: -#include <libc.h>
6820: -
6821: -#define FNS
6822: -#include "lib.h"
6823: -#undef FNS
6824: -
6825: -#define C 0x40000000
6826: -#define I 0x20000000
6827: -#define F 0x10000000
6828: -#define M(x) ((x)&~(C|I|F))
6829: -
6830: -long call0[]={ /* plain function, 0 arguments */
6831: - I+Ipushfp, C+0, F, I+Iret, C+0*WS, I+Idone, 0
6832: -};
6833: -long call1[]={ /* plain function, 1 argument */
6834: - I+Ipushfp, C+0, F, I+Iret, C+1*WS, I+Idone, 0
6835: -};
6836: -long call2[]={ /* plain function, 2 arguments */
6837: - I+Ipushfp, C+0, F, I+Iret, C+2*WS, I+Idone, 0
6838: -};
6839: -long call3[]={ /* plain function, 3 arguments */
6840: - I+Ipushfp, C+0, F, I+Iret, C+3*WS, I+Idone, 0
6841: -};
6842: -long call4[]={ /* plain function, 4 arguments */
6843: - I+Ipushfp, C+0, F, I+Iret, C+4*WS, I+Idone, 0
6844: -};
6845: -long call5[]={ /* plain function, 5 arguments */
6846: - I+Ipushfp, C+0, F, I+Iret, C+5*WS, I+Idone, 0
6847: -};
6848: -long call2_0[]={/* two-step function, 0 arguments */
6849: - I+Ipushfp, C+0, F+0, F+1, I+Iret, C+0*WS, I+Idone, 0
6850: -};
6851: -
6852: -struct{
6853: - char *name;
6854: - int (*fn[3])();
6855: - int nargs;
6856: - long *template;
6857: -}bltin[]={
6858: -#include "lib.h"
6859: - 0, {0, 0, 0}, 0, 0,
6860: -};
6861: -
6862: -bltinlookup(char *s)
6863: -{
6864: - int i;
6865: - for(i=0; bltin[i].name; i++)
6866: - if(strcmp(s, bltin[i].name)==0)
6867: - return i;
6868: - error("%s not a builtin", s);
6869: - return -1;
6870: -}
6871: -
6872: -long
6873: -bltinval(char *name, Node *t)
6874: -{
6875: - int i, nargs, len;
6876: - long *template, *p;
6877: - Store *s;
6878: - SWord *d;
6879: - if(t->o.t!=TProg)
6880: - error("builtin %s not a function", name);
6881: - i=bltinlookup(name);
6882: - nargs=bltin[i].nargs;
6883: - if(nargs!=length(t->l)) /* necessary but not sufficient */
6884: - error("wrong #args to builtin %s: %d (should be %d)", name, length(t->l), nargs);
6885: - template=bltin[i].template;
6886: - p=template;
6887: - for(len=0; *p; p++)
6888: - len++;
6889: - s=(Store *)emalloc(SHSZ+len*LWS);
6890: - s->ref=1;
6891: - s->type=Sprog;
6892: - s->sbits=0;
6893: - s->len=len;
6894: - d=s->data;
6895: - for(p=template; *p; p++)
6896: - if(*p&C)
6897: - *d++=(SWord)M(*p);
6898: - else if(*p&I)
6899: - *d++=(SWord)insttab[M(*p)].fp;
6900: - else if(*p&F)
6901: - *d++=(SWord)bltin[i].fn[M(*p)];
6902: - return (long)s;
6903: -}
6904: -
6905: -Store *
6906: -mk(type, len)
6907: -{
6908: - Store *s;
6909: - if(type==Sstruct)
6910: - len++;
6911: - s=(Store *)emalloc(SHSZ+len*LWS);
6912: - s->ref=1;
6913: - s->type=type;
6914: - if(type==Sstruct){
6915: - s->sbits=1;
6916: - s->data[0]=0;
6917: - }else
6918: - s->sbits=0;
6919: - s->len=len;
6920: - return s;
6921: -}
6922: -#include "node.h"
6923: -#include "symbol.h"
6924: -#include "alloc.h"
6925: -#include "ydefs.h"
6926: -#include "word.h"
6927: -#include "store.h"
6928: -#include "comm.h"
6929: -#include "inst.h"
6930: -#include "errjmp.h"
6931: -#include <libc.h>
6932: -
6933: -long resultloc;
6934: -long returnloc;
6935: -Node *formals;
6936: -long autooffset;
6937: -extern int bflag;
6938: -extern int cflag;
6939: -extern int nscope;
6940: -extern Node arychartype;
6941: -
6942: -compile(n) /* called from parser only */
6943: - Node *n;
6944: -{
6945: - extern long autooffset;
6946: - Errjmp x;
6947: - n=constants(n);
6948: - if(cflag){
6949: - fileline();
6950: - fprint(2, "constants:\n");
6951: - dump(n, 0);
6952: - }
6953: - errsave(x);
6954: - if(errmark()){
6955: - autooffset=0;
6956: - freenode(n);
6957: - errrest(x);
6958: - errjmp();
6959: - }
6960: - istart();
6961: - gen(n, 0);
6962: - freenode(n);
6963: - errrest(x);
6964: -}
6965: -
6966: -gen(Node *n, int retain)
6967: -{
6968: - int i;
6969: - if(n==0)
6970: - return;
6971: - switch(n->t){
6972: - case NArrayref:
6973: - arygen(n->l, n->r, 0, 0L);
6974: - if(!retain)
6975: - popgen(n->l->o.s->val->type->r);
6976: - return;
6977: - case NBecome:
6978: - if(n->l->t==NCall && !bflag){
6979: - callgen(n->l, Ibecome);
6980: - return;
6981: - }
6982: - gen(n->l, 1);
6983: - n=n->r;
6984: - if(n->o.t==TID)
6985: - n=typeoftid(n);
6986: - switch(n->o.t){
6987: - case TInt:
6988: - case TChar:
6989: - emit(Istoreauto);
6990: - emitconst(-LWS*(3+length(formals)));
6991: - break;
6992: - case TArray:
6993: - case TChan:
6994: - case TProg:
6995: - case TStruct:
6996: - emit(Istoreptrauto);
6997: - emitconst(-LWS*(3+length(formals)));
6998: - break;
6999: - case TUnit:
7000: - break;
7001: - default:
7002: - panic("can't compile %t become", n->o.t);
7003: - }
7004: - scopedecrefgen();
7005: - trlrgen();
7006: - return;
7007: - case NBegin:
7008: - callgen(n->l, Ibegin);
7009: - return;
7010: - case NCall:
7011: - callgen(n, Icall);
7012: - if(!retain)
7013: - popgen(etypeoft(n->l)->r);
7014: - return;
7015: - case NDecl:
7016: - case NDeclsc:
7017: - declare(n, 0, 0, 1);
7018: - return;
7019: - case NExpr:
7020: - switch(n->o.i){
7021: - case GE:
7022: - i=Ige;
7023: - Binop:
7024: - gen(n->l, 1);
7025: - gen(n->r, 1);
7026: - if(eqtype(etypeof(n->l), &arychartype)){
7027: - emit(Istrcmp);
7028: - constgen(0L);
7029: - }
7030: - emit(i);
7031: - Popit:
7032: - if(!retain)
7033: - emit(Ipop);
7034: - return;
7035: - case LE:
7036: - i=Ile;
7037: - goto Binop;
7038: - case NE:
7039: - i=Ine;
7040: - goto Binop;
7041: - case EQ:
7042: - i=Ieq;
7043: - goto Binop;
7044: - case '>':
7045: - i=Igt;
7046: - goto Binop;
7047: - case '<':
7048: - i=Ilt;
7049: - goto Binop;
7050: - case '+':
7051: - i=Iadd;
7052: - goto Binop;
7053: - case '-':
7054: - i=Isub;
7055: - goto Binop;
7056: - case '*':
7057: - i=Imul;
7058: - goto Binop;
7059: - case '/':
7060: - i=Idiv;
7061: - goto Binop;
7062: - case '%':
7063: - i=Imod;
7064: - goto Binop;
7065: - case '&':
7066: - i=Iand;
7067: - goto Binop;
7068: - case '|':
7069: - i=Ior;
7070: - goto Binop;
7071: - case '^':
7072: - i=Ixor;
7073: - goto Binop;
7074: - case LSH:
7075: - i=Ilsh;
7076: - goto Binop;
7077: - case RSH:
7078: - i=Irsh;
7079: - goto Binop;
7080: - case ANDAND:
7081: - condgen(n->l, n->r, Ijmptrue, Ijmpfalse, 0L, 1L, retain);
7082: - return;
7083: - case OROR:
7084: - condgen(n->l, n->r, Ijmpfalse, Ijmptrue, 1L, 0L, retain);
7085: - return;
7086: - case PRINT:
7087: - gen(n->l, 1);
7088: - printgen(n->l);
7089: - emit(Isprint);
7090: - if(!retain)
7091: - emit(Iprint);
7092: - return;
7093: - case SND:
7094: - gen(n->l, 1);
7095: - constgen((long)Cissnd);
7096: - emit(Icommset1);
7097: - emit(Icommcln1);
7098: - gen(n->r, 1);
7099: - if(isptrtype(etypeoft(n->l)->r))
7100: - emit(Isndptr);
7101: - else
7102: - emit(Isnd);
7103: - if(!retain)
7104: - popgen(etypeof(n));
7105: - return;
7106: - case RCV:
7107: - gen(n->l, 1);
7108: - constgen(0L); /* not Cissnd */
7109: - emit(Icommset1);
7110: - emit(Icommcln1);
7111: - return;
7112: - case '=':
7113: - gen(n->r, 1);
7114: - if(retain)
7115: - dupgen(etypeof(n->r), 1);
7116: - lgen(n->l);
7117: - return;
7118: - case LEN:
7119: - gen(n->l, 1);
7120: - emit(Ilen);
7121: - goto Popit;
7122: - case REF:
7123: - if(isptrtype(etypeof(n->l))){
7124: - gen(n->l, 1);
7125: - emit(Iref);
7126: - }else
7127: - constgen(1L);
7128: - goto Popit;
7129: - case DEF:
7130: - if(retain && n->l->t==NID && isinttype(etypeof(n->l))){
7131: - constgen(1L);
7132: - return;
7133: - }
7134: - /*
7135: - * don't really need to call lgen1, which will uniquify our
7136: - * array for us, but it does no harm, and it's easy.
7137: - */
7138: - lgen1(n->l, Idefauto, Idef, Idefary);
7139: - goto Popit;
7140: - case UMINUS:
7141: - gen(n->l, 1);
7142: - emit(Ineg);
7143: - goto Popit;
7144: - case '~':
7145: - gen(n->l, 1);
7146: - emit(Inot);
7147: - goto Popit;
7148: - case '!':
7149: - gen(n->l, 1);
7150: - emit(Ilnot);
7151: - goto Popit;
7152: - case INC:
7153: - lgen1(n->l, Iincauto, Iinc, Iincary);
7154: - goto Popit;
7155: - case DEC:
7156: - lgen1(n->l, Idecauto, Idec, Idecary);
7157: - goto Popit;
7158: - default:
7159: - panic("can't compile %e expression", n->o.i);
7160: - }
7161: -
7162: - case NExprlist:
7163: - /*
7164: - * This is an arg or element list; first is pushed last
7165: - */
7166: - gen(n->r, 1);
7167: - gen(n->l, 1);
7168: - return;
7169: - case NID:
7170: - if(!retain)
7171: - return;
7172: - switch(typeof(n)->o.t){
7173: - case TInt:
7174: - case TChar:
7175: - if(n->o.s->val->isauto){
7176: - emit(Ipushauto);
7177: - emitconst(n->o.s->val->store.off);
7178: - }else{
7179: - emit(Ipush);
7180: - emitconst((long)&n->o.s->val->store.l);
7181: - }
7182: - return;
7183: - case TProg:
7184: - case TArray:
7185: - case TChan:
7186: - case TStruct:
7187: - if(n->o.s->val->isauto){
7188: - emit(Ipushptrauto);
7189: - emitconst(n->o.s->val->store.off);
7190: - }else{
7191: - emit(Ipushptr);
7192: - emitconst((long)&n->o.s->val->store.l);
7193: - }
7194: - return;
7195: - case TUnit:
7196: - if(retain)
7197: - constgen(0L);
7198: - return;
7199: - case TType:
7200: - lerror(n, "attempt to evaluate type variable %m", n);
7201: - default:
7202: - panic("can't compile type %t", n->o.s->val->type->o.t);
7203: - }
7204: - case NIf:
7205: - ifgen(n);
7206: - return;
7207: - case NList:
7208: - gen(n->l, 0);
7209: - gen(n->r, 0);
7210: - return;
7211: - case NLoop:
7212: - loopgen(n);
7213: - return;
7214: - case NMk:
7215: - mkgen(n->l, n->r);
7216: - return;
7217: - case NNum:
7218: - if(retain)
7219: - constgen(n->o.l);
7220: - return;
7221: - case NProg:
7222: - if(retain)
7223: - proggen(n->l, n->r);
7224: - return;
7225: - case NResult:
7226: - gen(n->l, 1);
7227: - emit(Ijmp);
7228: - emitconst((long)(resultloc-here()-1)*WS);
7229: - return;
7230: - case NScope:
7231: - pushscope();
7232: - if(nscope==1){
7233: - int nauto;
7234: - autooffset=0;
7235: - emit(Ipushfp);
7236: - nauto=here();
7237: - emitconst(0L);
7238: - gen(n->l, 0);
7239: - patch((int)nauto, autooffset);
7240: - }else
7241: - gen(n->l, 0);
7242: - scopedecrefgen();
7243: - popscope();
7244: - return;
7245: - case NSelect:
7246: - selgen(n->l);
7247: - return;
7248: - case NSmash:{
7249: - Value *vl, *vr;
7250: - vl=n->l->o.s->val;
7251: - vr=n->r->o.s->val;
7252: - if(vr->type->o.t==TType){
7253: - freenode(vl->type);
7254: - vl->type=dupnode(vr->type);
7255: - return;
7256: - }
7257: - gen(n->r, 1);
7258: - /*
7259: - * Free old values; tricky: push as int, pop as ptr
7260: - */
7261: - if(isptrtype(vl->type)){
7262: - if(vl->isauto){
7263: - emit(Ipushauto);
7264: - emitconst(vl->store.off);
7265: - }else{
7266: - emit(Ipush);
7267: - emitconst((long)&vl->store.l);
7268: - }
7269: - emit(Ipopptr);
7270: - }
7271: - if(vl->isauto){
7272: - emit(Istoreauto);
7273: - emitconst(vl->store.l);
7274: - return;
7275: - }
7276: - emit(Istore);
7277: - emitconst((long)&vl->store.l);
7278: - return;
7279: - }
7280: - case NString:
7281: - if(retain){
7282: - Store *s;
7283: - s=(Store *)emalloc(SHSZ+strlen(n->o.c)+1);
7284: - strcpy((char *)(s->data), n->o.c);
7285: - s->ref=1;
7286: - s->len=strlen(n->o.c);
7287: - s->type=Sarychar;
7288: - emit(Ipushdata);
7289: - emitconst((long)s);
7290: - }
7291: - return;
7292: - case NStructref:
7293: - arygen(n->l, n->r, 1, n->o.l);
7294: - return;
7295: - case NSwitch:
7296: - switchgen(n->l, n->r);
7297: - return;
7298: - case NUnit:
7299: - if(retain)
7300: - constgen(0L);
7301: - return;
7302: - case NVal:
7303: - valgen(n->l);
7304: - if(!retain)
7305: - popgen(n->o.n);
7306: - return;
7307: - }
7308: - panic("can't compile node %n", n->t);
7309: - return;
7310: -}
7311: -
7312: -arygen(Node *a, Node *i, int isstr, long off)
7313: -{
7314: - int ptr, ischar;
7315: - if(isstr){
7316: - ptr=isptrtype(i);
7317: - constgen(off);
7318: - ischar=0;
7319: - }else{
7320: - Node *t=etypeoft(a)->r;
7321: - ptr=isptrtype(t);
7322: - gen(i, 1);
7323: - ischar=t->o.t==TChar;
7324: - }
7325: - if(a->t!=NID){
7326: - gen(a, 1);
7327: - emit(ptr? Ipusharyptrexpr :
7328: - (ischar? Ipusharycharexpr :Ipusharyexpr));
7329: - }else if(a->o.s->val->isauto){
7330: - emit(ptr? Ipusharyptrauto :
7331: - (ischar? Ipusharycharauto :Ipusharyauto));
7332: - emitconst(a->o.s->val->store.off);
7333: - }else{
7334: - emit(ptr? Ipusharyptr :
7335: - (ischar? Ipusharychar :Ipushary));
7336: - emitconst((long)&a->o.s->val->store.l);
7337: - }
7338: -}
7339: -
7340: -lgen(Node *n)
7341: -{
7342: - switch(n->t){
7343: - case NID:
7344: - switch(typeof(n)->o.t){
7345: - case TChar:
7346: - if(n->o.s->val->isauto){
7347: - emit(Istorecharauto);
7348: - emitconst(n->o.s->val->store.off);
7349: - return;
7350: - }
7351: - emit(Istorechar);
7352: - emitconst((long)&n->o.s->val->store.l);
7353: - return;
7354: - case TInt:
7355: - case TUnit:
7356: - if(n->o.s->val->isauto){
7357: - emit(Istoreauto);
7358: - emitconst(n->o.s->val->store.off);
7359: - return;
7360: - }
7361: - emit(Istore);
7362: - emitconst((long)&n->o.s->val->store.l);
7363: - return;
7364: - case TArray:
7365: - case TChan:
7366: - case TProg:
7367: - case TStruct:
7368: - if(n->o.s->val->isauto){
7369: - emit(Istoreptrauto);
7370: - emitconst(n->o.s->val->store.off);
7371: - return;
7372: - }
7373: - emit(Istoreptr);
7374: - emitconst((long)&n->o.s->val->store.l);
7375: - return;
7376: -
7377: - default:
7378: - panic("lgen: ID type %t", n->o.s->val->type->o.t);
7379: - return;
7380: - }
7381: - case NArrayref:
7382: - gen(n->r, 1);
7383: - goto Genref;
7384: - case NStructref:
7385: - constgen(n->o.l);
7386: - Genref:
7387: - lgen1(n->l, Ipushuniqauto, Ipushuniq, Ipushuniqary);
7388: - emit(Istoreary);
7389: - return;
7390: - default:
7391: - panic("lgen: lvalue node %n", n->t);
7392: - }
7393: -}
7394: -
7395: -/*
7396: - * n is a compound object about to be assigned into
7397: - */
7398: -lgen1(Node *n, int Iauto, int Ivar, int Iary)
7399: -{
7400: - switch(n->t){
7401: - case NID:
7402: - if(n->o.s->val->isauto){
7403: - emit(Iauto);
7404: - emitconst(n->o.s->val->store.off);
7405: - return;
7406: - }
7407: - emit(Ivar);
7408: - emitconst((long)&n->o.s->val->store.l);
7409: - return;
7410: - case NArrayref:
7411: - gen(n->r, 1);
7412: - goto Genref;
7413: - case NStructref:
7414: - constgen(n->o.l);
7415: - Genref:
7416: - lgen1(n->l, Ipushuniqauto, Ipushuniq, Ipushuniqary);
7417: - emit(Iary);
7418: - return;
7419: - default:
7420: - panic("lgen1: lvalue node %n", n->t);
7421: - }
7422: -}
7423: -
7424: -ifgen(Node *n)
7425: -{
7426: - int loc1, loc2;
7427: - gen(n->o.n, 1);
7428: - emit(Ijmpfalse);
7429: - loc1=here();
7430: - emit(0);
7431: - gen(n->l, 0);
7432: - if(n->r==0){
7433: - patch(loc1, (long)(here()-loc1-1)*WS);
7434: - return;
7435: - }
7436: - emit(Ijmp);
7437: - loc2=here();
7438: - emit(0);
7439: - patch(loc1, (long)(here()-loc1-1)*WS);
7440: - gen(n->r, 0);
7441: - patch(loc2, (long)(here()-loc2-1)*WS);
7442: - return;
7443: -}
7444: -
7445: -valgen(Node *n)
7446: -{
7447: - int loc1, loc2;
7448: - int orl;
7449: - emit(Ijmp);
7450: - loc1=here();
7451: - emitconst(0L);
7452: - orl=resultloc;
7453: - resultloc=here();
7454: - emit(Ijmp);
7455: - loc2=here();
7456: - emitconst(0L);
7457: - patch(loc1, (long)(here()-loc1-1)*WS);
7458: - gen(n, 1);
7459: - emit(Ivalnoresult);
7460: - patch(loc2, (long)(here()-loc2-1)*WS);
7461: - resultloc=orl;
7462: -}
7463: -
7464: -loopgen(Node *n)
7465: -{
7466: - int loc0, loc1, loc2;
7467: - if(n->o.i){ /* enter loop at top, so jump to body */
7468: - emit(Ijmp);
7469: - loc0=here();
7470: - emit(0);
7471: - }
7472: - gen(n->r->l, 0); /* left expr */
7473: - if(n->r->r){ /* jump to condition */
7474: - emit(Ijmp);
7475: - loc1=here();
7476: - emit(0);
7477: - }
7478: - if(n->o.i)
7479: - patch(loc0, (here()-loc0-1)*LWS);
7480: - loc2=here();
7481: - gen(n->l, 0); /* body */
7482: - gen(n->r->o.n, 0); /* right expr */
7483: - if(n->r->r){
7484: - patch(loc1, (here()-loc1-1)*LWS);
7485: - gen(n->r->r, 1);
7486: - emit(Ijmptrue);
7487: - }else
7488: - emit(Ijmp);
7489: - emitconst((loc2-here()-1)*LWS);
7490: -}
7491: -
7492: -condgen(Node *l, Node *r, Inst i1, Inst i2, long t1, long t2, int retain)
7493: -{
7494: - int loc1, loc2, loc3;
7495: - gen(l, 1);
7496: - emit(i1);
7497: - loc1=here();
7498: - emit(0);
7499: - loc2=here();
7500: - if(retain)
7501: - constgen(t1);
7502: - emit(Ijmp);
7503: - loc3=here();
7504: - emit(0);
7505: - patch(loc1, (long)(here()-loc1-1)*WS);
7506: - gen(r, 1);
7507: - emit(i2);
7508: - emitconst((long)(loc2-here()-1)*WS);
7509: - if(retain)
7510: - constgen(t2);
7511: - patch(loc3, (long)(here()-loc3-1)*WS);
7512: -}
7513: -
7514: -callgen(Node *n, int callinst)
7515: -{
7516: - Node *pt;
7517: - pt=etypeof(n->l);
7518: - /*
7519: - * Space for result
7520: - */
7521: - constgen(0L);
7522: - /*
7523: - * Args
7524: - */
7525: - gen(n->r, 1);
7526: - /*
7527: - * Call
7528: - */
7529: - emit(Ipushconst);
7530: - if(n->l->t==NID)
7531: - emitconst((long)n->l->o.s->name);
7532: - else{
7533: - char buf[128];
7534: - char *p;
7535: - sprint(buf, "prog(){call on line %d}", n->line);
7536: - p=emalloc((unsigned long)strlen(buf)+1);
7537: - strcpy(p, buf);
7538: - emitconst((long)p);
7539: - }
7540: - gen(n->l, 1);
7541: - switch(callinst){
7542: - case Icall:
7543: - emit(Icall);
7544: - return;
7545: - case Ibegin:
7546: - constgen(LWS*(1+1+length(pt->l))); /* result+procname+args */
7547: - emit(Ibegin);
7548: - return;
7549: - case Ibecome:
7550: - constgen(LWS*(1+1+length(pt->l))); /* result+procname+args */
7551: - scopedecrefgen();
7552: - fdecrefgen(formals, -3L*WS);
7553: - emit(Ibecome);
7554: - if(formals)
7555: - emitconst(length(formals)*LWS);
7556: - else
7557: - emitconst(0L);
7558: - return;
7559: - }
7560: - panic("callgen");
7561: -}
7562: -
7563: -selgen(Node *n)
7564: -{
7565: - int tbl, i;
7566: - long l;
7567: - int ends[200];
7568: - selchangen(n);
7569: - l=length(n);
7570: - constgen(l);
7571: - emit(Icommset);
7572: - emit(Icommcln);
7573: - if(l>(sizeof ends/sizeof ends[0]))
7574: - panic("selgen table too small");
7575: - tbl=here();
7576: - emitspace(l);
7577: - i=0;
7578: - seltblgen(n, tbl, ends, &i);
7579: - for(i=0; i<l; i++)
7580: - patch(ends[i], (long)(here()-ends[i]-1)*WS);
7581: -}
7582: -
7583: -selchangen(Node *n)
7584: -{
7585: - long flags;
7586: - if(n->t==NList){
7587: - selchangen(n->l);
7588: - selchangen(n->r);
7589: - return;
7590: - }
7591: - if(n->t!=NCase)
7592: - panic("selchangen");
7593: - n=n->l->l;
7594: - if(n->o.t=='=')
7595: - n=n->r; /* n is now RCV or SND */
7596: - flags=0;
7597: - if(n->o.t==SND)
7598: - flags|=Cissnd;
7599: - n=n->l; /* n is now channel */
7600: - if(n->t==NArraycom){
7601: - flags|=Cisary;
7602: - n=n->l;
7603: - }else if(etypeoft(n)->o.t==TArray)
7604: - flags|=Cisary;
7605: - gen(n, 1);
7606: - constgen(flags);
7607: -}
7608: -
7609: -seltblgen(Node *n, int tbl, int *ends, int *ip)
7610: -{
7611: - Node *c, *s, *l, *t;
7612: - if(n->t==NList){
7613: - /* chans are eval'ed from the top, so table is backwards */
7614: - seltblgen(n->r, tbl, ends, ip);
7615: - seltblgen(n->l, tbl, ends, ip);
7616: - return;
7617: - }
7618: - if(n->t!=NCase)
7619: - panic("seltblgen");
7620: - if(n->l->t==NList)
7621: - error("sorry, empty cases not implemented");
7622: - patch(tbl+*ip, (long)(here()-tbl)*WS);
7623: - c=n->l->l; /* communication */
7624: - s=n->r; /* statement */
7625: - l=0;
7626: - if(c->o.t=='='){
7627: - l=c->l; /* lvalue */
7628: - c=c->r;
7629: - }
7630: - if(c->o.t==SND){
7631: - gen(c->r, 1);
7632: - if(isptrtype(etypeoft(c->l)->r))
7633: - emit(Isndptr);
7634: - else
7635: - emit(Isnd);
7636: - }
7637: - c=c->l; /* channel expression */
7638: - /*
7639: - * The value is still on the stack; save it or toss it
7640: - */
7641: - if(l)
7642: - lgen(l);
7643: - else if(c->t==NArraycom){
7644: - t=etypeoft(c->l)->r;
7645: - if(t->o.t==TID)
7646: - t=typeoftid(t);
7647: - popgen(t->r);
7648: - }else
7649: - popgen(etypeoft(c)->r);
7650: - if(c->t==NArraycom){ /* save array index */
7651: - if(c->r)
7652: - lgen(c->r);
7653: - else
7654: - emit(Ipop);
7655: - }
7656: - gen(s, 0);
7657: - emit(Ijmp);
7658: - ends[*ip]=here();
7659: - (*ip)++;
7660: - emitconst(0L);
7661: -}
7662: -
7663: -switchgen(Node *s, Node *e)
7664: -{
7665: - int isptr, out;
7666: - isptr=isptrtype(etypeof(e));
7667: - gen(e, 1);
7668: - emit(Ijmp);
7669: - emitconst(2*LWS);
7670: - emit(Ijmp); /* each case jumps to here to get out */
7671: - out=here();
7672: - emitconst(0L);
7673: - switchgen1(s, isptr, out-1);
7674: - /* pop leftover value if no case matched */
7675: - if(isptr)
7676: - emit(Ipopptr);
7677: - else
7678: - emit(Ipop);
7679: - patch(out, (here()-out-1)*LWS);
7680: -}
7681: -
7682: -switchgen1(Node *s, int isptr, int out)
7683: -{
7684: - Node *e;
7685: - int loc;
7686: - if(s->t==NList){
7687: - switchgen1(s->l, isptr, out);
7688: - switchgen1(s->r, isptr, out);
7689: - return;
7690: - }
7691: - if(s->t!=NCase)
7692: - panic("switchgen1");
7693: - if(s->r==0)
7694: - error("sorry; can't fold cases together yet");
7695: - if(s->l->t==NDefault)
7696: - loc=-1;
7697: - else{
7698: - e=s->l->l;
7699: - if(isptr){ /* string */
7700: - emit(Idupptr);
7701: - gen(e, 1);
7702: - emit(Istrcmp);
7703: - constgen(0L);
7704: - }else{
7705: - emit(Idup);
7706: - gen(e, 1);
7707: - }
7708: - emit(Ieq);
7709: - emit(Ijmpfalse);
7710: - loc=here();
7711: - emitconst(0L);
7712: - }
7713: - if(isptr)
7714: - emit(Ipopptr);
7715: - else
7716: - emit(Ipop);
7717: - gen(s->r, 0);
7718: - emit(Ijmp);
7719: - emitconst((out-here()-1)*LWS);
7720: - if(loc!=-1)
7721: - patch(loc, (here()-loc-1)*LWS);
7722: -}
7723: -
7724: -popgen(Node *t)
7725: -{
7726: - if(isptrtype(t))
7727: - emit(Ipopptr);
7728: - else if(isinttype(t) || t->o.t==TUnit)
7729: - emit(Ipop);
7730: - else
7731: - panic("popgen %t\n", t->o.t);
7732: -}
7733: -
7734: -genfreeauto(Symbol *s)
7735: -{
7736: - if(!s->val->isauto)
7737: - panic("genfreeauto");
7738: - if(isptrtype(s->val->type)){
7739: - emit(Idecrefauto);
7740: - emitconst(s->val->store.off);
7741: - }
7742: -}
7743: -
7744: -printgen(Node *n)
7745: -{
7746: - Node *t;
7747: - if(n==0)
7748: - return;
7749: - if(n->t==NExprlist){
7750: - printgen(n->l);
7751: - printgen(n->r);
7752: - return;
7753: - }
7754: - t=etypeoft(n);
7755: - switch(t->o.t){
7756: - case TArray:
7757: - case TChan:
7758: - case TProg:
7759: - case TStruct:
7760: - emit(Iprintary);
7761: - break;
7762: - case TChar:
7763: - emit(Iprintchar);
7764: - break;
7765: - case TInt:
7766: - emit(Iprintint);
7767: - break;
7768: - case TUnit:
7769: - emit(Iprintunit);
7770: - break;
7771: - default:
7772: - panic("printgen: bad type %t", t->o.t);
7773: - }
7774: -}
7775: -
7776: -proggen(Node *t, Node *n)
7777: -{
7778: - int or;
7779: - Node *of;
7780: - Errjmp s;
7781: - Store *p;
7782: - long len, loc;
7783: - long nauto, oao;
7784: - extern int (*prog[])();
7785: - oao=autooffset;
7786: - or=returnloc;
7787: - of=formals;
7788: - autooffset=0;
7789: - returnloc=0;
7790: - formals=t->l;
7791: - errsave(s);
7792: - if(errmark()){
7793: - returnloc=or;
7794: - formals=of;
7795: - autooffset=oao;
7796: - errrest(s);
7797: - errjmp();
7798: - }
7799: - loc=here();
7800: - pushscope();
7801: - dclformals(t->l);
7802: - autooffset=0;
7803: - emit(Ipushfp);
7804: - nauto=here();
7805: - emitconst(0L);
7806: - gen(n, 0);
7807: - trlrgen();
7808: - patch((int)nauto, autooffset);
7809: - popscope();
7810: - errrest(s);
7811: - autooffset=oao;
7812: - returnloc=or;
7813: - formals=of;
7814: - len=here()-loc+1;
7815: - p=(Store *)emalloc(SHSZ+len*LWS);
7816: - memcpy((char *)(p->data), (char *)(prog+loc), len*LWS);
7817: - p->ref=1;
7818: - p->len=len;
7819: - p->type=Sprog;
7820: - setprog(loc);
7821: - emit(Ipushdata);
7822: - emitconst((long)p);
7823: -}
7824: -
7825: -trlrgen()
7826: -{
7827: - if(returnloc){
7828: - emit(Ijmp);
7829: - emitconst((long)(returnloc-here()-1)*WS);
7830: - return;
7831: - }
7832: - returnloc=here();
7833: - fdecrefgen(formals, -3L*WS);
7834: - emit(Iret);
7835: - if(formals)
7836: - emitconst(length(formals)*LWS);
7837: - else
7838: - emitconst(0L);
7839: -}
7840: -
7841: -fdecrefgen(Node *types, long offset)
7842: -{
7843: - if(types==0)
7844: - return 0;
7845: - if(types->t==NList){
7846: - offset=fdecrefgen(types->l, offset);
7847: - return fdecrefgen(types->r, offset);
7848: - }
7849: - if(types->t!=NFormal)
7850: - panic("fdecrefgen");
7851: - types=types->r;
7852: - if(isptrtype(types)){
7853: - emit(Idecrefauto);
7854: - emitconst(offset);
7855: - }
7856: - return offset-WS;
7857: -}
7858: -
7859: -dupgen(Node *t, int n)
7860: -{
7861: - while(n--)
7862: - emit(isptrtype(t)? Idupptr : Idup);
7863: -}
7864: -
7865: -mkgen(Node *t, Node *v)
7866: -{
7867: - switch(t->o.t){
7868: - case TChar:
7869: - case TInt:
7870: - case TUnit:
7871: - if(v)
7872: - gen(v, 1);
7873: - else
7874: - constgen(0L);
7875: - return;
7876: - case TID:
7877: - mkgen(typeoftid(t), v);
7878: - return;
7879: - case TChan:
7880: - if(v)
7881: - gen(v, 1);
7882: - else{
7883: - constgen((long)(sizeof(Chan)-sizeof(Store)));
7884: - mallocgen(t);
7885: - }
7886: - return;
7887: - case TArray:
7888: - if(v==0){
7889: - gen(t->l, 1);
7890: - mallocgen(t);
7891: - return;
7892: - }
7893: - gen(v, 1);
7894: - if(v->t!=NExprlist && eqtype(t, etypeof(v)))
7895: - return;
7896: - if(v->t==NString)
7897: - constgen((long)strlen(v->o.c));
7898: - else
7899: - constgen((long)length(v));
7900: - emit(Idup);
7901: - if(t->l)
7902: - gen(t->l, 1);
7903: - else
7904: - constgen(0L);
7905: - emit(Imax);
7906: - mallocgen(t);
7907: - if(t->r->o.t==TChar){
7908: - if(v->t==NString)
7909: - emit(Imemcpychar);
7910: - else
7911: - emit(Imemcpycharint);
7912: - }else
7913: - emit(Imemcpy);
7914: - return;
7915: - case TProg:
7916: - if(v==0){
7917: - v=new(NProg, dupnode(t), (Node *)0, (Node *)0);
7918: - gen(v, 1);
7919: - freenode(v);
7920: - return;
7921: - }
7922: - gen(v, 1);
7923: - return;
7924: - case TStruct:
7925: - if(v==0){
7926: - mallocgen(t);
7927: - return;
7928: - }
7929: - gen(v, 1);
7930: - if(v->t!=NExprlist && eqtype(t, etypeof(v)))
7931: - return;
7932: - constgen((long)length(v));
7933: - mallocgen(t);
7934: - emit(Imemcpystruct);
7935: - return;
7936: - default:
7937: - panic("mkgen: bad type %t", t->o.t);
7938: - }
7939: -}
7940: -
7941: -mallocgen(Node *t)
7942: -{
7943: - switch(t->o.t){
7944: - case TArray:
7945: - t=t->r;
7946: - if(t->o.t==TID)
7947: - t=typeoftid(t);
7948: - if(isptrtype(t)){
7949: - constgen((long)Saryptr);
7950: - emit(Imalloc);
7951: - }else if(t->o.t==TInt || t->o.t==TUnit){
7952: - constgen((long)Saryint);
7953: - emit(Imalloc);
7954: - }else if(t->o.t==TChar)
7955: - emit(Imallocarychar);
7956: - else
7957: - panic("mallocgen array of %t", t->o.t);
7958: - return;
7959: - case TStruct:{
7960: - int pos=0;
7961: - long bits=0;
7962: - t=t->l;
7963: - elembitsgen(t, &pos, &bits);
7964: - if(pos)
7965: - constgen(bits);
7966: - constgen((long)length(t));
7967: - emit(Imallocstruct);
7968: - return;
7969: - }
7970: - case TChan:
7971: - constgen((long)Schan);
7972: - emit(Imalloc);
7973: - return;
7974: - }
7975: - panic("mallocgen of %t", t->o.t);
7976: -}
7977: -
7978: -elembitsgen(Node *t, int *pos, long *bits)
7979: -{
7980: - int i;
7981: - if(t->t==NList){
7982: - elembitsgen(t->l, pos, bits);
7983: - elembitsgen(t->r, pos, bits);
7984: - return;
7985: - }
7986: - if(t->t!=NElem)
7987: - panic("elembitsgen %n", t->t);
7988: - for(i=length(t); --i>=0; ){
7989: - if(*pos==BPW){
7990: - constgen(*bits);
7991: - *pos=0;
7992: - *bits=0;
7993: - }
7994: - if(isptrtype(t->r))
7995: - *bits|=1L<<*pos;
7996: - (*pos)++;
7997: - }
7998: -}
7999: -
8000: -constgen(long l)
8001: -{
8002: - if(l<-2 || l>10){
8003: - emit(Ipushconst);
8004: - emitconst(l);
8005: - return;
8006: - };
8007: - switch((int)l){
8008: - case -2:
8009: - emit(Ipush_2);
8010: - break;
8011: - case -1:
8012: - emit(Ipush_1);
8013: - break;
8014: - case 0:
8015: - emit(Ipush0);
8016: - break;
8017: - case 1:
8018: - emit(Ipush1);
8019: - break;
8020: - case 2:
8021: - emit(Ipush2);
8022: - break;
8023: - case 3:
8024: - emit(Ipush3);
8025: - break;
8026: - case 4:
8027: - emit(Ipush4);
8028: - break;
8029: - case 5:
8030: - emit(Ipush5);
8031: - break;
8032: - case 6:
8033: - emit(Ipush6);
8034: - break;
8035: - case 7:
8036: - emit(Ipush7);
8037: - break;
8038: - case 8:
8039: - emit(Ipush8);
8040: - break;
8041: - case 9:
8042: - emit(Ipush9);
8043: - break;
8044: - case 10:
8045: - emit(Ipush10);
8046: - break;
8047: - default:
8048: - panic("constgen");
8049: - }
8050: -}
8051: -
8052: -printable(Node *n)
8053: -{
8054: - if(n==0)
8055: - return 0;
8056: - switch(n->t){
8057: - case NExpr:
8058: - return n->o.t!='=';
8059: - case NArrayref:
8060: - case NCall:
8061: - case NID:
8062: - case NMk:
8063: - case NNum:
8064: - case NProg:
8065: - case NString:
8066: - case NStructref:
8067: - case NUnit:
8068: - case NVal:
8069: - return 1;
8070: - }
8071: - return 0;
8072: -}
8073: -#include "alloc.h"
8074: -#include "node.h"
8075: -#include "symbol.h"
8076: -#include "ydefs.h"
8077: -#include "word.h"
8078: -#include "store.h"
8079: -#include <libc.h>
8080: -
8081: -Node *doconst();
8082: -extern int Cflag;
8083: -
8084: -Node *
8085: -constants(Node *n)
8086: -{
8087: - if(n==0)
8088: - return 0;
8089: - if(Cflag)
8090: - return n;
8091: - switch(n->t){
8092: - case NArrayref:
8093: - if(isconst(n))
8094: - return doconst(n);
8095: - break;
8096: - case NArraycom:
8097: - break;
8098: - case NBecome:
8099: - break;
8100: - case NBegin:
8101: - break;
8102: - case NCall:
8103: - break;
8104: - case NCase:
8105: - break;
8106: - case NDecl:
8107: - n->r=constants(n->r);
8108: - n->o.n=constants(n->o.n);
8109: - declare(n, 0, 0, 0);
8110: - return n;
8111: - case NDeclsc:
8112: - break;
8113: - case NDefault:
8114: - return n;
8115: - case NElem:
8116: - n->r=constants(n->r);
8117: - return n;
8118: - case NExpr:
8119: - switch(n->o.i){
8120: - case GE:
8121: - case LE:
8122: - case NE:
8123: - case EQ:
8124: - case '>':
8125: - case '<':
8126: - case '+':
8127: - case '-':
8128: - case '*':
8129: - case '/':
8130: - case '%':
8131: - case '&':
8132: - case '|':
8133: - case '^':
8134: - case ANDAND:
8135: - case OROR:
8136: - case LSH:
8137: - case RSH:
8138: - if(isconst(n->l) && isconst(n->r))
8139: - return doconst(n);
8140: - break;
8141: - case DEF:
8142: - case REF:
8143: - case LEN:
8144: - case UMINUS:
8145: - case '~':
8146: - case '!':
8147: - if(isconst(n->l))
8148: - return doconst(n);
8149: - break;
8150: - case PRINT:
8151: - case RCV:
8152: - case SND:
8153: - case INC:
8154: - case DEC:
8155: - break;
8156: - case '=':
8157: - break;
8158: - default:
8159: - fprint(2, "can't const expression %e\n", n->o.i);
8160: - return n;
8161: - }
8162: - break;
8163: - case NExprlist:
8164: - break;
8165: - case NFormal:
8166: - n->r=constants(n->r);
8167: - return n;
8168: - case NLabel:
8169: - break;
8170: - case NID:
8171: - if(isconst(n))
8172: - return doconst(n);
8173: - break;
8174: - case NIf:
8175: - n->l=constants(n->l);
8176: - n->r=constants(n->r);
8177: - n->o.n=constants(n->o.n);
8178: - if(isconst(n->o.n)){
8179: - Node *m;
8180: - gen(n->o.n, 1);
8181: - execute();
8182: - if(topofstack()){
8183: - m=n->l;
8184: - n->l=0;
8185: - }else{
8186: - m=n->r;
8187: - n->r=0;
8188: - }
8189: - freenode(n);
8190: - return m;
8191: - }
8192: - return n;
8193: - case NList:
8194: - break;
8195: - case NLoop:
8196: - break;
8197: - case NLoopexpr:
8198: - n->o.n=constants(n->o.n);
8199: - break;
8200: - case NMk:
8201: - break;
8202: - case NNum:
8203: - return n;
8204: - case NProg:
8205: - pushscope();
8206: - dclformals(n->l->l);
8207: - n->r=constants(n->r);
8208: - popscope();
8209: - return n;
8210: - case NResult:
8211: - break;
8212: - case NScope:
8213: - pushscope();
8214: - n->l=constants(n->l);
8215: - popscope();
8216: - return n;
8217: - case NSelect:
8218: - break;
8219: - case NSmash:
8220: - return n;
8221: - case NString:
8222: - return n;
8223: - case NSwitch:
8224: - break;
8225: - case NStructref:
8226: - if(isconst(n))
8227: - return (n);
8228: - break;
8229: - case NType:
8230: - break;
8231: - case NUnit:
8232: - break;
8233: - case NVal:
8234: - if(isconst(n->l))
8235: - return doconst(n);
8236: - break;
8237: - default:
8238: - fprint(2, "can't const node %n\n", n->t);
8239: - return n;
8240: - }
8241: - n->l=constants(n->l);
8242: - n->r=constants(n->r);
8243: - return n;
8244: -}
8245: -
8246: -isconst(Node *n)
8247: -{
8248: - if(n==0)
8249: - return 1;
8250: - switch(n->t){
8251: - case NArrayref:
8252: - return isconst(n->l) && isconst(n->r);
8253: - case NCall:
8254: - return 0;
8255: - case NExpr:
8256: - switch(n->o.i){
8257: - case GE:
8258: - case LE:
8259: - case NE:
8260: - case EQ:
8261: - case '>':
8262: - case '<':
8263: - case '+':
8264: - case '-':
8265: - case '*':
8266: - case '/':
8267: - case '%':
8268: - case '&':
8269: - case '|':
8270: - case '^':
8271: - case ANDAND:
8272: - case OROR:
8273: - case LSH:
8274: - case RSH:
8275: - return isconst(n->l) && isconst(n->r);
8276: - case DEF:
8277: - case LEN:
8278: - case UMINUS:
8279: - case '~':
8280: - case '!':
8281: - return isconst(n->l);
8282: - case REF:
8283: - case '=':
8284: - case RCV:
8285: - case SND:
8286: - case INC:
8287: - case DEC:
8288: - return 0;
8289: - }
8290: - fprint(2, "can't isconst expression %e", n->o.i);
8291: - return 0;
8292: - case NID:
8293: - return n->o.s->val->scope==0 && (n->o.s->val->stclass&SCconst);
8294: - case NIf:
8295: - return isconst(n->o.n) && isconst(n->l) && isconst(n->r);
8296: - case NList:
8297: - return 0;
8298: - case NLoop:
8299: - return 0;
8300: - case NNum:
8301: - return 1;
8302: - case NResult:
8303: - return isconst(n->l);
8304: - case NScope:
8305: - return isconst(n->l);
8306: - case NString:
8307: - return 1;
8308: - case NStructref:
8309: - return isconst(n->l);
8310: - case NVal:
8311: - return isconst(n->l);
8312: - case NUnit:
8313: - return 1;
8314: - }
8315: - fprint(2, "can't isconst node %n\n", n->t);
8316: - return 0;
8317: -}
8318: -
8319: -Node *
8320: -doconst(Node *n)
8321: -{
8322: - Node *t;
8323: - if(n->t==NNum || n->t==NString || n->t==NUnit)
8324: - return n; /* already const */
8325: - t=etypeoft(n);
8326: - switch(t->o.t){
8327: - case TChar:
8328: - case TInt:
8329: - gen(n, 1);
8330: - freenode(n);
8331: - execute();
8332: - return new(NNum, (Node *)0, (Node *)0, (Node *)topofstack());
8333: - case TUnit:
8334: - return new(NUnit, (Node *)0, (Node *)0, (Node *)0);
8335: - case TArray:
8336: - if(t->r->o.t==TChar){
8337: - Store *s;
8338: - char *c;
8339: - gen(n, 1);
8340: - freenode(n);
8341: - execute();
8342: - s=(Store *)topofstack();
8343: - c=emalloc(s->len+1);
8344: - strncpy(c, (char *)s->data, (int)s->len);
8345: - return newc(NString, (Node *)0, (Node *)0, c);
8346: - }
8347: - return n;
8348: - }
8349: - return n;
8350: -}
8351: -#include "alloc.h"
8352: -#include "word.h"
8353: -#include "store.h"
8354: -#include "comm.h"
8355: -#include <libc.h>
8356: -
8357: -extern int pflag;
8358: -
8359: -/*
8360: - * Jumps
8361: - */
8362: -
8363: -ijmp(Proc *proc)
8364: -{
8365: - SWord l;
8366: - l=(SWord)*++proc->pc;
8367: - proc->pc+=l/WS;
8368: - return 1;
8369: -}
8370: -
8371: -ijmpfalse(Proc *proc)
8372: -{
8373: - SWord l;
8374: - l=(SWord)*++proc->pc;
8375: - if(*--proc->sp==0)
8376: - proc->pc+=l/WS;
8377: - return 1;
8378: -}
8379: -
8380: -ijmptrue(Proc *proc)
8381: -{
8382: - SWord l;
8383: - l=(SWord)*++proc->pc;
8384: - if(*--proc->sp!=0)
8385: - proc->pc+=l/WS;
8386: - return 1;
8387: -}
8388: -
8389: -ivalnoresult(Proc *proc)
8390: -{
8391: - rerror("val produces no result");
8392: - return 0;
8393: -}
8394: -
8395: -/*
8396: - * Progs
8397: - *
8398: - * Layout of a stack frame
8399: - *
8400: - * sp:
8401: - * automatics
8402: - * fp: old fp
8403: - * old pc
8404: - * symbol
8405: - * arg1
8406: - * arg2
8407: - * ...
8408: - * result
8409: - */
8410: -
8411: -iret(Proc *proc)
8412: -{
8413: - SWord nargs;
8414: - nargs=(SWord)(proc->pc[1]);
8415: - proc->sp=(SWord *)proc->fp+1;
8416: - proc->fp=(SWord *)*--proc->sp;
8417: - proc->pc=(int (**)())*--proc->sp;
8418: - proc->sp-=(sizeof(char *)+nargs)/WS;
8419: - if(proc->pc==0){
8420: - if(pflag)
8421: - fprint(2, "%d halts\n", proc->procnum);
8422: - halt(proc);
8423: - return 0;
8424: - }
8425: - return 1;
8426: -}
8427: -
8428: -ibecome(Proc *proc)
8429: -{
8430: - int nargs;
8431: - int (**newpc)();
8432: - SWord oldfp, oldpc, *oldresultaddr, *newresultaddr;
8433: - Store *s;
8434: - nargs=*--proc->sp/LWS;
8435: - nargs+=2; /* includes result and sym; add pc, fp */
8436: - s=(Store *)*--proc->sp;
8437: - if(--(s->ref)==0)
8438: - rpanic("ibecome ref==0");
8439: - newpc=((int (**)())s->data);
8440: - oldfp=proc->fp[0];
8441: - oldpc=proc->fp[-1];
8442: - *proc->sp++=oldpc;
8443: - *proc->sp++=oldfp;
8444: - oldresultaddr=proc->fp-3-(long)(*++proc->pc)/LWS;
8445: - newresultaddr=proc->sp-nargs;
8446: - memcpy((char *)oldresultaddr, (char *)newresultaddr, LWS*nargs);
8447: - /* args in place. do the call by hand, jmp to pushfp */
8448: - proc->sp=oldresultaddr+(nargs-2);
8449: - *proc->sp++=oldpc;
8450: - proc->fp=(SWord *)oldfp;
8451: - proc->pc=newpc-1;
8452: - return 1;
8453: -}
8454: -
8455: -ipushfp(Proc *proc)
8456: -{
8457: - int nauto;
8458: - *proc->sp=(SWord)proc->fp;
8459: - proc->fp=proc->sp++;
8460: - nauto=((SWord)*++proc->pc)/WS;
8461: - while(nauto--)
8462: - *proc->sp++=0;
8463: - if(proc->sp>=&proc->stack[NSTACK])
8464: - rerror("stack overflow");
8465: - return 1;
8466: -}
8467: -
8468: -icall(Proc *proc)
8469: -{
8470: - int (**newpc)();
8471: - Store *s;
8472: - s=(Store *)*--proc->sp;
8473: - if(--(s->ref)==0)
8474: - rpanic("icall ref==0");
8475: - newpc=((int (**)())s->data);
8476: - *proc->sp++=(SWord)proc->pc;
8477: - proc->pc=newpc-1;
8478: - return 1;
8479: -}
8480: -#include "node.h"
8481: -#include "symbol.h"
8482: -#include "alloc.h"
8483: -#include "ydefs.h"
8484: -#include "word.h"
8485: -#include "store.h"
8486: -#include <libc.h>
8487: -
8488: -extern int nscope;
8489: -
8490: -declare(Node *n, int stclass, int dotypchk, int docomp)
8491: -{
8492: - extern int iflag;
8493: - if(n==0)
8494: - return;
8495: - if(n->t==NList){
8496: - declare(n->l, stclass, dotypchk, docomp);
8497: - declare(n->r, stclass, dotypchk, docomp);
8498: - return;
8499: - }
8500: - if(n->t==NDeclsc){
8501: - declare(n->l, n->o.i, dotypchk, docomp);
8502: - return;
8503: - }
8504: - if(dotypchk)
8505: - type(n->o.n, 0);
8506: - if(n->r==0){
8507: - if(n->o.n==0)
8508: - panic("declare: no type");
8509: - if(n->o.n->t==NMk && n->o.n->l==0)
8510: - lerror(n, "can't derive type in declaration");
8511: - n->r=dupnode(etypeof(n->o.n));
8512: - }
8513: - if(dotypchk){
8514: - type(n->r, 0);
8515: - if(n->o.n){
8516: - /*
8517: - * Make it a mk
8518: - */
8519: - if(n->o.n->t!=NMk)
8520: - n->o.n=new(NMk, (Node *)0, n->o.n, (Node *)0);
8521: - /*
8522: - * Default type for mk
8523: - */
8524: - if(n->o.n->l==0)
8525: - n->o.n->l=dupnode(n->r);
8526: - else if(!compattype(n->r, n->o.n->l))
8527: - lerror(n, "type clash in declaration (%t %t)\n",
8528: - n->r->o.t, etypeof(n->o.n)->o.t);
8529: - mkcheck(n->o.n->l, n->o.n->r);
8530: - }
8531: - }
8532: - if(docomp && n->o.n){
8533: - if(dotypchk) /* top level declaration */
8534: - n->o.n=constants(n->o.n);
8535: - gen(n->o.n, 1);
8536: - dupgen(n->r, length(n->l)-1);
8537: - }else
8538: - docomp=0;
8539: - dcl(n->l, n->r, stclass, n->o.n, docomp);
8540: - if(n->o.n && docomp && nscope==0){
8541: - if(iflag)
8542: - idump();
8543: - execute();
8544: - }
8545: -}
8546: -
8547: -dcl(id, typ, stclass, val, docomp)
8548: - Node *id, *typ, *val;
8549: -{
8550: - if(id->t==NList){
8551: - dcl(id->l, typ, stclass, val, docomp);
8552: - dcl(id->r, typ, stclass, val, docomp);
8553: - return;
8554: - }
8555: - if(typ->o.t==TID && typ->l->o.s->val->type->o.t!=TType)
8556: - error("%m not a type", typ->l);
8557: - if(id->t!=NID)
8558: - panic("dcl not ID");
8559: - pushval(id->o.s, dupnode(typ));
8560: - if(stclass&SCbltin)
8561: - id->o.s->val->store.l=bltinval(id->o.s->name, typ);
8562: - if(docomp)
8563: - lgen(id);
8564: - id->o.s->val->stclass=stclass;
8565: -}
8566: -
8567: -/*
8568: - * To compile this
8569: - * rec {
8570: - * x : chan of T = f(x,y);
8571: - * y : chan of T = g(x,y);
8572: - * };
8573: - * convert it to this
8574: - * x : chan of T = mk();
8575: - * y : chan of T = mk();
8576: - * x1 : chan of T = f(x,y);
8577: - * y1 : chan of T = g(x,y);
8578: - * x <- x1;
8579: - * y <- y1;
8580: - * toss x1, y1;
8581: - * where the operator x <- x1 means copy the representation of x1 into x.
8582: - *
8583: - * rec type T: struct of { t:T; };
8584: - *
8585: - * is handled similarly.
8586: - */
8587: -
8588: -Node *
8589: -op1(Node *n)
8590: -{
8591: - Node *m;
8592: - if(n->t==NDeclsc){
8593: - m=op1(n->l);
8594: - return newi(NDeclsc, m, (Node *)0, n->o.i);
8595: - }
8596: - if(n->r==0){
8597: - if(n->o.n && (n->o.n->t==NProg || (n->o.n->t==NMk && n->o.n->l)))
8598: - n->r=dupnode(n->o.n->l);
8599: - else
8600: - lerror(n, "can't deduce type for rec decl");
8601: - }else if(n->r->o.t==TType){
8602: - m=newi(NType, (Node *)0, (Node *)0, n->r->l->o.t);
8603: - m=new(NDecl, dupnode(n->l), m, (Node *)0);
8604: - return m;
8605: - }
8606: - m=new(NMk, dupnode(n->r), (Node *)0, (Node *)0);
8607: - m=new(NDecl, dupnode(n->l), dupnode(n->r), m);
8608: - return m;
8609: -}
8610: -
8611: -Node *
8612: -op2(Node *n)
8613: -{
8614: - Node *m;
8615: - char s[Namesize+2];
8616: - if(n->t==NDeclsc){
8617: - m=op2(n->l);
8618: - return newi(NDeclsc, m, (Node *)0, n->o.i);
8619: - }
8620: - if(n->l->t==NList)
8621: - error("no identifier lists in rec's, please");
8622: - strcpy(s+1, n->l->o.s->name);
8623: - s[0]='*';
8624: - m=new(NDecl, idnode(lookup(s, ID)), dupnode(n->r), dupnode(n->o.n));
8625: - return m;
8626: -}
8627: -
8628: -Node *
8629: -op3(Node *n)
8630: -{
8631: - Node *m;
8632: - char s[Namesize+2];
8633: - if(n->t==NDeclsc)
8634: - return op3(n->l);
8635: - if(n->l->t==NList)
8636: - error("no lists in rec's, please");
8637: - strcpy(s+1, n->l->o.s->name);
8638: - s[0]='*';
8639: - m=new(NSmash, idnode(lookup(s+1, ID)), idnode(lookup(s, ID)), (Node *)0);
8640: - return m;
8641: -}
8642: -
8643: -Node *
8644: -rewr(Node *n, Node *(*f)())
8645: -{
8646: - if(n->t==NList)
8647: - return new(NList, rewr(n->l, f), rewr(n->r, f), (Node *)0);
8648: - return (*f)(n);
8649: -}
8650: -
8651: -recrewrite(Node *n)
8652: -{
8653: - Node *n1, *n2, *n3;
8654: - n1=rewr(n->l, op1);
8655: - n2=rewr(n->l, op2);
8656: - n3=rewr(n->l, op3);
8657: - freenode(n->l);
8658: - n->t=NList;
8659: - n->r=n3;
8660: - n->l=new(NList, n1, n2, (Node *)0);
8661: - ndump(n);
8662: -}
8663: -
8664: -/*
8665: - *
8666: - * To compile this
8667: - *
8668: - * prog(a:int){
8669: - * begin prog(b:int){ f(a, b); }(b);
8670: - * }
8671: - *
8672: - * convert it to this
8673: - *
8674: - * prog(a:int){
8675: - * begin prog(b:int, a:int){ f(a, b); }(b, a);
8676: - * }
8677: - *
8678: - */
8679: -
8680: -Node *begf;
8681: -Node *bega;
8682: -int fscope;
8683: -int progerr;
8684: -
8685: -proglocals(Node *n)
8686: -{
8687: - progerr=1;
8688: - pushscope();
8689: - fscope=nscope;
8690: - begf=n->l->l;
8691: - bega=0;
8692: - dclformals(begf);
8693: - progid(n->r);
8694: - popscope();
8695: -}
8696: -
8697: -begrewrite(Node *n)
8698: -{
8699: - progerr=0;
8700: - pushscope();
8701: - fscope=nscope;
8702: - begf=n->l->l->l;
8703: - bega=n->r;
8704: - dclformals(begf);
8705: - progid(n->l->r);
8706: - popscope();
8707: - n->l->l->l=begf;
8708: - n->r=bega;
8709: -}
8710: -
8711: -addformal(Node *n)
8712: -{
8713: - Node *nf;
8714: - if(!alreadyformal(n, begf)){
8715: - nf=new(NFormal, dupnode(n), dupnode(n->o.s->val->type), (Node *)0);
8716: - if(begf)
8717: - begf=new(NList, begf, nf, (Node *)0);
8718: - else
8719: - begf=nf;
8720: - nf=dupnode(n);
8721: - if(bega)
8722: - bega=new(NExprlist, bega, nf, (Node *)0);
8723: - else
8724: - bega=nf;
8725: - }
8726: -}
8727: -
8728: -alreadyformal(Node *n, Node *f)
8729: -{
8730: - if(f==0)
8731: - return 0;
8732: - if(f->t==NList)
8733: - return alreadyformal(n, f->l) || alreadyformal(n, f->r);
8734: - return strcmp(n->o.s->name, f->l->o.s->name)==0;
8735: -}
8736: -
8737: -progid(Node *n)
8738: -{
8739: - if(n==0)
8740: - return;
8741: - switch(n->t){
8742: - case NArrayref:
8743: - case NArraycom:
8744: - case NBecome:
8745: - case NBegin:
8746: - case NCall:
8747: - case NCase:
8748: - break;
8749: - case NDecl:
8750: - progid(n->r);
8751: - progid(n->o.n);
8752: - declare(n, 0, 0, 0);
8753: - return;
8754: - case NDeclsc:
8755: - case NDefault:
8756: - break;
8757: - case NElem:
8758: - return;
8759: - case NExpr:
8760: - case NExprlist:
8761: - case NFormal:
8762: - break;
8763: - case NID:
8764: - if(n->o.s->val)
8765: - if(0<n->o.s->val->scope && n->o.s->val->scope<fscope){
8766: - if(progerr)
8767: - lerror(n, "%m not in an accessible scope", n);
8768: - addformal(n);
8769: - }
8770: - return;
8771: - case NLabel:
8772: - case NList:
8773: - case NLoop:
8774: - break;
8775: - case NLoopexpr:
8776: - progid(n->o.n);
8777: - break;
8778: - case NIf:
8779: - progid(n->o.n);
8780: - break;
8781: - case NMk:
8782: - break;
8783: - case NNum:
8784: - return;
8785: - case NProg:
8786: - pushscope();
8787: - dclformals(n->l->l);
8788: - progid(n->r);
8789: - popscope();
8790: - return;
8791: - case NResult:
8792: - break;
8793: - case NScope:
8794: - pushscope();
8795: - progid(n->l);
8796: - popscope();
8797: - return;
8798: - case NSelect:
8799: - break;
8800: - case NSmash:
8801: - return; /* ?? */
8802: - case NString:
8803: - return;
8804: - case NSwitch:
8805: - case NStructref:
8806: - break;
8807: - case NType:
8808: - break;
8809: - case NUnit:
8810: - return;
8811: - case NVal:
8812: - break;
8813: - default:
8814: - fprint(2, "can't progid node %n\n", n->t);
8815: - return;
8816: - }
8817: - progid(n->l);
8818: - progid(n->r);
8819: -}
8820: -
8821: -#include "nodenames.h"
8822: -#include "typenames.h"
8823: -#include "errjmp.h"
8824: -#include "node.h"
8825: -#include "symbol.h"
8826: -#include "ydefs.h"
8827: -#include <libc.h>
8828: -
8829: -lerror(Node *n, char *s, a, b, c, d, e, f)
8830: -{
8831: - lfileline(n->line);
8832: - fprint(2, s, a, b, c, d, e, f);
8833: - if(s[strlen(s)-1]!='\n')
8834: - fprint(2, "\n");
8835: - errflush();
8836: - errjmp();
8837: -}
8838: -
8839: -error(char *s, a, b, c, d, e, f)
8840: -{
8841: - fileline();
8842: - fprint(2, s, a, b, c, d, e, f);
8843: - if(s[strlen(s)-1]!='\n')
8844: - fprint(2, "\n");
8845: - errflush();
8846: - errjmp();
8847: -}
8848: -
8849: -rerror(char *s, a, b, c, d, e, f)
8850: -{
8851: - fileline();
8852: - fprint(2, s, a, b, c, d, e, f);
8853: - fprint(2, "\n");
8854: - processes(0);
8855: - errflush();
8856: - errjmp();
8857: -}
8858: -
8859: -warn(char *s, a, b, c, d, e, f)
8860: -{
8861: - fileline();
8862: - fprint(2, "warning: ");
8863: - fprint(2, s, a, b, c, d, e, f);
8864: - fprint(2, "\n");
8865: -}
8866: -
8867: -panic(char *s, a, b, c, d, e, f)
8868: -{
8869: - fileline();
8870: - fprint(2, "internal error: ");
8871: - fprint(2, s, a, b, c, d, e, f);
8872: - fprint(2, "\n");
8873: - abort();
8874: -}
8875: -
8876: -rpanic(char *s, a, b, c, d, e, f)
8877: -{
8878: - fileline();
8879: - processes(0);
8880: - fprint(2, "internal error: ");
8881: - fprint(2, s, a, b, c, d, e, f);
8882: - fprint(2, "\n");
8883: - abort();
8884: -}
8885: -
8886: -bconv(int *o, int f1, int f2)
8887: -{
8888: - extern int printcol;
8889: - while(printcol<*o-8)
8890: - strconv("\t", f1, f2);
8891: - strconv(" "+(8-(*o-printcol)), f1, f2);
8892: - return sizeof(int);
8893: -}
8894: -
8895: -nconv(int *o, int f1, int f2)
8896: -{
8897: - if(*o<0 || sizeof(Ntypename)/sizeof(Ntypename[0])<=*o)
8898: - strconv("mystery node", f1, f2);
8899: - else
8900: - strconv(Ntypename[*o], f1, f2);
8901: - return sizeof(int);
8902: -}
8903: -
8904: -tconv(int *o, int f1, int f2)
8905: -{
8906: - if(*o<0 || sizeof(Ttypename)/sizeof(Ttypename[0])<=*o)
8907: - strconv("mystery type", f1, f2);
8908: - else
8909: - strconv(Ttypename[*o], f1, f2);
8910: - return sizeof(int);
8911: -}
8912: -
8913: -char bufx[128][10];
8914: -int bufno=9;
8915: -
8916: -char *
8917: -prbuf(){
8918: - if(++bufno==10)
8919: - bufno=0;
8920: - return bufx[bufno];
8921: -}
8922: -
8923: -econv(int *o, int f1, int f2)
8924: -{
8925: - char *buf=prbuf();
8926: - char *x;
8927: - int t=*o;
8928: - if(t<128 && strchr("+-*/%|&^~?!><=", t))
8929: - sprint(buf, "%c", t);
8930: - else{
8931: - switch(t){
8932: - case GE:
8933: - x=">=";
8934: - break;
8935: - case LE:
8936: - x="<=";
8937: - break;
8938: - case NE:
8939: - x="!=";
8940: - break;
8941: - case EQ:
8942: - x="==";
8943: - break;
8944: - case ANDAND:
8945: - x="&&";
8946: - break;
8947: - case OROR:
8948: - x="||";
8949: - break;
8950: - case REF:
8951: - x="ref";
8952: - break;
8953: - case LEN:
8954: - x="len";
8955: - break;
8956: - case UMINUS:
8957: - x="unary -";
8958: - break;
8959: - case RCV:
8960: - x="rcv";
8961: - break;
8962: - case SND:
8963: - x="send";
8964: - break;
8965: - case LSH:
8966: - x="<<";
8967: - break;
8968: - case RSH:
8969: - x=">>";
8970: - break;
8971: - case DEC:
8972: - x="--";
8973: - break;
8974: - case INC:
8975: - x="++";
8976: - break;
8977: - default:
8978: - x="mystery expression";
8979: - break;
8980: - }
8981: - strcpy(buf, x);
8982: - }
8983: - strconv(buf, f1, f2);
8984: - return sizeof(int);
8985: -}
8986: -
8987: -mconv(int *o, int f1, int f2)
8988: -{
8989: - char *buf=prbuf();
8990: - Node *n=(Node *)*o;
8991: - switch(n->t){
8992: //GO.SYSIN DD regress.d/t6.i
8993: echo regress.d/t6.out 1>&2
8994: sed 's/.//' >regress.d/t6.out <<'//GO.SYSIN DD regress.d/t6.out'
8995: -emalloc(unsigned long n)
8996: -erealloc(char *p, unsigned long n)
8997: -pprint(proc, fmt, a, b, c, d, e)
8998: -bltinval(char *name, Node *t)
8999: -mk(type, len)
9000: -compile(n) /* called from parser only */
9001: -gen(Node *n, int retain)
9002: -lgen(Node *n)
9003: -genfreeauto(Symbol *s)
9004: -dupgen(Node *t, int n)
9005: -printable(Node *n)
9006: -constants(Node *n)
9007: -declare(Node *n, int stclass, int dotypchk, int docomp)
9008: -recrewrite(Node *n)
9009: -proglocals(Node *n)
9010: -begrewrite(Node *n)
9011: -lerror(Node *n, char *s, a, b, c, d, e, f)
9012: -error(char *s, a, b, c, d, e, f)
9013: -rerror(char *s, a, b, c, d, e, f)
9014: -warn(char *s, a, b, c, d, e, f)
9015: -panic(char *s, a, b, c, d, e, f)
9016: -rpanic(char *s, a, b, c, d, e, f)
9017: -bconv(int *o, int f1, int f2)
9018: -nconv(int *o, int f1, int f2)
9019: -tconv(int *o, int f1, int f2)
9020: -econv(int *o, int f1, int f2)
9021: -mconv(int *o, int f1, int f2)
9022: //GO.SYSIN DD regress.d/t6.out
9023: echo regress.d/t6.pat 1>&2
9024: sed 's/.//' >regress.d/t6.pat <<'//GO.SYSIN DD regress.d/t6.pat'
9025: -^Aconv\(
9026: -^Cconv\(
9027: -^Uconv\(
9028: -^bconv\(
9029: -^begrewrite\(
9030: -^bi_bread\(
9031: -^bi_close\(
9032: -^bi_open\(
9033: -^bi_rand\(
9034: -^bi_read\(
9035: -^bi_write\(
9036: -^bltinval\(
9037: -^compattype\(
9038: -^compile\(
9039: -^concat\(
9040: -^constants\(
9041: -^curproc\(
9042: -^dclformals\(
9043: -^declare\(
9044: -^decref\(
9045: -^dump\(
9046: -^dupgen\(
9047: -^dupnode\(
9048: -^econv\(
9049: -^elemrewr\(
9050: -^emalloc\(
9051: -^emit\(
9052: -^emitconst\(
9053: -^emitspace\(
9054: -^eqtype\(
9055: -^erealloc\(
9056: -^errflush\(
9057: -^error\(
9058: -^etypeof\(
9059: -^etypeoft\(
9060: -^execute\(
9061: -^exits\(
9062: -^fileline\(
9063: -^freenode\(
9064: -^gen\(
9065: -^genfreeauto\(
9066: -^halt\(
9067: -^here\(
9068: -^iconv\(
9069: -^idnode\(
9070: -^idump\(
9071: -^istart\(
9072: -^istopscope\(
9073: -^length\(
9074: -^lerror\(
9075: -^lexinit\(
9076: -^lfileline\(
9077: -^lgen\(
9078: -^lookup\(
9079: -^mconv\(
9080: -^mk\(
9081: -^mkcheck\(
9082: -^nargs\(
9083: -^nconv\(
9084: -^ndump\(
9085: -^new\(
9086: -^newc\(
9087: -^newfile\(
9088: -^newi\(
9089: -^newl\(
9090: -^panic\(
9091: -^patch\(
9092: -^popscope\(
9093: -^pprint\(
9094: -^printable\(
9095: -^processes\(
9096: -^procinit\(
9097: -^proglocals\(
9098: -^pushscope\(
9099: -^pushval\(
9100: -^recrewrite\(
9101: -^rerror\(
9102: -^rpanic\(
9103: -^run\(
9104: -^scopedecrefgen\(
9105: -^setprog\(
9106: -^tconv\(
9107: -^topofstack\(
9108: -^topscope\(
9109: -^type\(
9110: -^typeinit\(
9111: -^typeof\(
9112: -^typeoftid\(
9113: -^warn\(
9114: -^yylex\(
9115: -^yyparse\(
9116: //GO.SYSIN DD regress.d/t6.pat
9117: echo regress.d/t6.sh 1>&2
9118: sed 's/.//' >regress.d/t6.sh <<'//GO.SYSIN DD regress.d/t6.sh'
9119: -$GRE -f t6.pat < t6.i
9120: //GO.SYSIN DD regress.d/t6.sh
9121: echo regress.d/t7.i 1>&2
9122: sed 's/.//' >regress.d/t7.i <<'//GO.SYSIN DD regress.d/t7.i'
9123: - if [ `cat $HISTFILE | lct` -gt "$HISTMAXL" ]
9124: -
9125: -for i in `ls [0-9]*# | egrep '^[0-9]+##?$' | sed -e 's/#*$//'`
9126: -
9127: -do case "`ps -lx$i" in ?*);; *) rm -f ${i}# ${i}##;; esac
9128: -
9129: -NBRFILES=`ls -f $pubdir/jbk | fgrep -vi -x '.
9130: -
9131: -..'|lct`
9132: //GO.SYSIN DD regress.d/t7.i
9133: echo regress.d/t7.out 1>&2
9134: sed 's/.//' >regress.d/t7.out <<'//GO.SYSIN DD regress.d/t7.out'
9135: -do case "`ps -lx$i" in ?*);; *) rm -f ${i}# ${i}##;; esac
9136: -NBRFILES=`ls -f $pubdir/jbk | fgrep -vi -x '.
9137: -..'|lct`
9138: //GO.SYSIN DD regress.d/t7.out
9139: echo regress.d/t7.sh 1>&2
9140: sed 's/.//' >regress.d/t7.sh <<'//GO.SYSIN DD regress.d/t7.sh'
9141: -$GRE -G '^[^`]*`[^`]*$' < t7.i
9142: //GO.SYSIN DD regress.d/t7.sh
9143: echo regress.d/t8.i 1>&2
9144: sed 's/.//' >regress.d/t8.i <<'//GO.SYSIN DD regress.d/t8.i'
9145: -b
9146: -ba
9147: //GO.SYSIN DD regress.d/t8.i
9148: echo regress.d/t8.out 1>&2
9149: sed 's/.//' >regress.d/t8.out <<'//GO.SYSIN DD regress.d/t8.out'
9150: -b
9151: -ba
9152: //GO.SYSIN DD regress.d/t8.out
9153: echo regress.d/t8.sh 1>&2
9154: sed 's/.//' >regress.d/t8.sh <<'//GO.SYSIN DD regress.d/t8.sh'
9155: -$GRE -F -x -f t8.i < t8.i
9156: //GO.SYSIN DD regress.d/t8.sh
9157: echo regress.d/t9.i 1>&2
9158: sed 's/.//' >regress.d/t9.i <<'//GO.SYSIN DD regress.d/t9.i'
9159: -aba
9160: -cad
9161: -bad
9162: -acb
9163: //GO.SYSIN DD regress.d/t9.i
9164: echo regress.d/t9.out 1>&2
9165: sed 's/.//' >regress.d/t9.out <<'//GO.SYSIN DD regress.d/t9.out'
9166: -aba
9167: -bad
9168: -acb
9169: //GO.SYSIN DD regress.d/t9.out
9170: echo regress.d/t9.sh 1>&2
9171: sed 's/.//' >regress.d/t9.sh <<'//GO.SYSIN DD regress.d/t9.sh'
9172: -$GRE -F -f t8.i < t9.i
9173: //GO.SYSIN DD regress.d/t9.sh
9174: echo mkfile 1>&2
9175: sed 's/.//' >mkfile <<'//GO.SYSIN DD mkfile'
9176: -NPROC=2
9177: -CFLAGS=-DMEMMOVE -N -I/usr/include/lcc -I/usr/include/libc # -A -p -DPROFILING # -DUSE_STDIO
9178: -# CC should be an ansi compiler (or c++); OCC any old compiler
9179: -CC=lcc
9180: -OCC=cc
9181: -NAMES=main dofgrep dogre fns buffer
9182: -OBJ=${NAMES:%=%.o}
9183: -LIB=libc.a
9184: -LNAMES=cw bm re eg egcomp eglit egpos egstate egcw egbr egerror refile\
9185: - egparen egmatch egcanon
9186: -LOBJ=${LNAMES:%=$LIB(%.o)}
9187: -LLOBJ=${LNAMES:%=%.o}
9188: -SRC=${NAMES:%=%.c} ${LNAMES:%=%.c}
9189: -BUILTINS='%.o: %.c
9190: - $CC $CFLAGS -c $stem.c
9191: -'"`cat DEPEND`"
9192: -
9193: -all:V: gre cyntax
9194: -
9195: -gre: $OBJ $LIB
9196: - $CC $CFLAGS -o $target $prereq
9197: -
9198: -regress:VQ: #hcheck
9199: - make CC=$CC regress
9200: -
9201: -oregress:VQ:
9202: - rm -fr tmp
9203: - mkdir tmp tmp/regress.d
9204: - for i in $SRC *.h
9205: - do
9206: - awk -f deansify.awk $i > tmp/$i
9207: - done
9208: - cp makefile tmp
9209: - cp regress.d/* tmp/regress.d
9210: - (cd tmp; make CC=$OCC regress)
9211: - rm -fr tmp
9212: -
9213: -lt1: lt1.o $LIB
9214: - $CC $CFLAGS -o $target $prereq
9215: -
9216: -pp:V:
9217: - pr mkfile hdr.h $SRC | lp -dpsu -n2
9218: -
9219: -htest.o: htest.c
9220: - $CC $CFLAGS -DUSE_STDIO -c $prereq
9221: -htest: htest.o $LIB
9222: - $CC $CFLAGS -o $target $prereq
9223: -hcheck: htest
9224: - echo aabcdd | htest 'a+(b|c)*d+' tempa 0
9225: - echo abccccc | htest '^(a|b)*(abc+|c)' tempa 0
9226: - echo bccc | htest '(bc|bc+)' tempa 0
9227: - echo abab | htest '((b|a)+)\1' tempa 0
9228: - echo vivi | htest '^.+$' tempa '^(.+)$' tempb 01
9229: - echo acbb | htest '((.)+)\1' tempa 0
9230: - echo !gryphon.att.com!eby | time htest '^!([^!.]+)\.att\.com!(.+)$' tempa 0
9231: -
9232: -h1:V: htest
9233: - echo abc | time htest '^^.+!([^!]+2!([^!]+)$$' tempa 0
9234: -
9235: -check:V:
9236: - rm -f *.o gre refile libc.a
9237: - mk gre refile regress oregress
9238: - rm -f *.o gre refile libc.a
9239: -
9240: -bm.o: re.h lre.h hdr.h
9241: -buffer.o: re.h lre.h hdr.h
9242: -cw.o: re.h lre.h hdr.h
9243: -dofgrep.o: re.h lre.h hdr.h
9244: -dogre.o: re.h lre.h hdr.h
9245: -eg.o: re.h lre.h hdr.h
9246: -egbr.o: re.h lre.h hdr.h
9247: -egcomp.o: re.h lre.h hdr.h
9248: -egcw.o: re.h lre.h hdr.h
9249: -egerror.o: re.h /usr/include/stdio.h
9250: -eglit.o: re.h lre.h hdr.h
9251: -egmatch.o: re.h lre.h hdr.h
9252: -egparen.o: re.h lre.h hdr.h
9253: -egpos.o: re.h lre.h hdr.h
9254: -egstate.o: re.h lre.h hdr.h
9255: -fns.o: re.h lre.h hdr.h
9256: -main.o: re.h lre.h hdr.h
9257: -re.o: re.h lre.h hdr.h
9258: -refile.o: re.h lre.h
9259: -
9260: -$LIB(%.o):N: %.o
9261: -
9262: -$LIB:Q: $LOBJ
9263: - names=`membername $newprereq`
9264: - ar rv $target $names && rm $names
9265: - ranlib $target
9266: -
9267: -export:VQ:
9268: - what="$SRC hdr.h io.h re.h lre.h libc.h"
9269: - what="$what getopt.c" # for those without
9270: - what="$what `echo regress.d/*` mkfile makefile README"
9271: - what="$what tmac.an re.3 gre.1 deansify.awk"
9272: - cp /n/bowell/usr/man/man3/re.3 .
9273: - cp /n/bowell/usr/man/man1/gre.1 .
9274: - cp /usr/lib/tmac/tmac.an .
9275: - cp /usr/include/libc.h .
9276: - (echo mkdir regress.d; bundle $what) > gre.bundle
9277: - ls -l gre.bundle
9278: - rm re.3 libc.h gre.1 tmac.an
9279: -
9280: -%.rcp:V:
9281: - rcp gre.bundle $stem:/tmp
9282: - rsh $stem "cd /tmp; rm -fr gre; mkdir gre; cd gre; sh < ../gre.bundle; make regress && (cd ..; rm -fr gre gre.bundle)"
9283: -
9284: -DEPEND:D: $SRC
9285: - cdepend $OBJ $LLOBJ > DEPEND
9286: -
9287: -refile: refile.c $LIB
9288: - $CC $CFLAGS -DUSE_STDIO -o $target -DMAIN $prereq && rm refile.o
9289: -refile.o: refile.c
9290: - $CC $CFLAGS -DUSE_STDIO -c refile.c
9291: -extern:V: $LIB
9292: - nm $LIB | egrep -v ' [dtUb] |:| _re| _eg' | sort -u | mc
9293: -
9294: -poot:V: gre
9295: - gre -x '.|..' filex
9296: //GO.SYSIN DD mkfile
9297: echo makefile 1>&2
9298: sed 's/.//' >makefile <<'//GO.SYSIN DD makefile'
9299: -CFLAGS=-g -DUSE_STDIO -I. #-p -DPROFILING #
9300: -OBJ=main.o dofgrep.o dogre.o fns.o buffer.o cw.o bm.o eg.o egcomp.o eglit.o egpos.o egstate.o egcw.o egbr.o egmatch.o egcanon.o
9301: -HOBJ=htest.o eg.o egcomp.o eglit.o egpos.o egstate.o egcw.o egbr.o egmatch.o re.o cw.o refile.o egerror.o #dofgrep.o dogre.o fns.o buffer.o cw.o bm.o egcanon.o
9302: -
9303: -gre: $(OBJ)
9304: - $(CC) $(CFLAGS) -o gre $(OBJ)
9305: -
9306: -htest: $(HOBJ)
9307: - $(CC) $(CFLAGS) -o htest $(HOBJ)
9308: -
9309: -regress:
9310: - rm -f buffer.o; make CC=$(CC) CFLAGS="$(CFLAGS) -DBUFSIZE=500" gre
9311: - cd regress.d; make GRE=../gre
9312: - rm -f buffer.o gre
9313: //GO.SYSIN DD makefile
9314: echo README 1>&2
9315: sed 's/.//' >README <<'//GO.SYSIN DD README'
9316: -installation should be quite easy. set CFLAGS (in makefile)
9317: -to include a -DUSE_STDIO if you want to use stdio. otherwise
9318: -you will need fio. if you have a memmove in your C library,
9319: -use -DMEMMOVE; otherwise it will use memcpy (definition in hdr.h).
9320: -
9321: -a simple regression test can be done by make regress.
9322: -
9323: -the default C compiler is assumed to be ansi compliant (or c++).
9324: -if you don't have one, there is a deansify.awk to help.
9325: -look at the target oregress for how i use it.
9326: -
9327: -bugs to [email protected]
9328: -
9329: -
9330: -things to do:
9331: - multibyte chars
9332: //GO.SYSIN DD README
9333: echo tmac.an 1>&2
9334: sed 's/.//' >tmac.an <<'//GO.SYSIN DD tmac.an'
9335: -'''\" PWB Manual Entry Macros - 1.36 of 11/11/80
9336: -'''\" Nroff/Troff Version @(#)1.36
9337: -'''\" Option -rs1 short (9") pages
9338: -'''\" Option -rp# set no. of first page, put no. of pgs. on stderr
9339: -'''\" Option -rd1 give modified date instead of printed date
9340: -.deth
9341: -.tmwrong version of man entry macros - use -man6
9342: -.ab
9343: -..
9344: -.ifn .ds Tm \uTM\d
9345: -.ift .ds Tm \v'-0.5m'\s-4TM\s+4\v'0.5m'
9346: -.de}E
9347: -.}f
9348: -.in\\n()Ru+\\n(INu
9349: -.ll\\n(LLu
9350: -.lt\\n(LLu
9351: -.pl\\n()Lu
9352: -..
9353: -.deDT
9354: -.ift .ta 3.6m 7.2m 10.8m 14.4m 18m 21.6m 25.2m 28.8m 32.4m 36m 39.6m 43.2m 46.8m
9355: -.ifn .ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n
9356: -..
9357: -.de HY
9358: -.hy14
9359: -..
9360: -.de}f
9361: -.ift .vs \\n()Vp
9362: -.ps\\n()S
9363: -.ft1
9364: -..
9365: -.de}H
9366: -.ev1
9367: -.}C
9368: -.}E
9369: -.ie\\n()s 'sp |2v
9370: -.el'sp |3v
9371: -.".ps\\n()S-1
9372: -.".iet .bd1 3
9373: -.".el.bd1 0
9374: -.tl \\*(]H\\*(]L\\*(]H
9375: -.bd1
9376: -.ps\\n()S
9377: -.ie\\n()s 'sp 1.5v
9378: -.el'sp 3v
9379: -.ev
9380: -.ns
9381: -.if \\n(CL .2C
9382: -..
9383: -.de}F
9384: -.ev1
9385: -.}E
9386: -.if\\n()s 'sp |\\n(.pu-1v-1p
9387: -.if\\n()t 'sp |\\n(.pu-3v
9388: -.ifn 'sp |\\n(.pu-4v
9389: -.ifn .tl Page %\\*(]D\\*(]W
9390: -.if\\n()s .tl - % -
9391: -.if\\n()t \{.if o .tl Page %\\*(]D\\*(]W
9392: -.ife .tl \\*(]W\\*(]DPage % \}
9393: -.ev
9394: -'bp
9395: -..
9396: -.ifn .ig
9397: -.de}C
9398: -.if "\\*(.T"aps"\{\
9399: -. po0i
9400: -. lt7.5i
9401: -. if\\n()s .tl \l0.25i\l0.25i\h1i\l0.25i
9402: -. if\\n()t .tl \l0.25i\l0.25i
9403: -. lt
9404: -. po\}
9405: -..
9406: -.de}M
9407: -.}N
9408: -.wh-.5p }C
9409: -.ll\\n(LLu
9410: -.}P
9411: -..
9412: -.de}K
9413: -.}N
9414: -.pl1
9415: -.ll\\n(LLu
9416: -..
9417: -.de}P
9418: -.nr )P \\n%+1-\\np
9419: -.if \\nq .tm \\n(.F \\n()P \\np
9420: -.bp
9421: -.if \\nq .nr p \\n%
9422: -..
9423: -.deTH
9424: -.PD
9425: -.nrIN \\n()Mu
9426: -.ift .ds ]H \\$1\^(\^\\$2\^)
9427: -.ifn .ds ]H \\$1(\\$2)
9428: -.if\\n()s .ds ]D
9429: -.if\\n()t .ds ]D Tenth Edition
9430: -.ifn .ds ]D Tenth Edition
9431: -.ds]L
9432: -.if!\\$3 .ds ]L (\^\\$3\^)
9433: -.if!\\$4 .ds ]D \\$4
9434: -.wh0 }H
9435: -.wh-\\n(:mu }F
9436: -.em}M
9437: -.if\\n(nl .}P
9438: -.nr)I \\n()Mu
9439: -.nr)R 0
9440: -.}E
9441: -.DT
9442: -.ifn \{.na
9443: -.nh\}
9444: -.ift \{.bd S 3 3
9445: -.HY \}
9446: -..
9447: -.deSH
9448: -.PD
9449: -.}X 0 "\\$1" smaller
9450: -.nr)E 2
9451: -\&\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6
9452: -..
9453: -.deSS
9454: -.}X 3n "" ""
9455: -.nr)E 2
9456: -\&\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6
9457: -..
9458: -.de}X
9459: -.}E
9460: -.ti\\$1
9461: -.sp\\n(PDu
9462: -.ne1.1v
9463: -.nr)R 0
9464: -.fi
9465: -'''ss12
9466: -'''if\\$2SYNOPSIS .ss 18
9467: -.it1 }N
9468: -.if!\\$3 .SM
9469: -.iet .bd1 3
9470: -.el.bd1 0
9471: -..
9472: -.de}2
9473: -.nr)E 0
9474: -.}E
9475: -.nr)I \\n()Mu
9476: -.ns
9477: -.bd1
9478: -..
9479: -.deSM
9480: -.nh
9481: -.ps\\n()S-1
9482: -.if!\\$1 \&\\$1
9483: -.if!\\$2 \&\\$2
9484: -.if!\\$3 \&\\$3
9485: -.if!\\$4 \&\\$4
9486: -.if!\\$5 \&\\$5
9487: -.if!\\$6 \&\\$6
9488: -.if!\\$1 .ps \\n()S
9489: -.if\\$1 .it 1 }N
9490: -.HY
9491: -..
9492: -.deI
9493: -.nh
9494: -.ft2
9495: -.it1 }N
9496: -.if!\\$1 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
9497: -.HY
9498: -..
9499: -.deB
9500: -.nh
9501: -.it1 }N
9502: -.ie!\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
9503: -.el .ft5
9504: -.HY
9505: -..
9506: -.deL
9507: -.nh
9508: -.it1 }N
9509: -.ift \{.ie!\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
9510: -.el .ft5 \}
9511: -.ifn \{.ft5
9512: -.if!\\$1 \{.ie\\$2 `\\$1'
9513: -.el .ie\\$3 `\\$1 \\$2'
9514: -.el .ie\\$4 `\\$1 \\$2 \\$3'
9515: -.el .ie\\$5 `\\$1 \\$2 \\$3 \\$4'
9516: -.el .ie\\$6 `\\$1 \\$2 \\$3 \\$4 \\$5'
9517: -.el `\\$1 \\$2 \\$3 \\$4 \\$5 \\$6'\}\}
9518: -.HY
9519: -..
9520: -.deF
9521: -.nh
9522: -.it1 }N
9523: -.ie!\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
9524: -.el .ft5
9525: -.HY
9526: -..
9527: -.deRI
9528: -.nh
9529: -.}S 1 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
9530: -.HY
9531: -.}f
9532: -..
9533: -.deIR
9534: -.nh
9535: -.}S 2 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
9536: -.HY
9537: -.}f
9538: -..
9539: -.deIB
9540: -.nh
9541: -.ift .}S 2 5 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
9542: -.ifn .}S 2 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
9543: -.HY
9544: -.}f
9545: -..
9546: -.deRB
9547: -.nh
9548: -.ift .}S 1 5 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
9549: -.ifn .}S 1 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
9550: -.HY
9551: -.}f
9552: -..
9553: -.deBR
9554: -.nh
9555: -.ift .}S 5 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
9556: -.ifn .}S 1 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
9557: -.HY
9558: -.}f
9559: -..
9560: -.deBI
9561: -.nh
9562: -.ift .}S 5 2 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
9563: -.ifn .}S 1 2 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
9564: -.HY
9565: -.}f
9566: -..
9567: -.de LR
9568: -.nh
9569: -.ift \%\&\f5\\$1\f1\\$2
9570: -.ifn \%`\\$1'\\$2
9571: -.HY
9572: -..
9573: -.de RL
9574: -.nh
9575: -.ift \%\&\f1\\$1\\f5\\$2\\f1\\$3
9576: -.ifn \%\\$1`\\$2'\\$3
9577: -.HY
9578: -..
9579: -.de}S
9580: -.ds]F
9581: -.if\\$12 .if !\\$5 .ds ]F \^
9582: -.if\\$22 .if !\\$5 .ds ]F \^
9583: -.ie!\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(]F" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9"
9584: -.el\\$3
9585: -.}f
9586: -..
9587: -.deFR
9588: -\%\&\f5\\$1\f1\\$2 \\$3 \\$4 \\$5 \\$6
9589: -..
9590: -.deRF
9591: -\%\&\f1\\$1\f5\\$2\f1\\$3
9592: -..
9593: -.deEX
9594: -.ift .ft5
9595: -.nf
9596: -..
9597: -.deEE
9598: -.ft1
9599: -.fi
9600: -..
9601: -.dePP
9602: -.sp\\n(PDu
9603: -.ne1.1v
9604: -.}E
9605: -.nr)I \\n()Mu
9606: -.ns
9607: -..
9608: -.deP
9609: -.PP
9610: -..
9611: -.deLP
9612: -.PP
9613: -..
9614: -.dePD
9615: -.ift .nr PD .4v
9616: -.ifn .nr PD 1v
9617: -.if!\\$1 .nr PD \\$1v
9618: -..
9619: -.deHP
9620: -.sp\\n(PDu
9621: -.ne1.1v
9622: -.if!\\$1 .nr )I \\$1n
9623: -.ll\\n(LLu
9624: -.in\\n()Ru+\\n(INu+\\n()Iu
9625: -.ti\\n()Ru+\\n(INu
9626: -.}f
9627: -..
9628: -.deIP
9629: -.ie!\\$1 \{.TP "\\$2"
9630: -\&\\$1\}
9631: -.el\{.sp\\n(PDu
9632: -.ne1.1v
9633: -.if!\\$2 .nr )I \\$2n
9634: -.}f
9635: -.ll\\n(LLu
9636: -.in\\n()Ru+\\n(INu+\\n()Iu
9637: -.lg\}
9638: -..
9639: -.deTP
9640: -.if!\\$1 \{.nr )I \\$1n
9641: -.if\\$10 .nr )I \\n()M\}
9642: -.sp\\n(PDu
9643: -.ne1.1v
9644: -.in\\n()Ru
9645: -.lg0
9646: -.ns
9647: -.it1 }N
9648: -.nr)E 1
9649: -.di]B
9650: -..
9651: -.deTF
9652: -.IP "" \w'\f5\\$1\ \ \fP'u
9653: -.PD0
9654: -..
9655: -.de}1
9656: -.ds]X \&\\*(]B\\
9657: -.rm]B
9658: -.nr)E 0
9659: -.if!\\$1 .nr )I \\$1n
9660: -.}f
9661: -.ll\\n(LLu
9662: -.in\\n()Ru+\\n(INu+\\n()Iu
9663: -.ti\\n(INu
9664: -.ie!\\n()Iu+\\n()Ru-\w\\*(]Xu-3p \{\\*(]X
9665: -.br\}
9666: -.el\\*(]X\h|\\n()Iu+\\n()Ru\c
9667: -.}f
9668: -.lg
9669: -..
9670: -.de}N
9671: -.if\\n()E .br
9672: -.if\\n()E1 .di
9673: -.if\\n()E0 .}f
9674: -.if\\n()E1 .}1
9675: -.if\\n()E2 .}2
9676: -..
9677: -.deRS
9678: -.nr]\\n+()p \\n()I
9679: -.nr)\\n()p \\n()R
9680: -.ie!\\$1 .nr )R +\\$1n
9681: -.el.nr )R +\\n()I
9682: -.nr)I \\n()Mu
9683: -.}E
9684: -..
9685: -.deRE
9686: -.if!\\$1 \{.ie \\$10 .nr )p 1 1
9687: -.el.nr )p \\$1 1 \}
9688: -.ds]i \\*(]I\\n()p
9689: -.ds]r \\*(]R\\n()p
9690: -.nr)I \\*(]i
9691: -.nr)R \\*(]r
9692: -.if\\n()p .nr )p -1
9693: -.}E
9694: -..
9695: -'''\" .2C begin 2-column display, by diversion
9696: -'''\" CC=amount of text that will fit on page
9697: -'''\" CL=1 multicolumn in effect, else 0
9698: -'''\" CI saved indent
9699: -'''\" CB contains diverted text
9700: -.de 2C
9701: -.ne 2
9702: -.nf
9703: -.nr CC \\n(.t/1v*2v
9704: -.nr CI \\n(IN
9705: -.nr IN 0
9706: -.di CB
9707: -.nr CL 1
9708: -.}E
9709: -.dt \\n(CCu C1
9710: -..
9711: -'''\" .1C return to 1-column
9712: -.de 1C
9713: -.nr CL 0
9714: -.C1
9715: -.fi
9716: -..
9717: -'''\" end of diversion, at end of page or return to 1-column
9718: -'''\" CC=pos of nominal column end
9719: -.de C1
9720: -.dt
9721: -\!.C3
9722: -.di
9723: -.if \\n(dn \{.nr CC \\n(dnu/2u+\\n(nlu
9724: -.wh \\n(CCu C2
9725: -.mk
9726: -.nf
9727: -.nr IN \\n(CIu
9728: -.}E
9729: -.CB \}
9730: -..
9731: -'''\" end of first column retrieved from diversion
9732: -'''\" CC=pos of actual column end
9733: -.de C2
9734: -.wh \\n(CCu
9735: -.mk CC
9736: -.po +(\\n(LLu/2u)u
9737: -.rt
9738: -.if \\n(dn>1v .ns
9739: -..
9740: -'''\" end of second column
9741: -.de C3
9742: -.br
9743: -.po -(\\n(LLu/2u)u
9744: -.if \\n(CC>\\n(nl .sp |\\n(CCu
9745: -.ne 2
9746: -..
9747: -.dePM
9748: -.if\\$1 .nr !K 0
9749: -.if\w\\$1 \{\
9750: -.ie\\$1P .nr !K 1
9751: -.el.ie \\$1BP .nr !K 3
9752: -.el.ie \\$1BR .nr !K 4
9753: -.el.nr !K 2 \}
9754: -.if\\n(!K .wh -(\\n(:mu+5v) )G
9755: -..
9756: -.de)G
9757: -.if\\n(!K 'sp 2v
9758: -.ie\\n(!K=1 \{\
9759: -.iet .bd1 3
9760: -.el.bd1 0
9761: -.tlPRIVATE
9762: -.bd1
9763: -.tlThis information should not be disclosed to unauthorized persons.
9764: -.tlIt is meant solely for use by authorized Bell System employees. \}
9765: -.el.ie \\n(!K=3 \{\
9766: -.iet .bd1 3
9767: -.el.bd1 0
9768: -.tlBELL LABORATORIES PROPRIETARY
9769: -.bd1
9770: -.tlNot for use or disclosure outside Bell Laboratories except by
9771: -.tlwritten approval of the director of the distributing organization. \}
9772: -.el.ie \\n(!K=4 \{\
9773: -.iet .bd1 3
9774: -.el.bd1 0
9775: -.tlBELL LABORATORIES RESTRICTED
9776: -.bd1
9777: -.tlThe information herein is meant solely for use by authorized
9778: -.tlBell Laboratories employees and is not to be disclosed to others. \}
9779: -.el.if \\n(!K=2 \{\
9780: -.iet .bd1 3
9781: -.el.bd1 0
9782: -.tlNOTICE
9783: -.bd1
9784: -.tlNot for use or disclosure outside the
9785: -.tlBell System except under written agreement. \}
9786: -..
9787: -.nr)s 0
9788: -.ift .if \ns .nr )s 1
9789: -.nr)t 0
9790: -.ift .if !\ns .nr )t 1
9791: -.if\n()s \{.nr )L 9i
9792: -.nrLL 4.75i
9793: -.nr)O .75i
9794: -.nr)S 9
9795: -.nr)V 10 \}
9796: -.if\n()t \{.nr )L 11i
9797: -.nrLL 6.5i
9798: -.nr)O 1i
9799: -.nr)S 10
9800: -.nr)V 12 \}
9801: -.ift \{.ds R \(rg
9802: -.dsS \s\n()S
9803: -..\}
9804: -.ifn \{.nr )L 11i
9805: -.nrLL 6.5i
9806: -.nr)O .463i
9807: -.if '\*(.T'think' \{.nrLL 80n
9808: -.nr)O 0\}
9809: -.if '\*(.T'thinksmall' \{.nrLL 142n
9810: -.vs 9p
9811: -.nr)O 0\}
9812: -.dsR (Reg.)
9813: -.dsS
9814: -..\}
9815: -.if\nT .nr LL 80n
9816: -.if\nV>1 \{
9817: -.nrLL 82n
9818: -.nr)L 84v
9819: -.rmul \}
9820: -.nr)p 0 1
9821: -.ds]I \\\\n(]
9822: -.ds]R \\\\n()
9823: -.if\nd0 .nr m \n(mo-1
9824: -.if\nm0 .ds ]m January
9825: -.if\nm1 .ds ]m February
9826: -.if\nm2 .ds ]m March
9827: -.if\nm3 .ds ]m April
9828: -.if\nm4 .ds ]m May
9829: -.if\nm5 .ds ]m June
9830: -.if\nm6 .ds ]m July
9831: -.if\nm7 .ds ]m August
9832: -.if\nm8 .ds ]m September
9833: -.if\nm9 .ds ]m October
9834: -.if\nm10 .ds ]m November
9835: -.if\nm11 .ds ]m December
9836: -.ifn \{.nr m \nm+1
9837: -.ie\nd .ds ]W (last mod. \nm/\nd/\ny)
9838: -.el.ds ]W (printed \n(mo/\n(dy/\n(yr)
9839: -..\}
9840: -.if\n()s .ds ]W
9841: -.if\n()t \{.ie \nd .ds ]W \*(]m \nd, 19\ny
9842: -.el.ds ]W \*(]m \n(dy, 19\n(yr
9843: -..\}
9844: -.pl\n()Lu
9845: -.ll\n(LLu
9846: -.lt\n(LLu
9847: -.po\n()Ou
9848: -.fp 5 L CW
9849: -.ift .tr \``\''
9850: -.}f
9851: -.if\n()s .nr :m 3.5v
9852: -.if\n()t .nr :m 6v
9853: -.ifn .nr :m 7v
9854: -.ift .nr )M 3.6m
9855: -.ifn .nr )M 5n
9856: -.em}K
9857: -.nr q \np
9858: -.if!\np .nr p 1
9859: -.pn \np
9860: //GO.SYSIN DD tmac.an
9861: echo re.3 1>&2
9862: sed 's/.//' >re.3 <<'//GO.SYSIN DD re.3'
9863: -.TH RE 3
9864: -.CT 2 data_man
9865: -.SH NAME
9866: -re_bm, re_cw, re_re \(mi string and pattern matching
9867: -.SH SYNOPSIS
9868: -.nf
9869: -.2C
9870: -.B "#include <re.h>"
9871: -.PP
9872: -.B "re_bm *re_bmcomp(b, e, map)"
9873: -.B "char *b, *e;"
9874: -.B "unsigned char map[256];"
9875: -.PP
9876: -.B "int re_bmexec(pat, rdfn, matchfn)"
9877: -.B re_bm *pat;
9878: -.B int (*rdfn)(), (*matchfn)();
9879: -.PP
9880: -.B void re_bmfree(pat);
9881: -.B re_bm *pat;
9882: -.PP
9883: -.BR "re_cw *re_cwinit(map)"
9884: -.B unsigned char map[256];
9885: -.PP
9886: -.BR "void re_cwadd(pat, b, e)"
9887: -.B re_cw *pat;
9888: -.B char *b, *e;
9889: -.PP
9890: -.BR "void re_cwcomp(pat)"
9891: -.B re_cw *pat;
9892: -.PP
9893: -.B "int re_cwexec(pat, rdfn, matchfn)"
9894: -.B re_cw *pat;
9895: -.B int (*rdfn)(), (*matchfn)();
9896: -.PP
9897: -.B void re_cwfree(pat);
9898: -.B re_cw *pat;
9899: -.PP
9900: -.BR "re_re *re_recomp(b, e, map)"
9901: -.B char *b, *e;
9902: -.B unsigned char map[256];
9903: -.PP
9904: -.B "re_reexec(pat, b, e, match)"
9905: -.B re_re *pat;
9906: -.B char *b, *e, *match[10][2];
9907: -.PP
9908: -.B void re_refree(pat);
9909: -.B re_re *pat;
9910: -.PP
9911: -.B void re_error(str);
9912: -.B char *str;
9913: -.1C
9914: -.fi
9915: -.SH DESCRIPTION
9916: -These routines search for patterns in strings.
9917: -The
9918: -.I re_re
9919: -routines search for general regular expressions (defined below)
9920: -using a lazily evaluated deterministic finite automaton.
9921: -The more specialized and faster
9922: -.I re_cw
9923: -routines search for multiple literal strings
9924: -using the Commentz-Walter algorithm.
9925: -The still more specialized and efficient
9926: -.I re_bm
9927: -routines search for a single string using the Boyer-Moore algorithm.
9928: -The routines handle strings designated by pointers to
9929: -the first character of the string
9930: -and to the character following the string.
9931: -.PP
9932: -To use the
9933: -.I re_bm
9934: -routines, first build a recognizer by calling
9935: -.I re_bmcomp,
9936: -which takes the search string and a character map;
9937: -all characters are compared after mapping.
9938: -Typically,
9939: -.I map
9940: -is initialized by a loop similar to
9941: -.EE
9942: -for(i = 0; i < 256; i++) map[i] = i;
9943: -.EX
9944: -and its value is no longer required after the call to
9945: -.I re_bmcomp.
9946: -The recognizer can be run (multiple times) by calling
9947: -.I re_bmexec,
9948: -which stops and returns the first non-positive return from either
9949: -.I rdfn
9950: -or
9951: -.IR matchfn .
9952: -The recognizer calls the supplied function
9953: -.I rdfn
9954: -to obtain input and
9955: -.I matchfn
9956: -to report text matching the search string.
9957: -.PP
9958: -.I Rdfn
9959: -should be declared as
9960: -.IP
9961: -.EX
9962: -int rdfn(pb, pe)
9963: -char **pb, **pe;
9964: -.EE
9965: -.LP
9966: -where
9967: -.B *pb
9968: -and
9969: -.B *pe
9970: -delimit an as yet unprocessed text fragment
9971: -(none if
9972: -.LR *pb==*pe )
9973: -to be saved across the call to
9974: -.IR rdfn .
9975: -On return,
9976: -.B *pb
9977: -and
9978: -.B *pe
9979: -point to the new text, including the saved fragment.
9980: -.I Rdfn
9981: -returns 0 for EOF, negative for error, and positive otherwise.
9982: -The first call to
9983: -.I rdfn
9984: -from each invocation of
9985: -.I re_bmexec
9986: -has
9987: -.BR *pb==0 .
9988: -.PP
9989: -.I Matchfn
9990: -should be declared as
9991: -.IP
9992: -.EX
9993: -int matchfn(pb, pe)
9994: -char **pb, **pe;
9995: -.EE
9996: -.LP
9997: -where
9998: -.B *pb
9999: -and
10000: -.B *pe
10001: -delimit the matched text.
10002: -.I Matchfn
10003: -sets
10004: -.BR *pb ,
10005: -.BR *pe ,
10006: -and returns a value in the same way as
10007: -.I rdfn.
10008: -.PP
10009: -To use the
10010: -.I re_cw
10011: -routines, first build the recognizer by calling
10012: -.IR re_cwinit ,
10013: -then
10014: -.I re_cwadd
10015: -for each string, and finally
10016: -.IR re_cwcomp .
10017: -The recognizer is run by
10018: -.I re_cwexec
10019: -analogously to
10020: -.IR re_bmexec .
10021: -.PP
10022: -A full regular expression recognizer is compiled by
10023: -.I re_recomp
10024: -and executed by
10025: -.I re_reexec,
10026: -which returns 1 if there was a match and 0 if there wasn't.
10027: -The strings that match subexpressions are returned in array
10028: -.I match
10029: -using the above convention.
10030: -.L match[0]
10031: -refers to the whole matched expression.
10032: -If
10033: -.I match
10034: -is zero, then no match delimiters are set.
10035: -.PP
10036: -The routine
10037: -.I re_error
10038: -prints its argument on standard error and exits.
10039: -You may supply your own version for specialized error handling.
10040: -If
10041: -.I re_error
10042: -returns rather than exits, the compiling routines (e.g.
10043: -.IR re_bmcomp )
10044: -will return 0.
10045: -.PP
10046: -The recognizers that these routines construct occupy storage
10047: -obtained from
10048: -.IR malloc (3).
10049: -The storage can be deallocated by
10050: -.I re_refree.
10051: -.SS Regular Expressions
10052: -The syntax for a regular expression
10053: -.B e0
10054: -is
10055: -.EX
10056: -e3: literal | charclass | '.' | '^' | '$' | '\e'\fIn\fP | '(' e0 ')'
10057: -
10058: -e2: e3
10059: - | e2 REP
10060: -REP: '*' | '+' | '?' | '\e{' RANGE '\e}'
10061: -RANGE: int | int ',' | int ',' int
10062: -
10063: -e1: e2
10064: - | e1 e2
10065: -
10066: -e0: e1
10067: - | e0 ALT e1
10068: -ALT: '|' | newline
10069: -.EE
10070: -.PP
10071: -A literal is any non-metacharacter or a metacharacter
10072: -(one of
10073: -.BR .*+?[]()|\e^$ )
10074: -preceded by
10075: -.LR \e .
10076: -.PP
10077: -A charclass is a nonempty string
10078: -.I s
10079: -bracketed
10080: -.BI [ \|s\| ]
10081: -(or
10082: -.BI [^ s\| ]\fR);
10083: -it matches any character in (or not in)
10084: -.I s.
10085: -In
10086: -.I s,
10087: -the metacharacters other than
10088: -.L ]
10089: -have no special meaning, and
10090: -.L ]
10091: -may only appear as
10092: -the first letter.
10093: -A substring
10094: -.IB a - b ,
10095: -with
10096: -.I a
10097: -and
10098: -.I b
10099: -in ascending
10100: -.SM ASCII
10101: -order, stands for the inclusive
10102: -range of
10103: -.SM ASCII
10104: -characters between
10105: -.I a
10106: -and
10107: -.IR b .
10108: -.PP
10109: -A
10110: -.L \e
10111: -followed by a digit
10112: -.I n
10113: -matches a copy of the string that the
10114: -parenthesized subexpression beginning with the
10115: -.IR n th
10116: -.LR ( ,
10117: -counting from 1, matched.
10118: -.PP
10119: -A
10120: -.L .
10121: -matches any character.
10122: -.PP
10123: -A
10124: -.L ^
10125: -matches the beginning of the input string;
10126: -.L $
10127: -matches the end.
10128: -.PP
10129: -The
10130: -.B REP
10131: -operators match zero or more
10132: -.RB ( * ),
10133: -one or more
10134: -.RB ( + ),
10135: -zero or one
10136: -.RB ( ? ),
10137: -exactly
10138: -.I m
10139: -.BI \f1(\fP\e{ m \e}\f1),\fP
10140: -.I m
10141: -or more
10142: -.BI \f1(\fP\e{ m ,\e}\f1),\fP
10143: -and any number between
10144: -.I m
10145: -and
10146: -.I n
10147: -inclusive
10148: -.BI \f1(\fP\e{ m , n \e}\f1),\fP
10149: -instances respectively of the preceding regular expression
10150: -.BR e2 .
10151: -.PP
10152: -A concatenated regular expression,
10153: -.BR "e1 e2" ,
10154: -matches a match to
10155: -.B e1
10156: -followed by a match to
10157: -.BR e2 .
10158: -.PP
10159: -An alternative regular expression,
10160: -.BR "e0 ALT e1" ,
10161: -matches either a match to
10162: -.B e0
10163: -or a match to
10164: -.BR e1 .
10165: -.PP
10166: -A match to any part of a regular expression
10167: -extends as far as possible without preventing
10168: -a match to the remainder of the regular expression.
10169: -.SH SEE ALSO
10170: -.IR regexp (3),
10171: -.IR gre (1)
10172: -.SH DIAGNOSTICS
10173: -Routines that return pointers return 0 on error.
10174: -.SH BUGS
10175: -Between
10176: -.IR re (3)
10177: -and
10178: -.IR regexp (3)
10179: -there are too many routines.
10180: //GO.SYSIN DD re.3
10181: echo gre.1 1>&2
10182: sed 's/.//' >gre.1 <<'//GO.SYSIN DD gre.1'
10183: -.TH GRE 1
10184: -.CT 1 files
10185: -.SH NAME
10186: -gre, grep, egrep, fgrep \(mi search a file for a pattern
10187: -.SH SYNOPSIS
10188: -.B gre
10189: -[
10190: -.I option ...
10191: -]
10192: -.I pattern
10193: -[
10194: -.I file ...
10195: -]
10196: -.PP
10197: -.B grep
10198: -[
10199: -.I option ...
10200: -]
10201: -.I pattern
10202: -[
10203: -.I file ...
10204: -]
10205: -.PP
10206: -.B egrep
10207: -[
10208: -.I option ...
10209: -]
10210: -.I pattern
10211: -[
10212: -.I file ...
10213: -]
10214: -.PP
10215: -.B fgrep
10216: -[
10217: -.I option ...
10218: -]
10219: -.I strings
10220: -[
10221: -.I file ...
10222: -]
10223: -.SH DESCRIPTION
10224: -.I Gre\^
10225: -searches the input
10226: -.I files\^
10227: -(standard input default)
10228: -for lines (with newlines excluded) that match the
10229: -.I pattern,
10230: -a regular expression as defined in
10231: -.IR re (3).
10232: -A file name of
10233: -.B -
10234: -is interpreted as standard input.
10235: -Normally, each line matching the pattern is `selected',
10236: -and each selected line is copied to the standard output.
10237: -The options are
10238: -.TP
10239: -.B -1
10240: -Print only the first selected line of each file argument.
10241: -.PD 0
10242: -.TP
10243: -.B -b
10244: -Mark each printed line with its byte position in its file.
10245: -This is sometimes useful in locating patterns in non-text files.
10246: -.TP
10247: -.B -c
10248: -Print only a count of matching lines.
10249: -.TP
10250: -.BI -e " pattern"
10251: -Same as a simple
10252: -.I pattern
10253: -argument,
10254: -but useful when
10255: -.I pattern
10256: -begins with a
10257: -.BR - .
10258: -.TP
10259: -.B -E
10260: -Simulate
10261: -.IR egrep.
10262: -.TP
10263: -.BI -f " file"
10264: -Read the pattern from
10265: -.IR file ;
10266: -there is no
10267: -.I pattern
10268: -argument
10269: -.TP
10270: -.B -F
10271: -Simulate
10272: -.IR fgrep.
10273: -.TP
10274: -.B -G
10275: -Simulate
10276: -.IR grep.
10277: -.TP
10278: -.B -h
10279: -Do not print filename tags (headers) with output lines.
10280: -.TP
10281: -.B -i
10282: -Ignore alphabetic case distinctions.
10283: -.TP
10284: -.B -l
10285: -Print the names of files with selected lines; don't print the lines.
10286: -.TP
10287: -.B -L
10288: -Print the names of files with no selected lines;
10289: -the converse of
10290: -.BR -l .
10291: -.TP
10292: -.B -n
10293: -Mark each printed line with its line number counted in its file.
10294: -.TP
10295: -.B -s
10296: -Produce no output, but return status.
10297: -.TP
10298: -.B -v
10299: -Reverse: print lines that do not match the pattern.
10300: -.TP
10301: -.B -x
10302: -Exact match: The pattern is
10303: -.BI ^( pattern )$ .
10304: -The implicit parentheses count in back references.
10305: -.PD
10306: -.PP
10307: -Output lines are tagged by filename when there is more than one
10308: -input file.
10309: -(To force this tagging, include
10310: -.B /dev/null
10311: -as a filename argument.)
10312: -If the output line exceeds some internal limit,
10313: -a warning is given and a small block of text surrounding the match is printed.
10314: -.PP
10315: -Care should be taken when
10316: -using the shell metacharacters
10317: -.B $*[^|()\e
10318: -and newline
10319: -in
10320: -.IR pattern ;
10321: -it is safest to enclose the
10322: -entire expression
10323: -in single quotes
10324: -.BR \&\|\(fm \|.\|.\|.\| \(fm .
10325: -.PP
10326: -.I Gre
10327: -supplants three classic programs, which are still available:
10328: -.PP
10329: -.I Grep
10330: -handles only
10331: -.IR ed (1)-like
10332: -regular expressions.
10333: -It uses
10334: -.L \e(\|\e)
10335: -instead of
10336: -.LR (\|) .
10337: -.PP
10338: -.I Egrep
10339: -handles the same patterns as
10340: -.I gre
10341: -except for back-referencing with
10342: -.BR \e1 ,
10343: -.BR \e2 ,
10344: -\&...
10345: -.PP
10346: -.I Fgrep
10347: -handles no operators except newline (alternation).
10348: -.SH SEE ALSO
10349: -.IR re (3),
10350: -.IR awk (1),
10351: -.IR sed (1),
10352: -.IR sam (9.1),
10353: -.IR strings (1)
10354: -.SH DIAGNOSTICS
10355: -Exit status is 0 if any lines are selected,
10356: -1 if none, 2 for syntax errors, inaccessible files
10357: -(even if matches were found).
10358: -Warnings will be given for input lines that exceed
10359: -a (generous) internal limit.
10360: -.SH BUGS
10361: -.I Grep, egrep,
10362: -and
10363: -.I fgrep
10364: -do not support some options and print block numbers
10365: -rather than byte numbers for option
10366: -.BR -b .
10367: //GO.SYSIN DD gre.1
10368: echo deansify.awk 1>&2
10369: sed 's/.//' >deansify.awk <<'//GO.SYSIN DD deansify.awk'
10370: -# De-ANSI-fy C programs
10371: -
10372: -# change void* to char *
10373: - { gsub(/void *\*/, "char *") }
10374: -
10375: -# remove args from function declarations and typedefs
10376: -# assume one per line (fitting on one line)
10377: -
10378: -/^[a-zA-Z0-9_]+.*\([^(]*\);.*/ {
10379: - if($0 !~ /^print\(/ && $0 !~ /^fprint\(/ && $0 !~ /^if\(/) {
10380: - sub(/\([^(]*\);/, "();")
10381: - print
10382: - next
10383: - }
10384: - }
10385: -
10386: -# change function definition headers to old-style
10387: -# function definition headers on one line, ending with ')',
10388: -# with the return type (if not omitted) on previous line
10389: -# assume no parentheses inside arg list
10390: -
10391: -/^[a-zA-Z0-9_]+\(.*\)$/ {
10392: - st = index($0, "(") + 1
10393: - n = length($0) - st
10394: - rawargs = substr($0, st, n)
10395: - printf("%s(", substr($0, 1, st-2))
10396: - if( rawargs == "void" ) {
10397: - printf(")\n");
10398: - next
10399: - }
10400: - nargs = split(rawargs, args, ", *")
10401: - for(i = 1; i <= nargs; i++){
10402: - if(! match(args[i], /[a-zA-Z0-9_]+ *$/)){
10403: - if(! match(args[i], /[a-zA-Z0-9_]+\[.*\]$/))
10404: - id = "OOPS"
10405: - else {
10406: - id = substr(args[i], RSTART)
10407: - sub(/\[.*\]/, "", id)
10408: - }
10409: - } else
10410: - id = substr(args[i], RSTART, RLENGTH)
10411: - printf("%s", id)
10412: - if(i < nargs) printf(", ")
10413: - }
10414: - printf(")\n")
10415: - for(i = 1; i <= nargs; i++)
10416: - printf("\t%s;\n", args[i])
10417: - next
10418: - }
10419: -
10420: -# remove pragmas
10421: -
10422: -/^#[ ]*pragma/ { next }
10423: -
10424: -# just print remaining lines
10425: - { print }
10426: //GO.SYSIN DD deansify.awk
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.