Annotation of researchv10no/cmd/gre/gre.bundle, revision 1.1.1.1

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 = &ee;
                   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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.