Annotation of researchv10no/cmd/mk/mk.bundle, revision 1.1

1.1     ! root        1: mkdir math fio libc
        !             2: # To unbundle, sh this file
        !             3: echo ./libc/README 1>&2
        !             4: sed 's/.//' >./libc/README <<'//GO.SYSIN DD ./libc/README'
        !             5: -here (as in ../fio) you have to add whatever commands
        !             6: -you need to set up an archive in the shell file `gen'.
        !             7: //GO.SYSIN DD ./libc/README
        !             8: echo ./libc/doprint.c 1>&2
        !             9: sed 's/.//' >./libc/doprint.c <<'//GO.SYSIN DD ./libc/doprint.c'
        !            10: -#include <varargs.h>
        !            11: -
        !            12: -#define       SIZE    1024
        !            13: -#define       FUNSIGN 4
        !            14: -#define       FSHORT  2
        !            15: -#define       FLONG   1
        !            16: -#define       PTR     sizeof (char *)
        !            17: -#define       SHORT   sizeof (int)
        !            18: -#define       INT     sizeof (int)
        !            19: -#define       LONG    sizeof (long)
        !            20: -#define       FLOAT   sizeof (double)
        !            21: -#define       FDIGIT  30
        !            22: -#define       FDEFLT  8
        !            23: -#define       IDIGIT  40
        !            24: -#define       MAXCONV 30
        !            25: -
        !            26: -static char   *out, *eout;
        !            27: -static                convcount  = { 13 };
        !            28: -
        !            29: -static        noconv();
        !            30: -static        cconv(), dconv(), hconv(), lconv();
        !            31: -static        oconv(), sconv(), uconv(), xconv();
        !            32: -
        !            33: -static        econv(), fconv(), gconv(), percent();
        !            34: -int   printcol;
        !            35: -static
        !            36: -int   (*fmtconv[MAXCONV])() =
        !            37: -{
        !            38: -      noconv,
        !            39: -      cconv, dconv, hconv, lconv,
        !            40: -      oconv, sconv, uconv, xconv,
        !            41: -      econv, fconv, gconv, percent,
        !            42: -};
        !            43: -static
        !            44: -char  fmtindex[128] =
        !            45: -{
        !            46: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !            47: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !            48: -      0, 0, 0, 0, 0,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !            49: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !            50: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !            51: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !            52: -      0, 0, 0, 1, 2, 9,10,11, 3, 0, 0, 0, 4, 0, 0, 5,
        !            53: -      0, 0, 0, 6, 0, 7, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
        !            54: -};
        !            55: -
        !            56: -fmtinstall(c, f)
        !            57: -char c;
        !            58: -int (*f)();
        !            59: -{
        !            60: -
        !            61: -      c &= 0177;
        !            62: -      if(fmtindex[c] == 0) {
        !            63: -              if(convcount >= MAXCONV)
        !            64: -                      return 1;
        !            65: -              fmtindex[c] = convcount++;
        !            66: -      }
        !            67: -      fmtconv[fmtindex[c]] = f;
        !            68: -      return 0;
        !            69: -}
        !            70: -
        !            71: -char*
        !            72: -donprint(s, es, fmt, argpp)
        !            73: -char *s, *es;
        !            74: -register char *fmt;
        !            75: -va_list *argpp;
        !            76: -{
        !            77: -      register int f1, f2, f3, sf1, c;
        !            78: -      char *sout, *seout;
        !            79: -
        !            80: -      sout = out;
        !            81: -      seout = eout;
        !            82: -      out = s;
        !            83: -      eout = es-1;
        !            84: -loop:
        !            85: -      c = *fmt++;
        !            86: -      if(c != '%') {
        !            87: -              if(c == 0) {
        !            88: -                      *out = 0;
        !            89: -                      s = out;
        !            90: -                      out = sout;
        !            91: -                      eout = seout;
        !            92: -                      return s;
        !            93: -              }
        !            94: -              if(out < eout)
        !            95: -                      *out++ = c;
        !            96: -              printcol++;
        !            97: -              if(c == '\n')
        !            98: -                      printcol = 0; else
        !            99: -              if(c == '\t')
        !           100: -                      printcol = (printcol+7) & ~7;
        !           101: -              goto loop;
        !           102: -      }
        !           103: -      f1 = 0;
        !           104: -      f2 = -1;
        !           105: -      f3 = 0;
        !           106: -      c = *fmt++;
        !           107: -      sf1 = 0;
        !           108: -      if(c == '-') {
        !           109: -              sf1 = 1;
        !           110: -              c = *fmt++;
        !           111: -      }
        !           112: -      while(c >= '0' && c <= '9') {
        !           113: -              f1 = f1*10 + c-'0';
        !           114: -              c = *fmt++;
        !           115: -      }
        !           116: -      if(sf1)
        !           117: -              f1 = -f1;
        !           118: -      if(c != '.')
        !           119: -              goto l1;
        !           120: -      c = *fmt++;
        !           121: -      while(c >= '0' && c <= '9') {
        !           122: -              if(f2 < 0)
        !           123: -                      f2 = 0;
        !           124: -              f2 = f2*10 + c-'0';
        !           125: -              c = *fmt++;
        !           126: -      }
        !           127: -l1:
        !           128: -      if(c == 0)
        !           129: -              fmt--;
        !           130: -      /* NB: first arg is now a (va_list *) */
        !           131: -      c = (*fmtconv[fmtindex[c&0177]])(argpp, f1, f2, f3);
        !           132: -      if(c < 0) {
        !           133: -              f3 |= -c;
        !           134: -              c = *fmt++;
        !           135: -              goto l1;
        !           136: -      }
        !           137: -#ifdef notdef
        !           138: -      argp += c;      /* increment is now done in called routine by va_arg() */
        !           139: -#endif
        !           140: -      goto loop;
        !           141: -}
        !           142: -
        !           143: -numbconv(o, f1, f2, f3, b)
        !           144: -va_list *o;
        !           145: -{
        !           146: -      char s[IDIGIT];
        !           147: -      register long v;
        !           148: -      register int i, f, n, r;
        !           149: -
        !           150: -      switch(f3 & (FLONG|FSHORT|FUNSIGN)) {
        !           151: -      case FLONG:
        !           152: -              v = va_arg(*o, long);
        !           153: -              r = LONG;
        !           154: -              break;
        !           155: -
        !           156: -      case FUNSIGN|FLONG:
        !           157: -              v = va_arg(*o, unsigned long);
        !           158: -              r = LONG;
        !           159: -              break;
        !           160: -
        !           161: -      /* NB: a (unsigned) short argument is promoted to an (unsigned) int arg. */
        !           162: -      case FSHORT:
        !           163: -              v = (short)va_arg(*o, int);
        !           164: -              r = SHORT;
        !           165: -              break;
        !           166: -
        !           167: -      case FUNSIGN|FSHORT:
        !           168: -              v = (unsigned short)va_arg(*o, unsigned);
        !           169: -              r = SHORT;
        !           170: -              break;
        !           171: -
        !           172: -      default:
        !           173: -              v = va_arg(*o, int);
        !           174: -              r = INT;
        !           175: -              break;
        !           176: -
        !           177: -      case FUNSIGN:
        !           178: -              v = va_arg(*o, unsigned);
        !           179: -              r = INT;
        !           180: -              break;
        !           181: -      }
        !           182: -      f = 0;
        !           183: -      if(!(f3 & FUNSIGN) && v < 0) {
        !           184: -              v = -v;
        !           185: -              f = 1;
        !           186: -      }
        !           187: -      s[IDIGIT-1] = 0;
        !           188: -      for(i = IDIGIT-2; i >= 1; i--) {
        !           189: -              n = (unsigned long)v % b;
        !           190: -              n += '0';
        !           191: -              if(n > '9')
        !           192: -                      n += 'a' - ('9'+1);
        !           193: -              s[i] = n;
        !           194: -              v = (unsigned long)v / b;
        !           195: -              if(f2 >= 0 && i >= IDIGIT-f2)
        !           196: -                      continue;
        !           197: -              if(v <= 0)
        !           198: -                      break;
        !           199: -      }
        !           200: -      if(f)
        !           201: -              s[--i] = '-';
        !           202: -      strconv(s+i, f1, -1);
        !           203: -      return r;
        !           204: -}
        !           205: -
        !           206: -char*
        !           207: -doprint(s, fmt, argp)
        !           208: -char *s, *fmt;
        !           209: -va_list *argp;
        !           210: -{
        !           211: -
        !           212: -      return donprint(s, s+SIZE, fmt, argp);
        !           213: -}
        !           214: -
        !           215: -/*
        !           216: -      if you change this, change chconv
        !           217: -*/
        !           218: -
        !           219: -strconv(o, f1, f2)
        !           220: -char *o;
        !           221: -{
        !           222: -      register int n, c;
        !           223: -      register char *s;
        !           224: -
        !           225: -      n = 0;
        !           226: -      for(s = o; *s++;)
        !           227: -              n++;
        !           228: -      if(f1 >= 0)
        !           229: -              while(n < f1) {
        !           230: -                      if(out < eout)
        !           231: -                              *out++ = ' ';
        !           232: -                      printcol++;
        !           233: -                      n++;
        !           234: -              }
        !           235: -      for(s=o; c = *s++;)
        !           236: -              if(f2 != 0) {
        !           237: -                      if(out < eout)
        !           238: -                              *out++ = c;
        !           239: -                      printcol++;
        !           240: -                      if(c == '\n')
        !           241: -                              printcol = 0; else
        !           242: -                      if(c == '\t')
        !           243: -                              printcol = (printcol+7) & ~7;
        !           244: -                      f2--;
        !           245: -              }
        !           246: -      if(f1 < 0) {
        !           247: -              f1 = -f1;
        !           248: -              while(n < f1) {
        !           249: -                      if(out < eout)
        !           250: -                              *out++ = ' ';
        !           251: -                      printcol++;
        !           252: -                      n++;
        !           253: -              }
        !           254: -      }
        !           255: -}
        !           256: -
        !           257: -chconv(o, f1)
        !           258: -char o;
        !           259: -{
        !           260: -      register int n;
        !           261: -
        !           262: -      n = 1;
        !           263: -      if(f1 >= 0)
        !           264: -              while(n < f1) {
        !           265: -                      if(out < eout)
        !           266: -                              *out++ = ' ';
        !           267: -                      printcol++;
        !           268: -                      n++;
        !           269: -              }
        !           270: -      if(out < eout)
        !           271: -              *out++ = o;
        !           272: -      printcol++;
        !           273: -      if(o == '\n')
        !           274: -              printcol = 0; else
        !           275: -      if(o == '\t')
        !           276: -              printcol = (printcol+7) & ~7;
        !           277: -      if(f1 < 0) {
        !           278: -              f1 = -f1;
        !           279: -              while(n < f1) {
        !           280: -                      if(out < eout)
        !           281: -                              *out++ = ' ';
        !           282: -                      printcol++;
        !           283: -                      n++;
        !           284: -              }
        !           285: -      }
        !           286: -}
        !           287: -
        !           288: -/* ARGSUSED */
        !           289: -static
        !           290: -noconv(o, f1, f2, f3)
        !           291: -char *o;
        !           292: -{
        !           293: -
        !           294: -      strconv("***", 0, -1);
        !           295: -      return 0;
        !           296: -}
        !           297: -
        !           298: -/* ARGSUSED */
        !           299: -static
        !           300: -cconv(o, f1, f2, f3)
        !           301: -va_list *o;
        !           302: -{
        !           303: -      chconv((char)va_arg(*o, int), f1);
        !           304: -      return INT;
        !           305: -}
        !           306: -
        !           307: -static
        !           308: -dconv(o, f1, f2, f3)
        !           309: -va_list *o;
        !           310: -{
        !           311: -      int r;
        !           312: -
        !           313: -      r = numbconv(o, f1, f2, f3, 10);
        !           314: -      return r;
        !           315: -}
        !           316: -
        !           317: -/* ARGSUSED */
        !           318: -static
        !           319: -hconv(o, f1, f2, f3)
        !           320: -{
        !           321: -      return -FSHORT;
        !           322: -}
        !           323: -
        !           324: -/* ARGSUSED */
        !           325: -static
        !           326: -lconv(o, f1, f2, f3)
        !           327: -{
        !           328: -
        !           329: -      return -FLONG;
        !           330: -}
        !           331: -
        !           332: -static
        !           333: -oconv(o, f1, f2, f3)
        !           334: -va_list *o;
        !           335: -{
        !           336: -      int r;
        !           337: -
        !           338: -      r = numbconv(o, f1, f2, f3, 8);
        !           339: -      return r;
        !           340: -}
        !           341: -
        !           342: -/* ARGSUSED */
        !           343: -static
        !           344: -sconv(o, f1, f2, f3)
        !           345: -va_list *o;
        !           346: -{
        !           347: -
        !           348: -      strconv(va_arg(*o, char *), f1, f2);
        !           349: -      return PTR;
        !           350: -}
        !           351: -
        !           352: -/* ARGSUSED */
        !           353: -static
        !           354: -uconv(o, f1, f2, f3)
        !           355: -{
        !           356: -      return -FUNSIGN;
        !           357: -}
        !           358: -
        !           359: -static
        !           360: -xconv(o, f1, f2, f3)
        !           361: -va_list *o;
        !           362: -{
        !           363: -      int r;
        !           364: -
        !           365: -      r = numbconv(o, f1, f2, f3, 16);
        !           366: -      return r;
        !           367: -}
        !           368: -
        !           369: -double        pow10(), frexp();
        !           370: -/* ARGSUSED */
        !           371: -fltconv(f, f1, f2, f3, c)
        !           372: -register double f;
        !           373: -{
        !           374: -      char s1[FDIGIT+10], s2[FDIGIT+10];
        !           375: -      register double g;
        !           376: -      register int d, i, n, s;
        !           377: -      double h;
        !           378: -      int e;
        !           379: -      int c1, c2, c3;
        !           380: -
        !           381: -      s = 0;
        !           382: -      if(f < 0) {
        !           383: -              f = -f;
        !           384: -              s++;
        !           385: -      }
        !           386: -
        !           387: -loop:
        !           388: -      e = 0;
        !           389: -      g = 0;
        !           390: -      if(f != 0) {
        !           391: -              g = frexp(f, &e);
        !           392: -              e = e * .30103;
        !           393: -              d = e/2;
        !           394: -              h = f * pow10(-d);              /* 10**-e in 2 parts */
        !           395: -              g = h * pow10(d-e);
        !           396: -              while(g < 1) {
        !           397: -                      e--;
        !           398: -                      g = h * pow10(d-e);
        !           399: -              }
        !           400: -              while(g >= 10) {
        !           401: -                      e++;
        !           402: -                      g = h * pow10(d-e);
        !           403: -              }
        !           404: -      }
        !           405: -      if(f2 < 0)
        !           406: -              f2 = FDEFLT;
        !           407: -      if(c == 'g' && f2 > 0)
        !           408: -              f2--;
        !           409: -      if(f2 > FDIGIT)
        !           410: -              f2 = FDIGIT;
        !           411: -      /*
        !           412: -       * n is number of digits to convert
        !           413: -       * 1 before, f2 after, 1 extra for rounding
        !           414: -       */
        !           415: -      n = f2 + 2;
        !           416: -      if(c == 'f') {
        !           417: -              /*
        !           418: -               * e+1 before, f2 after, 1 extra
        !           419: -               */
        !           420: -              n += e;
        !           421: -              if(n <= 0) {
        !           422: -                      n = 1;
        !           423: -                      g = 0;
        !           424: -              }
        !           425: -      }
        !           426: -      if(n >= FDIGIT+2) {
        !           427: -              if(c == 'e')
        !           428: -                      f2 = -1;
        !           429: -              c = 'e';
        !           430: -              goto loop;
        !           431: -      }
        !           432: -      /*
        !           433: -       * convert n digits
        !           434: -       */
        !           435: -      for(i=0; i<n; i++) {
        !           436: -              d = g;
        !           437: -              if(d > g)
        !           438: -                      d--;
        !           439: -              g -= d;
        !           440: -              s1[i+1] = d + '0';
        !           441: -              g *= 10;
        !           442: -      }
        !           443: -      /*
        !           444: -       * round by adding .5 into extra digit
        !           445: -       */
        !           446: -      d = 5;
        !           447: -      for(i=n-1; i>=0; i--) {
        !           448: -              s1[i+1] += d;
        !           449: -              d = 0;
        !           450: -              if(s1[i+1] > '9') {
        !           451: -                      s1[i+1] -= 10;
        !           452: -                      d++;
        !           453: -              }
        !           454: -      }
        !           455: -      i = 1;
        !           456: -      if(d) {
        !           457: -              s1[0] = '1';
        !           458: -              e++;
        !           459: -              i = 0;
        !           460: -      } 
        !           461: -      /*
        !           462: -       * copy into final place
        !           463: -       * c1 digits of leading '0'
        !           464: -       * c2 digits from conversion
        !           465: -       * c3 digits after '.'
        !           466: -       */
        !           467: -      d = 0;
        !           468: -      if(s)
        !           469: -              s2[d++] = '-';
        !           470: -      c1 = 0;
        !           471: -      c2 = f2 + 1;
        !           472: -      c3 = f2;
        !           473: -      if(c == 'g')
        !           474: -      if(e >= -5 && e <= f2) {
        !           475: -              c1 = -e - 1;
        !           476: -              c3 = c1;
        !           477: -              if(c1 < 0)
        !           478: -                      c1 = 0;
        !           479: -              c3 = f2 - e;
        !           480: -              c = 'h';
        !           481: -      }
        !           482: -      if(c == 'f') {
        !           483: -              c1 = -e;
        !           484: -              if(c1 < 0)
        !           485: -                      c1 = 0;
        !           486: -              if(c1 > f2)
        !           487: -                      c1 = c2;
        !           488: -              c2 += e;
        !           489: -              if(c2 < 0)
        !           490: -                      c2 = 0;
        !           491: -      }
        !           492: -      while(c1 > 0) {
        !           493: -              if(c1+c2 == c3)
        !           494: -                      s2[d++] = '.';
        !           495: -              s2[d++] = '0';
        !           496: -              c1--;
        !           497: -      }
        !           498: -      while(c2 > 0) {
        !           499: -              if(c1+c2 == c3)
        !           500: -                      s2[d++] = '.';
        !           501: -              s2[d++] = s1[i++];
        !           502: -              c2--;
        !           503: -      }
        !           504: -      /*
        !           505: -       * strip trailing '0' on g conv
        !           506: -       */
        !           507: -      if(c == 'g' || c == 'h') {
        !           508: -              for(n=d-1; n>=0; n--)
        !           509: -                      if(s2[n] != '0')
        !           510: -                              break;
        !           511: -              for(i=n; i>=0; i--)
        !           512: -                      if(s2[i] == '.') {
        !           513: -                              d = n;
        !           514: -                              if(i != n)
        !           515: -                                      d++;
        !           516: -                              break;
        !           517: -                      }
        !           518: -      }
        !           519: -      if(c == 'e' || c == 'g') {
        !           520: -              s2[d++] = 'e';
        !           521: -              s2[d++] = '+';
        !           522: -              c1 = e;
        !           523: -              if(c1 < 0) {
        !           524: -                      s2[d-1] = '-';
        !           525: -                      c1 = -c1;
        !           526: -              }
        !           527: -              if(c1 >= 100) {
        !           528: -                      s2[d++] = c1/100 + '0';
        !           529: -                      c1 %= 100;
        !           530: -              }
        !           531: -              s2[d++] = c1/10 + '0';
        !           532: -              s2[d++] = c1%10 + '0';
        !           533: -      }
        !           534: -      s2[d] = 0;
        !           535: -      strconv(s2, f1, -1);
        !           536: -      return FLOAT;
        !           537: -}
        !           538: -
        !           539: -static
        !           540: -econv(o, f1, f2, f3)
        !           541: -va_list *o;
        !           542: -{
        !           543: -
        !           544: -      return fltconv(va_arg(*o, double), f1, f2, f3, 'e');
        !           545: -}
        !           546: -
        !           547: -static
        !           548: -fconv(o, f1, f2, f3)
        !           549: -va_list *o;
        !           550: -{
        !           551: -
        !           552: -      return fltconv(va_arg(*o, double), f1, f2, f3, 'f');
        !           553: -}
        !           554: -
        !           555: -static
        !           556: -gconv(o, f1, f2, f3)
        !           557: -va_list *o;
        !           558: -{
        !           559: -
        !           560: -      return fltconv(va_arg(*o, double), f1, f2, f3, 'g');
        !           561: -}
        !           562: -
        !           563: -static
        !           564: -percent()
        !           565: -{
        !           566: -
        !           567: -      if(out < eout)
        !           568: -              *out++ = '%';
        !           569: -      return 0;
        !           570: -}
        !           571: //GO.SYSIN DD ./libc/doprint.c
        !           572: echo ./libc/exit.c 1>&2
        !           573: sed 's/.//' >./libc/exit.c <<'//GO.SYSIN DD ./libc/exit.c'
        !           574: -#include      <libc.h>
        !           575: -
        !           576: -extern int (*_onexitfns[])();
        !           577: -
        !           578: -void
        !           579: -exit(status)
        !           580: -{
        !           581: -      int i, (*f)();
        !           582: -
        !           583: -      for(i = NONEXIT-1; i >= 0; i--)
        !           584: -              if(_onexitfns[i]){
        !           585: -                      f = _onexitfns[i];
        !           586: -                      _onexitfns[i] = 0;      /* self defense against bozos */
        !           587: -                      (*f)();
        !           588: -              }
        !           589: -      _exit(status);
        !           590: -}
        !           591: //GO.SYSIN DD ./libc/exit.c
        !           592: echo ./libc/regcomp.c 1>&2
        !           593: sed 's/.//' >./libc/regcomp.c <<'//GO.SYSIN DD ./libc/regcomp.c'
        !           594: -#include <libc.h>
        !           595: -#include "regprog.h"
        !           596: -
        !           597: -/*
        !           598: - * Parser Information
        !           599: - */
        !           600: -typedef struct Node{
        !           601: -      Inst    *first;
        !           602: -      Inst    *last;
        !           603: -}Node;
        !           604: -#define       NSTACK  20
        !           605: -static Node   andstack[NSTACK];
        !           606: -static Node   *andp;
        !           607: -static int    atorstack[NSTACK];
        !           608: -static int    *atorp;
        !           609: -static int    cursubid;               /* id of current subexpression */
        !           610: -static int    subidstack[NSTACK];     /* parallel to atorstack */
        !           611: -static int    *subidp;
        !           612: -static int    lastwasand;     /* Last token was operand */
        !           613: -static int    nbra;
        !           614: -static char   *exprp;         /* pointer to next character in source expression */
        !           615: -static int    nclass;
        !           616: -static Class  *classp;
        !           617: -static Inst   *freep;
        !           618: -static int    errors;
        !           619: -
        !           620: -/* predeclared crap */
        !           621: -static void operator();
        !           622: -static void pushand();
        !           623: -static void pushator();
        !           624: -static void evaluntil();
        !           625: -static void bldcclass();
        !           626: -
        !           627: -static void
        !           628: -rcerror(s)
        !           629: -      char *s;
        !           630: -{
        !           631: -      errors++;
        !           632: -      regerror(s);
        !           633: -}
        !           634: -
        !           635: -static Inst *
        !           636: -newinst(t)
        !           637: -      int t;
        !           638: -{
        !           639: -      freep->type=t;
        !           640: -      freep->left=0;
        !           641: -      freep->right=0;
        !           642: -      return freep++;
        !           643: -}
        !           644: -
        !           645: -static void
        !           646: -operand(t)
        !           647: -      int t;
        !           648: -{
        !           649: -      register Inst *i;
        !           650: -      if(lastwasand)
        !           651: -              operator(CAT);  /* catenate is implicit */
        !           652: -      i=newinst(t);
        !           653: -      if(t==CCLASS)   /* ugh */
        !           654: -              i->right=(Inst *)&(classp[nclass-1]);   /* UGH! */
        !           655: -      pushand(i, i);
        !           656: -      lastwasand=TRUE;
        !           657: -}
        !           658: -
        !           659: -static void
        !           660: -operator(t)
        !           661: -      int t;
        !           662: -{
        !           663: -      if(t==RBRA && --nbra<0)
        !           664: -              rcerror("unmatched right paren");
        !           665: -      if(t==LBRA) {
        !           666: -              if (++cursubid >= NSUBEXP)
        !           667: -                      rcerror ("too many subexpressions");
        !           668: -              nbra++;
        !           669: -              if (lastwasand)
        !           670: -                      operator(CAT);
        !           671: -      } else
        !           672: -              evaluntil(t);
        !           673: -      if(t!=RBRA)
        !           674: -              pushator(t);
        !           675: -      lastwasand=FALSE;
        !           676: -      if(t==STAR || t==QUEST || t==PLUS || t==RBRA)
        !           677: -              lastwasand=TRUE;        /* these look like operands */
        !           678: -}
        !           679: -
        !           680: -static void
        !           681: -regerr2(s, c)
        !           682: -      char *s;
        !           683: -{
        !           684: -      char buf[100];
        !           685: -      char *cp = buf;
        !           686: -      while(*s)
        !           687: -              *cp++ = *s++;
        !           688: -      *cp++ = c;
        !           689: -      *cp = '\0'; 
        !           690: -      rcerror(buf);
        !           691: -}
        !           692: -
        !           693: -static void
        !           694: -cant(s)
        !           695: -      char *s;
        !           696: -{
        !           697: -      char buf[100];
        !           698: -      strcpy(buf, "can't happen: ");
        !           699: -      strcat(buf, s);
        !           700: -      rcerror(buf);
        !           701: -}
        !           702: -
        !           703: -static void
        !           704: -pushand(f, l)
        !           705: -      Inst *f, *l;
        !           706: -{
        !           707: -      if(andp >= &andstack[NSTACK])
        !           708: -              cant("operand stack overflow");
        !           709: -      andp->first=f;
        !           710: -      andp->last=l;
        !           711: -      andp++;
        !           712: -}
        !           713: -
        !           714: -static void
        !           715: -pushator(t)
        !           716: -      int t;
        !           717: -{
        !           718: -      if(atorp >= &atorstack[NSTACK])
        !           719: -              cant("operator stack overflow");
        !           720: -      *atorp++=t;
        !           721: -      *subidp++=cursubid;
        !           722: -}
        !           723: -
        !           724: -static Node *
        !           725: -popand(op)
        !           726: -{
        !           727: -      register Inst *inst;
        !           728: -
        !           729: -      if(andp <= &andstack[0]) {
        !           730: -              regerr2("missing operand for ", op);
        !           731: -              inst=newinst(NOP);
        !           732: -              pushand(inst,inst);
        !           733: -      }
        !           734: -      return --andp;
        !           735: -}
        !           736: -
        !           737: -static int
        !           738: -popator()
        !           739: -{
        !           740: -      if(atorp <= &atorstack[0])
        !           741: -              cant("operator stack underflow");
        !           742: -      --subidp;
        !           743: -      return *--atorp;
        !           744: -}
        !           745: -
        !           746: -static void
        !           747: -evaluntil(pri)
        !           748: -      register pri;
        !           749: -{
        !           750: -      register Node *op1, *op2;
        !           751: -      register Inst *inst1, *inst2;
        !           752: -
        !           753: -      while(pri==RBRA || atorp[-1]>=pri){
        !           754: -              switch(popator()){
        !           755: -              default:
        !           756: -                      rcerror("unknown operator in evaluntil");
        !           757: -                      break;
        !           758: -              case LBRA:              /* must have been RBRA */
        !           759: -                      op1=popand('(');
        !           760: -                      inst2=newinst(RBRA);
        !           761: -                      inst2->subid = *subidp;
        !           762: -                      op1->last->next = inst2;
        !           763: -                      inst1=newinst(LBRA);
        !           764: -                      inst1->subid = *subidp;
        !           765: -                      inst1->next=op1->first;
        !           766: -                      pushand(inst1, inst2);
        !           767: -                      return;
        !           768: -              case OR:
        !           769: -                      op2=popand('|');
        !           770: -                      op1=popand('|');
        !           771: -                      inst2=newinst(NOP);
        !           772: -                      op2->last->next=inst2;
        !           773: -                      op1->last->next=inst2;
        !           774: -                      inst1=newinst(OR);
        !           775: -                      inst1->right=op1->first;
        !           776: -                      inst1->left=op2->first;
        !           777: -                      pushand(inst1, inst2);
        !           778: -                      break;
        !           779: -              case CAT:
        !           780: -                      op2=popand(0);
        !           781: -                      op1=popand(0);
        !           782: -                      op1->last->next=op2->first;
        !           783: -                      pushand(op1->first, op2->last);
        !           784: -                      break;
        !           785: -              case STAR:
        !           786: -                      op2=popand('*');
        !           787: -                      inst1=newinst(OR);
        !           788: -                      op2->last->next=inst1;
        !           789: -                      inst1->right=op2->first;
        !           790: -                      pushand(inst1, inst1);
        !           791: -                      break;
        !           792: -              case PLUS:
        !           793: -                      op2=popand('+');
        !           794: -                      inst1=newinst(OR);
        !           795: -                      op2->last->next=inst1;
        !           796: -                      inst1->right=op2->first;
        !           797: -                      pushand(op2->first, inst1);
        !           798: -                      break;
        !           799: -              case QUEST:
        !           800: -                      op2=popand('?');
        !           801: -                      inst1=newinst(OR);
        !           802: -                      inst2=newinst(NOP);
        !           803: -                      inst1->left=inst2;
        !           804: -                      inst1->right=op2->first;
        !           805: -                      op2->last->next=inst2;
        !           806: -                      pushand(inst1, inst2);
        !           807: -                      break;
        !           808: -              }
        !           809: -      }
        !           810: -}
        !           811: -
        !           812: -static Prog *
        !           813: -optimize(pp)
        !           814: -      Prog *pp;
        !           815: -{
        !           816: -      register Inst *inst, *target;
        !           817: -      int size;
        !           818: -      Prog *npp;
        !           819: -      int diff;
        !           820: -
        !           821: -      /*
        !           822: -       *  get rid of NOOP chains
        !           823: -       */
        !           824: -      for(inst=pp->firstinst; inst->type!=END; inst++){
        !           825: -              target=inst->next;
        !           826: -              while(target->type == NOP)
        !           827: -                      target=target->next;
        !           828: -              inst->next=target;
        !           829: -      }
        !           830: -
        !           831: -      /*
        !           832: -       *  The original allocation is for an area larger than
        !           833: -       *  necessary.  Reallocate to the actual space used
        !           834: -       *  and then relocate the code.
        !           835: -       */
        !           836: -      size = sizeof(Prog) + (freep - pp->firstinst)*sizeof(Inst);
        !           837: -      npp = (Prog *)realloc((char *)pp, size);
        !           838: -      if(npp==NULL || npp==pp)
        !           839: -              return(pp);
        !           840: -      diff = (char *)npp - (char *)pp;
        !           841: -      freep = (Inst *)((char *)freep + diff);
        !           842: -      for(inst=npp->firstinst; inst<freep; inst++){
        !           843: -              switch(inst->type){
        !           844: -              case OR:
        !           845: -              case STAR:
        !           846: -              case PLUS:
        !           847: -              case QUEST:
        !           848: -              case CCLASS:
        !           849: -                      *(char **)&inst->right += diff;
        !           850: -                      break;
        !           851: -              }
        !           852: -              *(char **)&inst->left += diff;
        !           853: -      }
        !           854: -      *(char **)&npp->startinst += diff;
        !           855: -      return(npp);
        !           856: -}
        !           857: -
        !           858: -#ifdef        DEBUG
        !           859: -static void
        !           860: -dumpstack(){
        !           861: -      Node *stk;
        !           862: -      int *ip;
        !           863: -
        !           864: -      printf("operators\n");
        !           865: -      for(ip=atorstack; ip<atorp; ip++)
        !           866: -              printf("0%o\n", *ip);
        !           867: -      printf("operands\n");
        !           868: -      for(stk=andstack; stk<andp; stk++)
        !           869: -              printf("0%o\t0%o\n", stk->first->type, stk->last->type);
        !           870: -}
        !           871: -
        !           872: -static void
        !           873: -dump(pp)
        !           874: -      Prog *pp;
        !           875: -{
        !           876: -      Inst *l;
        !           877: -
        !           878: -      l=pp->firstinst;
        !           879: -      do{
        !           880: -              printf("%d:\t0%o\t%d\t%d\n", l-pp->firstinst, l->type,
        !           881: -                      l->left-pp->firstinst, l->right-pp->firstinst);
        !           882: -      }while(l++->type);
        !           883: -}
        !           884: -#endif
        !           885: -
        !           886: -static void
        !           887: -startlex(s)
        !           888: -      char *s;
        !           889: -{
        !           890: -      exprp=s;
        !           891: -      nclass=0;
        !           892: -      nbra=0;
        !           893: -}
        !           894: -
        !           895: -static Class *
        !           896: -newclass(){
        !           897: -      register Class *p;
        !           898: -      register n;
        !           899: -
        !           900: -      if(nclass >= NCLASS)
        !           901: -              regerr2("too many character classes; limit", NCLASS+'0');
        !           902: -      p = &(classp[nclass++]);
        !           903: -      for(n=0; n<16; n++)
        !           904: -              p->map[n]=0;
        !           905: -      return p;
        !           906: -}
        !           907: -
        !           908: -static int
        !           909: -lex(){
        !           910: -      register c= *exprp++;
        !           911: -
        !           912: -      switch(c){
        !           913: -      case '\\':
        !           914: -              if(*exprp)
        !           915: -                      c= *exprp++;
        !           916: -              break;
        !           917: -      case 0:
        !           918: -              c=END;
        !           919: -              --exprp;        /* In case we come here again */
        !           920: -              break;
        !           921: -      case '*':
        !           922: -              c=STAR;
        !           923: -              break;
        !           924: -      case '?':
        !           925: -              c=QUEST;
        !           926: -              break;
        !           927: -      case '+':
        !           928: -              c=PLUS;
        !           929: -              break;
        !           930: -      case '|':
        !           931: -              c=OR;
        !           932: -              break;
        !           933: -      case '.':
        !           934: -              c=ANY;
        !           935: -              break;
        !           936: -      case '(':
        !           937: -              c=LBRA;
        !           938: -              break;
        !           939: -      case ')':
        !           940: -              c=RBRA;
        !           941: -              break;
        !           942: -      case '^':
        !           943: -              c=BOL;
        !           944: -              break;
        !           945: -      case '$':
        !           946: -              c=EOL;
        !           947: -              break;
        !           948: -      case '[':
        !           949: -              c=CCLASS;
        !           950: -              bldcclass();
        !           951: -              break;
        !           952: -      }
        !           953: -      return c;
        !           954: -}
        !           955: -
        !           956: -static int
        !           957: -nextc(){
        !           958: -      if(exprp[0]==0 || (exprp[0]=='\\' && exprp[1]==0))
        !           959: -              rcerror("malformed '[]'");
        !           960: -      if(exprp[0]=='\\'){
        !           961: -              exprp++;
        !           962: -              return *exprp++|0200;
        !           963: -      }
        !           964: -      return *exprp++;
        !           965: -}
        !           966: -
        !           967: -static void
        !           968: -bldcclass(){
        !           969: -      register c1, c2;
        !           970: -      register Class *classp;
        !           971: -      register negate=FALSE;
        !           972: -
        !           973: -      classp=newclass();
        !           974: -      /* we have already seen the '[' */
        !           975: -      if(*exprp=='^'){
        !           976: -              negate=TRUE;
        !           977: -              exprp++;
        !           978: -      }
        !           979: -      while((c1=c2=nextc()) != ']'){
        !           980: -              if(*exprp=='-'){
        !           981: -                      exprp++;        /* eat '-' */
        !           982: -                      if((c2=nextc()) == ']')
        !           983: -                              rcerror("malformed '[]'");
        !           984: -              }
        !           985: -              for((c1&=0177), (c2&=0177); c1<=c2; c1++)
        !           986: -                      classp->map[c1/8] |= 1<<(c1&07);
        !           987: -      }
        !           988: -      if(negate)
        !           989: -              for(c1=0; c1<16; c1++)
        !           990: -                      classp->map[c1]^=0377;
        !           991: -      classp->map[0] &= 0376;         /* exclude NUL */
        !           992: -}
        !           993: -
        !           994: -extern regexp *
        !           995: -regcomp(s)
        !           996: -      char *s;
        !           997: -{
        !           998: -      register token;
        !           999: -      Prog *pp;
        !          1000: -
        !          1001: -      /* get memory for the program */
        !          1002: -      pp = (Prog *)malloc(sizeof(Prog) + 3*sizeof(Inst)*strlen(s));
        !          1003: -      if (pp == NULL) {
        !          1004: -              rcerror("out of memory");
        !          1005: -              return NULL;
        !          1006: -      }
        !          1007: -      freep = pp->firstinst;
        !          1008: -      classp = pp->class;
        !          1009: -      errors = 0;
        !          1010: -
        !          1011: -      /* go compile the sucker */
        !          1012: -      startlex(s);
        !          1013: -      atorp=atorstack;
        !          1014: -      andp=andstack;
        !          1015: -      subidp=subidstack;
        !          1016: -      lastwasand=FALSE;
        !          1017: -      cursubid=0;
        !          1018: -
        !          1019: -      /* Start with a low priority operator to prime parser */
        !          1020: -      pushator(START-1);
        !          1021: -      while((token=lex()) != END){
        !          1022: -              if((token&0300) == OPERATOR)
        !          1023: -                      operator(token);
        !          1024: -              else
        !          1025: -                      operand(token);
        !          1026: -      }
        !          1027: -
        !          1028: -      /* Close with a low priority operator */
        !          1029: -      evaluntil(START);
        !          1030: -
        !          1031: -      /* Force END */
        !          1032: -      operand(END);
        !          1033: -      evaluntil(START);
        !          1034: -#ifdef DEBUG
        !          1035: -      dumpstack();
        !          1036: -#endif
        !          1037: -      if(nbra)
        !          1038: -              rcerror("unmatched left paren");
        !          1039: -      --andp; /* points to first and only operand */
        !          1040: -      pp->startinst=andp->first;
        !          1041: -#ifdef DEBUG
        !          1042: -      dump(pp);
        !          1043: -#endif
        !          1044: -      pp = optimize(pp);
        !          1045: -#ifdef DEBUG
        !          1046: -      printf("start: %d\n", andp->first-pp->firstinst);
        !          1047: -      dump(pp);
        !          1048: -#endif
        !          1049: -      if (errors) {
        !          1050: -              free((char *)pp);
        !          1051: -              pp = NULL;
        !          1052: -      }
        !          1053: -      return (regexp *)pp;
        !          1054: -}
        !          1055: //GO.SYSIN DD ./libc/regcomp.c
        !          1056: echo ./libc/getfields.c 1>&2
        !          1057: sed 's/.//' >./libc/getfields.c <<'//GO.SYSIN DD ./libc/getfields.c'
        !          1058: -#include      <libc.h>
        !          1059: -
        !          1060: -static char is_sep[256] = {
        !          1061: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !          1062: -      1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !          1063: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !          1064: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !          1065: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !          1066: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !          1067: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !          1068: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !          1069: -};
        !          1070: -static char is_field[256] = {
        !          1071: -      0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        !          1072: -      0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        !          1073: -      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        !          1074: -      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        !          1075: -      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        !          1076: -      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        !          1077: -      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        !          1078: -      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        !          1079: -};
        !          1080: -static char last_sep[256];
        !          1081: -
        !          1082: -char *
        !          1083: -setfields(arg)
        !          1084: -      char *arg;
        !          1085: -{
        !          1086: -      register unsigned char *s;
        !          1087: -      register i;
        !          1088: -
        !          1089: -      for(i = 1, s = (unsigned char *)last_sep; i < 256; i++)
        !          1090: -              if(is_sep[i])
        !          1091: -                      *s++ = i;
        !          1092: -      *s = 0;
        !          1093: -      memset(is_sep, 0, sizeof is_sep);
        !          1094: -      memset(is_field, 1, sizeof is_field);
        !          1095: -      for(s = (unsigned char *)arg; *s;){
        !          1096: -              is_sep[*s] = 1;
        !          1097: -              is_field[*s++] = 0;
        !          1098: -      }
        !          1099: -      is_field[0] = 0;
        !          1100: -      return(last_sep);
        !          1101: -}
        !          1102: -
        !          1103: -getfields(ss, sp, nptrs)
        !          1104: -      char *ss;
        !          1105: -      char **sp;
        !          1106: -{
        !          1107: -      register unsigned char *s = (unsigned char *)ss;
        !          1108: -      register unsigned char **p = (unsigned char **)sp;
        !          1109: -      register unsigned c;
        !          1110: -
        !          1111: -      for(;;){
        !          1112: -              if(--nptrs < 0) break;
        !          1113: -              *p++ = s;
        !          1114: -              while(is_field[c = *s++])
        !          1115: -                      ;
        !          1116: -              if(c == 0) break;
        !          1117: -              s[-1] = 0;
        !          1118: -      }
        !          1119: -      if(nptrs > 0)
        !          1120: -              *p = 0;
        !          1121: -      else if(--s >= (unsigned char *)ss)
        !          1122: -              *s = c;
        !          1123: -      return(p - (unsigned char **)sp);
        !          1124: -}
        !          1125: -
        !          1126: -getmfields(ss, sp, nptrs)
        !          1127: -      char *ss;
        !          1128: -      char **sp;
        !          1129: -{
        !          1130: -      register unsigned char *s = (unsigned char *)ss;
        !          1131: -      register unsigned char **p = (unsigned char **)sp;
        !          1132: -      register unsigned c;
        !          1133: -      register unsigned d;
        !          1134: -
        !          1135: -      if(nptrs <= 0)
        !          1136: -              return(0);
        !          1137: -      goto flushdelim;
        !          1138: -      for(;;){
        !          1139: -              *p++ = s;
        !          1140: -              if(--nptrs == 0) break;
        !          1141: -              while(is_field[c = *s++])
        !          1142: -                      ;
        !          1143: -              /*
        !          1144: -               *  s is now pointing 1 past the delimiter of the last field
        !          1145: -               *  c is the delimiter
        !          1146: -               */
        !          1147: -              if(c == 0) break;
        !          1148: -              s[-1] = 0;
        !          1149: -      flushdelim:
        !          1150: -              while(is_sep[c = *s++])
        !          1151: -                      ;
        !          1152: -              /*
        !          1153: -               *  s is now pointing 1 past the beginning of the next field
        !          1154: -               *  c is the first letter of the field
        !          1155: -               */
        !          1156: -              if(c == 0) break;
        !          1157: -              s--;
        !          1158: -              /*
        !          1159: -               *  s is now pointing to the beginning of the next field
        !          1160: -               *  c is the first letter of the field
        !          1161: -               */
        !          1162: -      }
        !          1163: -      if(nptrs > 0)
        !          1164: -              *p = 0;
        !          1165: -      return(p - (unsigned char **)sp);
        !          1166: -}
        !          1167: -
        !          1168: -#ifdef        MAIN
        !          1169: -#include      <fio.h>
        !          1170: -
        !          1171: -main()
        !          1172: -{
        !          1173: -      char *fields[256];
        !          1174: -      char *s;
        !          1175: -      int n, i;
        !          1176: -      char buf[1024];
        !          1177: -
        !          1178: -      print("go:\n");
        !          1179: -      while(s = Frdline(0)){
        !          1180: -              strcpy(buf, s);
        !          1181: -              Fprint(1, "getf:");
        !          1182: -              n = getfields(s, fields, 4);
        !          1183: -              for(i = 0; i < n; i++)
        !          1184: -                      Fprint(1, " >%s<", fields[i]);
        !          1185: -              Fputc(1, '\n');
        !          1186: -              Fprint(1, "getmf:");
        !          1187: -              n = getmfields(buf, fields, 4);
        !          1188: -              for(i = 0; i < n; i++)
        !          1189: -                      Fprint(1, " >%s<", fields[i]);
        !          1190: -              Fputc(1, '\n');
        !          1191: -              Fflush(1);
        !          1192: -      }
        !          1193: -      exit(0);
        !          1194: -}
        !          1195: -#endif
        !          1196: //GO.SYSIN DD ./libc/getfields.c
        !          1197: echo ./libc/libc.h 1>&2
        !          1198: sed 's/.//' >./libc/libc.h <<'//GO.SYSIN DD ./libc/libc.h'
        !          1199: -/* system calls */
        !          1200: -extern unsigned alarm();
        !          1201: -extern void nap(), pause();
        !          1202: -extern char *sbrk();
        !          1203: -extern void exit(), _exit();
        !          1204: -extern long lseek();
        !          1205: -extern void nice();
        !          1206: -extern void profil();
        !          1207: -extern unsigned long settod();
        !          1208: -extern void sync();
        !          1209: -extern long time();
        !          1210: -
        !          1211: -/* libc et al */
        !          1212: -extern long lcm();
        !          1213: -extern double atof(), strtod();
        !          1214: -extern long atol();
        !          1215: -extern char *crypt();
        !          1216: -extern char *ctime();
        !          1217: -extern char *ecvt(), *fcvt(), *gcvt();
        !          1218: -extern char *galloc();
        !          1219: -extern char *getenv();
        !          1220: -extern char *getlogin();
        !          1221: -extern char *getpass();
        !          1222: -extern char *getwd(), *getcwd();
        !          1223: -extern char *malloc(), *realloc(), *calloc();
        !          1224: -extern char *memcpy(), *memchr(), *memccpy(), *memset();
        !          1225: -extern char *mktemp();
        !          1226: -extern double frand();
        !          1227: -extern char *setfields();
        !          1228: -extern char *strcpy(), *strncpy(), *strcat(), *strncat(), *strchr(), *strrchr();
        !          1229: -extern char *strpbrk(), *strtok(), *strdup();
        !          1230: -extern int atoi();
        !          1231: -extern char *tgetstr(), tgoto();
        !          1232: -extern char *ttyname(), *cttyname();
        !          1233: -
        !          1234: -#define       NONEXIT         33
        !          1235: //GO.SYSIN DD ./libc/libc.h
        !          1236: echo ./libc/onexit.c 1>&2
        !          1237: sed 's/.//' >./libc/onexit.c <<'//GO.SYSIN DD ./libc/onexit.c'
        !          1238: -#include      <libc.h>
        !          1239: -
        !          1240: -int (*_onexitfns[NONEXIT])();
        !          1241: -
        !          1242: -atexit(f)
        !          1243: -int (*f)();
        !          1244: -{
        !          1245: -      onexit(f);
        !          1246: -}
        !          1247: -
        !          1248: -onexit(f)
        !          1249: -int (*f)();
        !          1250: -{
        !          1251: -      int i;
        !          1252: -
        !          1253: -      for(i=0; i<NONEXIT; i++)
        !          1254: -              if(!_onexitfns[i]){
        !          1255: -                      _onexitfns[i] = f;
        !          1256: -                      return(1);
        !          1257: -              }
        !          1258: -      return(0);
        !          1259: -}
        !          1260: //GO.SYSIN DD ./libc/onexit.c
        !          1261: echo ./libc/regexp.h 1>&2
        !          1262: sed 's/.//' >./libc/regexp.h <<'//GO.SYSIN DD ./libc/regexp.h'
        !          1263: -/* the structure describing a sub-expression match */
        !          1264: -typedef struct {
        !          1265: -      char *sp;
        !          1266: -      char *ep;
        !          1267: -} regsubexp;
        !          1268: -
        !          1269: -/* a compiled regular expression */
        !          1270: -typedef char *regexp;
        !          1271: -
        !          1272: -/* the routines */
        !          1273: -extern regexp *regcomp();
        !          1274: -extern int regexec();
        !          1275: -extern void regsub();
        !          1276: //GO.SYSIN DD ./libc/regexp.h
        !          1277: echo ./libc/print.c 1>&2
        !          1278: sed 's/.//' >./libc/print.c <<'//GO.SYSIN DD ./libc/print.c'
        !          1279: -#include <varargs.h>
        !          1280: -
        !          1281: -#define       SIZE    1024
        !          1282: -extern int    printcol;
        !          1283: -
        !          1284: -char  *doprint();
        !          1285: -
        !          1286: -/* VARARGS 1 */
        !          1287: -print(fmt, va_alist)
        !          1288: -char *fmt;
        !          1289: -va_dcl
        !          1290: -{
        !          1291: -      char buf[SIZE], *out;
        !          1292: -      va_list ap;
        !          1293: -
        !          1294: -      va_start(ap);
        !          1295: -      out = doprint(buf, fmt, &ap);
        !          1296: -      va_end(ap);
        !          1297: -      return write(1, buf, (int)(out-buf));
        !          1298: -}
        !          1299: -
        !          1300: -/* VARARGS 2 */
        !          1301: -fprint(fd, fmt, va_alist)
        !          1302: -char *fmt;
        !          1303: -va_dcl
        !          1304: -{
        !          1305: -      char buf[SIZE], *out;
        !          1306: -      va_list ap;
        !          1307: -
        !          1308: -      va_start(ap);
        !          1309: -      out = doprint(buf, fmt, &ap);
        !          1310: -      va_end(ap);
        !          1311: -      return write(fd, buf, (int)(out-buf));
        !          1312: -}
        !          1313: -
        !          1314: -/* VARARGS 2 */
        !          1315: -sprint(buf, fmt, va_alist)
        !          1316: -char *buf;
        !          1317: -char *fmt;
        !          1318: -va_dcl
        !          1319: -{
        !          1320: -      char *out;
        !          1321: -      int scol;
        !          1322: -      va_list ap;
        !          1323: -
        !          1324: -      scol = printcol;
        !          1325: -      va_start(ap);
        !          1326: -      out = doprint(buf, fmt, &ap);
        !          1327: -      va_end(ap);
        !          1328: -      printcol = scol;
        !          1329: -      return out-buf;
        !          1330: -}
        !          1331: //GO.SYSIN DD ./libc/print.c
        !          1332: echo ./libc/strdup.c 1>&2
        !          1333: sed 's/.//' >./libc/strdup.c <<'//GO.SYSIN DD ./libc/strdup.c'
        !          1334: -/*    @(#)strdup.c    1.2     */
        !          1335: -/*LINTLIBRARY*/
        !          1336: -/* string duplication
        !          1337: -   returns pointer to a new string which is the duplicate of string
        !          1338: -   pointed to by s1
        !          1339: -   NULL is returned if new string can't be created
        !          1340: -*/
        !          1341: -
        !          1342: -#include <string.h>
        !          1343: -#ifndef NULL
        !          1344: -#define NULL  0
        !          1345: -#endif
        !          1346: -
        !          1347: -extern int strlen();
        !          1348: -extern char *malloc();
        !          1349: -
        !          1350: -char *
        !          1351: -strdup(s1) 
        !          1352: -
        !          1353: -   char * s1;
        !          1354: -
        !          1355: -{  
        !          1356: -   char * s2;
        !          1357: -
        !          1358: -   s2 = malloc((unsigned) strlen(s1)+1) ;
        !          1359: -   return(s2==NULL ? NULL : strcpy(s2,s1) );
        !          1360: -}
        !          1361: //GO.SYSIN DD ./libc/strdup.c
        !          1362: echo ./libc/Makefile 1>&2
        !          1363: sed 's/.//' >./libc/Makefile <<'//GO.SYSIN DD ./libc/Makefile'
        !          1364: -OBJ=doprint.o exit.o getfields.o onexit.o print.o strdup.o regcomp.o regexec.o regsub.o dup2.o
        !          1365: -
        !          1366: -libc.a:       $(OBJ)
        !          1367: -      ar r libc.a $(OBJ)
        !          1368: -      $(RANLIB) libc.a
        !          1369: -
        !          1370: -cray: libc.o
        !          1371: -
        !          1372: -libc.o:       $(OBJ)
        !          1373: -      cat $(OBJ) > libc.o
        !          1374: //GO.SYSIN DD ./libc/Makefile
        !          1375: echo ./libc/regexec.c 1>&2
        !          1376: sed 's/.//' >./libc/regexec.c <<'//GO.SYSIN DD ./libc/regexec.c'
        !          1377: -#include "regprog.h"
        !          1378: -
        !          1379: -/*
        !          1380: - *    Machine state
        !          1381: - */
        !          1382: -#define LISTINCREMENT 8
        !          1383: -typedef struct List{
        !          1384: -      Inst    *inst;          /* Instruction of the thread */
        !          1385: -      Subexp  se;             /* matched subexpressions in this thread */
        !          1386: -}List;
        !          1387: -static List   *tl, *nl;       /* This list, next list */
        !          1388: -static List   *tle, *nle;     /* ends of this and next list */
        !          1389: -static List   *list[2];
        !          1390: -static List   *liste[2];
        !          1391: -static int    listsize = LISTINCREMENT;
        !          1392: -
        !          1393: -static Subexp sempty;         /* empty set of matches */
        !          1394: -static int match;             /* true if match is found */
        !          1395: -
        !          1396: -/*
        !          1397: - * Note optimization in addinst:
        !          1398: - *    *lp must be pending when addinst called; if *l has been looked
        !          1399: - *            at already, the optimization is a bug.
        !          1400: - */
        !          1401: -static List *
        !          1402: -newthread(lp, ip, sep)
        !          1403: -      List *lp;       /* list to add to */
        !          1404: -      Inst *ip;       /* instruction to add */
        !          1405: -      register Subexp *sep;   /* pointers to subexpressions */
        !          1406: -{
        !          1407: -      register List *p;
        !          1408: -
        !          1409: -      for(p=lp; p->inst != NULL; p++){
        !          1410: -              if(p->inst==ip){
        !          1411: -                      if((sep)->m[0].sp < p->se.m[0].sp)
        !          1412: -                              p->se = *sep;
        !          1413: -                      return NULL;
        !          1414: -              }
        !          1415: -      }
        !          1416: -      p->inst = ip;
        !          1417: -      p->se = *sep;
        !          1418: -      (++p)->inst = NULL;
        !          1419: -      return p;
        !          1420: -}
        !          1421: -
        !          1422: -static void
        !          1423: -newmatch(mp, ms, sp)
        !          1424: -      regsubexp *mp;
        !          1425: -      int ms; 
        !          1426: -      register Subexp *sp;
        !          1427: -{
        !          1428: -      register int i;
        !          1429: -
        !          1430: -      if (mp==NULL || ms <=0)
        !          1431: -              return;
        !          1432: -      if(mp[0].sp==0 || sp->m[0].sp<mp[0].sp ||
        !          1433: -         (sp->m[0].sp==mp[0].sp && sp->m[0].ep>mp[0].ep)) {
        !          1434: -              for (i=0; i<ms && i<NSUBEXP; i++)
        !          1435: -                      mp[i] = sp->m[i];
        !          1436: -              for (; i<ms; i++)
        !          1437: -                      mp[i].sp = mp[i].ep = NULL;
        !          1438: -      }
        !          1439: -}
        !          1440: -
        !          1441: -extern int
        !          1442: -regexec(progp, starts, mp, ms)
        !          1443: -      Prog *progp;    /* program to run */
        !          1444: -      char *starts;   /* string to run machine on */
        !          1445: -      regsubexp *mp;  /* subexpression elements */
        !          1446: -      int ms;         /* number of elements pointed to by mp */
        !          1447: -{
        !          1448: -      register flag=0;
        !          1449: -      register Inst *inst;
        !          1450: -      register List *tlp;
        !          1451: -      register char *s;
        !          1452: -      int startchar=progp->startinst->type<OPERATOR? progp->startinst->type : 0;
        !          1453: -      int i, checkstart;
        !          1454: -
        !          1455: -restart:
        !          1456: -      match = 0;
        !          1457: -      checkstart = startchar;
        !          1458: -      sempty.m[0].sp = NULL;
        !          1459: -      if (mp!=NULL && ms >0)
        !          1460: -              mp[0].sp = mp[0].ep = NULL;
        !          1461: -      if (list[0] == NULL) {
        !          1462: -              list[0] = (List *)malloc(2*listsize*sizeof(List));
        !          1463: -              list[1] = list[0] + listsize;
        !          1464: -              liste[0] = list[0] + listsize - 1;
        !          1465: -              liste[1] = list[1] + listsize - 1;
        !          1466: -              if (list[0] == NULL)
        !          1467: -                      regerror("list overflow");
        !          1468: -      }
        !          1469: -      list[0][0].inst = list[1][0].inst = NULL;
        !          1470: -
        !          1471: -      /* Execute machine once for each character, including terminal NUL */
        !          1472: -      s=starts;
        !          1473: -      do{
        !          1474: -              /* fast check for first char */
        !          1475: -              if(checkstart && *s!=startchar)
        !          1476: -                      continue;
        !          1477: -              tl=list[flag];
        !          1478: -              tle=liste[flag];
        !          1479: -              nl=list[flag^=1];
        !          1480: -              nle=liste[flag];
        !          1481: -              nl->inst=0;
        !          1482: -              /* Add first instruction to this list */
        !          1483: -              sempty.m[0].sp = s;
        !          1484: -              (void)newthread(tl, progp->startinst, &sempty);
        !          1485: -              /* Execute machine until this list is empty */
        !          1486: -              for(tlp=tl; inst=tlp->inst; tlp++){     /* assignment = */
        !          1487: -      Switchstmt:
        !          1488: -                      switch(inst->type){
        !          1489: -                      default:        /* regular character */
        !          1490: -                              if(inst->type == *s){
        !          1491: -      Addinst:
        !          1492: -                                      if(newthread(nl, inst->next, &tlp->se)==nle)
        !          1493: -                                              goto realloc;
        !          1494: -                              }
        !          1495: -                              break;
        !          1496: -                      case LBRA:
        !          1497: -                              tlp->se.m[inst->subid].sp = s;
        !          1498: -                              inst=inst->next;
        !          1499: -                              goto Switchstmt;
        !          1500: -                      case RBRA:
        !          1501: -                              tlp->se.m[inst->subid].ep = s;
        !          1502: -                              inst=inst->next;
        !          1503: -                              goto Switchstmt;
        !          1504: -                      case ANY:
        !          1505: -                              goto Addinst;
        !          1506: -                      case BOL:
        !          1507: -                              if(s == starts){
        !          1508: -                                      inst=inst->next;
        !          1509: -                                      goto Switchstmt;
        !          1510: -                              }
        !          1511: -                              break;
        !          1512: -                      case EOL:
        !          1513: -                              if(*s=='\0'){
        !          1514: -                                      inst=inst->next;
        !          1515: -                                      goto Switchstmt;
        !          1516: -                              }
        !          1517: -                              break;
        !          1518: -                      case CCLASS:
        !          1519: -                              if(((char *)inst->right)[*s/8]&(1<<(*s&07)))
        !          1520: -                                      goto Addinst;
        !          1521: -                              break;
        !          1522: -                      case OR:
        !          1523: -                              /* evaluate right choice later */
        !          1524: -                              if (newthread(tlp, inst->right, &tlp->se) == tle)
        !          1525: -                                      goto realloc;
        !          1526: -                              /* efficiency: advance and re-evaluate */
        !          1527: -                              inst=inst->left;
        !          1528: -                              goto Switchstmt;
        !          1529: -                      case END:       /* Match! */
        !          1530: -                              match = 1;
        !          1531: -                              tlp->se.m[0].ep = s;
        !          1532: -                              if (mp != NULL && ms > 0)                                                                       newmatch(mp, ms, &tlp->se);
        !          1533: -                              break;
        !          1534: -                      }
        !          1535: -              }
        !          1536: -              checkstart = startchar && nl->inst==NULL;
        !          1537: -      }while(*s++);
        !          1538: -      return match;
        !          1539: -realloc:
        !          1540: -      free(list[0]);
        !          1541: -      list[0] = NULL;
        !          1542: -      listsize += LISTINCREMENT;
        !          1543: -      goto restart;
        !          1544: -}
        !          1545: -
        !          1546: //GO.SYSIN DD ./libc/regexec.c
        !          1547: echo ./libc/regprog.h 1>&2
        !          1548: sed 's/.//' >./libc/regprog.h <<'//GO.SYSIN DD ./libc/regprog.h'
        !          1549: -#include <regexp.h>
        !          1550: -
        !          1551: -/* useful constants */
        !          1552: -#define NULL 0
        !          1553: -#define       TRUE    1
        !          1554: -#define       FALSE   0
        !          1555: -#define       HAT     '\177'          /* character to mark real beg. of line */
        !          1556: -
        !          1557: -/*
        !          1558: - *    Sub expression matches
        !          1559: - */
        !          1560: -#define NSUBEXP 10
        !          1561: -typedef struct {
        !          1562: -      regsubexp m[NSUBEXP];
        !          1563: -}Subexp;
        !          1564: -
        !          1565: -/*
        !          1566: - *    character class
        !          1567: - */
        !          1568: -typedef struct {
        !          1569: -      char    map[16];        /* 16 bytes == 128 bits, one bit per char */
        !          1570: -}Class;
        !          1571: -
        !          1572: -/*
        !          1573: - *    Machine instructions
        !          1574: - */
        !          1575: -typedef struct Inst{
        !          1576: -      int     type;                   /* < 0200 ==> literal, otherwise action */
        !          1577: -      union   {
        !          1578: -              int sid;                /* sub-expression id for RBRA and LBRA */
        !          1579: -              struct Inst *other;     /* instructions pointer */
        !          1580: -      } u;
        !          1581: -      struct Inst *left;
        !          1582: -}Inst;
        !          1583: -#define       next    left    /* Left branch is usually just next ptr */
        !          1584: -#define       subid   u.sid
        !          1585: -#define right u.other
        !          1586: -
        !          1587: -/*
        !          1588: - *    Program definition
        !          1589: - */
        !          1590: -#define       NCLASS  16
        !          1591: -typedef struct Program{
        !          1592: -      Inst    *startinst;     /* start pc */
        !          1593: -      Class   class[NCLASS];  /* .data */
        !          1594: -      Inst    firstinst[5];   /* .text */
        !          1595: -}Prog;
        !          1596: -
        !          1597: -/*
        !          1598: - * Actions and Tokens
        !          1599: - *
        !          1600: - *    02xx are operators, value == precedence
        !          1601: - *    03xx are tokens, i.e. operands for operators
        !          1602: - */
        !          1603: -#define       OPERATOR        0200    /* Bitmask of all operators */
        !          1604: -#define       START           0200    /* Start, used for marker on stack */
        !          1605: -#define       RBRA            0201    /* Right bracket, ) */
        !          1606: -#define       LBRA            0202    /* Left bracket, ( */
        !          1607: -#define       OR              0203    /* Alternation, | */
        !          1608: -#define       CAT             0204    /* Concatentation, implicit operator */
        !          1609: -#define       STAR            0205    /* Closure, * */
        !          1610: -#define       PLUS            0206    /* a+ == aa* */
        !          1611: -#define       QUEST           0207    /* a? == a|nothing, i.e. 0 or 1 a's */
        !          1612: -#define       ANY             0300    /* Any character, . */
        !          1613: -#define       NOP             0301    /* No operation, internal use only */
        !          1614: -#define       BOL             0302    /* Beginning of line, ^ */
        !          1615: -#define       EOL             0303    /* End of line, $ */
        !          1616: -#define       CCLASS          0304    /* Character class, [] */
        !          1617: -#define       END             0377    /* Terminate: match found */
        !          1618: //GO.SYSIN DD ./libc/regprog.h
        !          1619: echo ./libc/regsub.c 1>&2
        !          1620: sed 's/.//' >./libc/regsub.c <<'//GO.SYSIN DD ./libc/regsub.c'
        !          1621: -#include "regprog.h"
        !          1622: -
        !          1623: -/* substitute into one string using the matches from the last regexec() */
        !          1624: -extern void
        !          1625: -regsub (sp, dp, mp, ms)
        !          1626: -      char *sp;       /* source string */
        !          1627: -      char *dp;       /* destination string */
        !          1628: -      regsubexp *mp;  /* subexpression elements */
        !          1629: -      int ms;         /* number of elements pointed to by mp */
        !          1630: -{
        !          1631: -      char *ssp;
        !          1632: -      register int i;
        !          1633: -
        !          1634: -      while (*sp != '\0') {
        !          1635: -              if (*sp == '\\') {
        !          1636: -                      switch (*++sp) {
        !          1637: -                      case '0':
        !          1638: -                      case '1':
        !          1639: -                      case '2':
        !          1640: -                      case '3':
        !          1641: -                      case '4':
        !          1642: -                      case '5':
        !          1643: -                      case '6':
        !          1644: -                      case '7':
        !          1645: -                      case '8':
        !          1646: -                      case '9':
        !          1647: -                              i = *sp-'0';
        !          1648: -                              if (mp[i].sp != NULL && mp!=NULL && ms>i)
        !          1649: -                                      for (ssp = mp[i].sp;
        !          1650: -                                           ssp < mp[i].ep;
        !          1651: -                                           ssp++)
        !          1652: -                                              *dp++ = *ssp;
        !          1653: -                              break;
        !          1654: -                      case '\\':
        !          1655: -                              *dp++ = '\\';
        !          1656: -                              break;
        !          1657: -                      case '\0':
        !          1658: -                              sp--;
        !          1659: -                              break;
        !          1660: -                      default:
        !          1661: -                              *dp++ = *sp;
        !          1662: -                              break;
        !          1663: -                      }
        !          1664: -              } else if (*sp == '&') {                                
        !          1665: -                      if (mp[0].sp != NULL && mp!=NULL && ms>0)
        !          1666: -                      if (mp[0].sp != NULL)
        !          1667: -                              for (ssp = mp[0].sp;
        !          1668: -                                   ssp < mp[0].ep; ssp++)
        !          1669: -                                      *dp++ = *ssp;
        !          1670: -              } else
        !          1671: -                      *dp++ = *sp;
        !          1672: -              sp++;
        !          1673: -      }
        !          1674: -      *dp = '\0';
        !          1675: -}
        !          1676: //GO.SYSIN DD ./libc/regsub.c
        !          1677: echo ./libc/dup2.c 1>&2
        !          1678: sed 's/.//' >./libc/dup2.c <<'//GO.SYSIN DD ./libc/dup2.c'
        !          1679: -#ifdef        SYSV
        !          1680: -/*
        !          1681: -      dup2(a, b)
        !          1682: -
        !          1683: -      dup a as value b
        !          1684: -*/
        !          1685: -
        !          1686: -dup2(a, b)
        !          1687: -{
        !          1688: -      int poot[256];          /* greater than NFILES i hope! */
        !          1689: -      register i, ret;
        !          1690: -
        !          1691: -      close(b);
        !          1692: -      for(i = 0; (poot[i] = dup(a)) >= 0; i++)
        !          1693: -              if(poot[i] == b) break;
        !          1694: -      ret = i;
        !          1695: -      while(--i >= 0)
        !          1696: -              close(poot[i]);         /* don't need 'em anymore */
        !          1697: -      return(poot[ret]);
        !          1698: -}
        !          1699: -#endif
        !          1700: //GO.SYSIN DD ./libc/dup2.c
        !          1701: echo ./libc/new.mk 1>&2
        !          1702: sed 's/.//' >./libc/new.mk <<'//GO.SYSIN DD ./libc/new.mk'
        !          1703: -#ifdef DEBUG
        !          1704: -#include <stdio.h>
        !          1705: -#endif
        !          1706: -#include <libc.h>
        !          1707: -#include "regprog.h"
        !          1708: -
        !          1709: -/*
        !          1710: - * Parser Information
        !          1711: - */
        !          1712: -typedef struct Node{
        !          1713: -      Inst    *first;
        !          1714: -      Inst    *last;
        !          1715: -}Node;
        !          1716: -#define       NSTACK  20
        !          1717: -static Node   andstack[NSTACK];
        !          1718: -static Node   *andp;
        !          1719: -static int    atorstack[NSTACK];
        !          1720: -static int    *atorp;
        !          1721: -static int    cursubid;               /* id of current subexpression */
        !          1722: -static int    subidstack[NSTACK];     /* parallel to atorstack */
        !          1723: -static int    *subidp;
        !          1724: -static int    lastwasand;     /* Last token was operand */
        !          1725: -static int    nbra;
        !          1726: -static char   *exprp;         /* pointer to next character in source expression */
        !          1727: -static int    nclass;
        !          1728: -static Class  *classp;
        !          1729: -static Inst   *freep;
        !          1730: -static int    errors;
        !          1731: -
        !          1732: -/* predeclared crap */
        !          1733: -static void operator();
        !          1734: -static void pushand();
        !          1735: -static void pushator();
        !          1736: -static void evaluntil();
        !          1737: -static void bldcclass();
        !          1738: -
        !          1739: -static void
        !          1740: -rcerror(s)
        !          1741: -      char *s;
        !          1742: -{
        !          1743: -      errors++;
        !          1744: -      regerror(s);
        !          1745: -}
        !          1746: -
        !          1747: -static Inst *
        !          1748: -newinst(t)
        !          1749: -      int t;
        !          1750: -{
        !          1751: -      freep->type=t;
        !          1752: -      freep->left=0;
        !          1753: -      freep->right=0;
        !          1754: -      return freep++;
        !          1755: -}
        !          1756: -
        !          1757: -static void
        !          1758: -operand(t)
        !          1759: -      int t;
        !          1760: -{
        !          1761: -      register Inst *i;
        !          1762: -      if(lastwasand)
        !          1763: -              operator(CAT);  /* catenate is implicit */
        !          1764: -      i=newinst(t);
        !          1765: -      if(t==CCLASS)   /* ugh */
        !          1766: -              i->right=(Inst *)&(classp[nclass-1]);   /* UGH! */
        !          1767: -      pushand(i, i);
        !          1768: -      lastwasand=TRUE;
        !          1769: -}
        !          1770: -
        !          1771: -static void
        !          1772: -operator(t)
        !          1773: -      int t;
        !          1774: -{
        !          1775: -      if(t==RBRA && --nbra<0)
        !          1776: -              rcerror("unmatched right paren");
        !          1777: -      if(t==LBRA) {
        !          1778: -              if (++cursubid >= NSUBEXP)
        !          1779: -                      rcerror ("too many subexpressions");
        !          1780: -              nbra++;
        !          1781: -              if (lastwasand)
        !          1782: -                      operator(CAT);
        !          1783: -      } else
        !          1784: -              evaluntil(t);
        !          1785: -      if(t!=RBRA)
        !          1786: -              pushator(t);
        !          1787: -      lastwasand=FALSE;
        !          1788: -      if(t==STAR || t==QUEST || t==PLUS || t==RBRA)
        !          1789: -              lastwasand=TRUE;        /* these look like operands */
        !          1790: -}
        !          1791: -
        !          1792: -static void
        !          1793: -regerr2(s, c)
        !          1794: -      char *s;
        !          1795: -{
        !          1796: -      char buf[100];
        !          1797: -      char *cp = buf;
        !          1798: -      while(*s)
        !          1799: -              *cp++ = *s++;
        !          1800: -      *cp++ = c;
        !          1801: -      *cp = '\0'; 
        !          1802: -      rcerror(buf);
        !          1803: -}
        !          1804: -
        !          1805: -static void
        !          1806: -cant(s)
        !          1807: -      char *s;
        !          1808: -{
        !          1809: -      char buf[100];
        !          1810: -      strcpy(buf, "can't happen: ");
        !          1811: -      strcat(buf, s);
        !          1812: -      rcerror(buf);
        !          1813: -}
        !          1814: -
        !          1815: -static void
        !          1816: -pushand(f, l)
        !          1817: -      Inst *f, *l;
        !          1818: -{
        !          1819: -      if(andp >= &andstack[NSTACK])
        !          1820: -              cant("operand stack overflow");
        !          1821: -      andp->first=f;
        !          1822: -      andp->last=l;
        !          1823: -      andp++;
        !          1824: -}
        !          1825: -
        !          1826: -static void
        !          1827: -pushator(t)
        !          1828: -      int t;
        !          1829: -{
        !          1830: -      if(atorp >= &atorstack[NSTACK])
        !          1831: -              cant("operator stack overflow");
        !          1832: -      *atorp++=t;
        !          1833: -      *subidp++=cursubid;
        !          1834: -}
        !          1835: -
        !          1836: -static Node *
        !          1837: -popand(op)
        !          1838: -{
        !          1839: -      register Inst *inst;
        !          1840: -
        !          1841: -      if(andp <= &andstack[0]) {
        !          1842: -              regerr2("missing operand for ", op);
        !          1843: -              inst=newinst(NOP);
        !          1844: -              pushand(inst,inst);
        !          1845: -      }
        !          1846: -      return --andp;
        !          1847: -}
        !          1848: -
        !          1849: -static int
        !          1850: -popator()
        !          1851: -{
        !          1852: -      if(atorp <= &atorstack[0])
        !          1853: -              cant("operator stack underflow");
        !          1854: -      --subidp;
        !          1855: -      return *--atorp;
        !          1856: -}
        !          1857: -
        !          1858: -static void
        !          1859: -evaluntil(pri)
        !          1860: -      register pri;
        !          1861: -{
        !          1862: -      register Node *op1, *op2;
        !          1863: -      register Inst *inst1, *inst2;
        !          1864: -
        !          1865: -      while(pri==RBRA || atorp[-1]>=pri){
        !          1866: -              switch(popator()){
        !          1867: -              default:
        !          1868: -                      rcerror("unknown operator in evaluntil");
        !          1869: -                      break;
        !          1870: -              case LBRA:              /* must have been RBRA */
        !          1871: -                      op1=popand('(');
        !          1872: -                      inst2=newinst(RBRA);
        !          1873: -                      inst2->subid = *subidp;
        !          1874: -                      op1->last->next = inst2;
        !          1875: -                      inst1=newinst(LBRA);
        !          1876: -                      inst1->subid = *subidp;
        !          1877: -                      inst1->next=op1->first;
        !          1878: -                      pushand(inst1, inst2);
        !          1879: -                      return;
        !          1880: -              case OR:
        !          1881: -                      op2=popand('|');
        !          1882: -                      op1=popand('|');
        !          1883: -                      inst2=newinst(NOP);
        !          1884: -                      op2->last->next=inst2;
        !          1885: -                      op1->last->next=inst2;
        !          1886: -                      inst1=newinst(OR);
        !          1887: -                      inst1->right=op1->first;
        !          1888: -                      inst1->left=op2->first;
        !          1889: -                      pushand(inst1, inst2);
        !          1890: -                      break;
        !          1891: -              case CAT:
        !          1892: -                      op2=popand(0);
        !          1893: -                      op1=popand(0);
        !          1894: -                      op1->last->next=op2->first;
        !          1895: -                      pushand(op1->first, op2->last);
        !          1896: -                      break;
        !          1897: -              case STAR:
        !          1898: -                      op2=popand('*');
        !          1899: -                      inst1=newinst(OR);
        !          1900: -                      op2->last->next=inst1;
        !          1901: -                      inst1->right=op2->first;
        !          1902: -                      pushand(inst1, inst1);
        !          1903: -                      break;
        !          1904: -              case PLUS:
        !          1905: -                      op2=popand('+');
        !          1906: -                      inst1=newinst(OR);
        !          1907: -                      op2->last->next=inst1;
        !          1908: -                      inst1->right=op2->first;
        !          1909: -                      pushand(op2->first, inst1);
        !          1910: -                      break;
        !          1911: -              case QUEST:
        !          1912: -                      op2=popand('?');
        !          1913: -                      inst1=newinst(OR);
        !          1914: -                      inst2=newinst(NOP);
        !          1915: -                      inst1->left=inst2;
        !          1916: -                      inst1->right=op2->first;
        !          1917: -                      op2->last->next=inst2;
        !          1918: -                      pushand(inst1, inst2);
        !          1919: -                      break;
        !          1920: -              }
        !          1921: -      }
        !          1922: -}
        !          1923: -
        !          1924: -static Prog *
        !          1925: -optimize(pp)
        !          1926: -      Prog *pp;
        !          1927: -{
        !          1928: -      register Inst *inst, *target;
        !          1929: -      int size;
        !          1930: -      Prog *npp;
        !          1931: -
        !          1932: -      /*
        !          1933: -       *  get rid of NOOP chains
        !          1934: -       */
        !          1935: -      for(inst=pp->firstinst; inst->type!=END; inst++){
        !          1936: -              target=inst->next;
        !          1937: -              while(target->type == NOP)
        !          1938: -                      target=target->next;
        !          1939: -              inst->next=target;
        !          1940: -      }
        !          1941: -
        !          1942: -      /*
        !          1943: -       *  The original allocation is for an area larger than
        !          1944: -       *  necessary.  Reallocate to the actual space used
        !          1945: -       *  and then relocate the code.
        !          1946: -       */
        !          1947: -      size = sizeof(Prog) + (freep - pp->firstinst)*sizeof(Inst);
        !          1948: -      npp = (Prog *)realloc((char *)pp, size);
        !          1949: -      if(npp==NULL || npp==pp)
        !          1950: -              return(pp);
        !          1951: -      freep = &npp->firstinst[freep - pp->firstinst];
        !          1952: -      npp->startinst = &npp->firstinst[pp->startinst - pp->firstinst];
        !          1953: -      for(inst=npp->firstinst; inst<freep; inst++){
        !          1954: -              switch(inst->type){
        !          1955: -              case OR:
        !          1956: -              case STAR:
        !          1957: -              case PLUS:
        !          1958: -              case QUEST:
        !          1959: -                      inst->right = &npp->firstinst[inst->right - pp->firstinst];
        !          1960: -                      break;
        !          1961: -              case CCLASS:
        !          1962: -                      inst->right = (Inst *) &npp->class[(Class*)inst->right - pp->class];
        !          1963: -                      break;
        !          1964: -              }
        !          1965: -              inst->left = &npp->firstinst[inst->left - pp->firstinst];
        !          1966: -      }
        !          1967: -      return(npp);
        !          1968: -}
        !          1969: -
        !          1970: -#ifdef        DEBUG
        !          1971: -static char *
        !          1972: -dumptype(t){
        !          1973: -      static char ordinary[4] = "'.'";
        !          1974: -
        !          1975: -      switch(t){
        !          1976: -      case START:     return "START";
        !          1977: -      case RBRA:      return "RBRA";
        !          1978: -      case LBRA:      return "LBRA";
        !          1979: -      case OR:        return "OR";
        !          1980: -      case CAT:       return "CAT";
        !          1981: -      case STAR:      return "STAR";
        !          1982: -      case PLUS:      return "PLUS";
        !          1983: -      case QUEST:     return "QUEST";
        !          1984: -      case ANY:       return "ANY";
        !          1985: -      case NOP:       return "NOP";
        !          1986: -      case BOL:       return "BOL";
        !          1987: -      case EOL:       return "EOL";
        !          1988: -      case CCLASS:    return "CCLASS";
        !          1989: -      case END:       return "END";
        !          1990: -      default:
        !          1991: -              ordinary[1] = t;
        !          1992: -              return ordinary;
        !          1993: -      }
        !          1994: -}
        !          1995: -
        !          1996: -static void
        !          1997: -dumpstack(){
        !          1998: -      Node *stk;
        !          1999: -      int *ip;
        !          2000: -
        !          2001: -      printf("operators\n");
        !          2002: -      for(ip=atorstack; ip<atorp; ip++)
        !          2003: -              printf("0%o\n", *ip);
        !          2004: -      printf("operands\n");
        !          2005: -      for(stk=andstack; stk<andp; stk++){
        !          2006: -              printf("%s\t", dumptype(stk->first->type));
        !          2007: -              printf("%s\n", dumptype(stk->last->type));
        !          2008: -      }
        !          2009: -}
        !          2010: -
        !          2011: -static void
        !          2012: -putC(c)
        !          2013: -{
        !          2014: -      if(c < ' ' || '~' < c){
        !          2015: -              switch(c){
        !          2016: -              default:
        !          2017: -                      putchar('^');
        !          2018: -                      putchar((c + '@') & 0x7f);
        !          2019: -                      return;
        !          2020: -              case '\b':
        !          2021: -                      c = 'b';
        !          2022: -                      break;
        !          2023: -              case '\t':
        !          2024: -                      c = 't';
        !          2025: -                      break;
        !          2026: -              case '\n':
        !          2027: -                      c = 'n';
        !          2028: -                      break;
        !          2029: -              case '\v':
        !          2030: -                      c = 'v';
        !          2031: -                      break;
        !          2032: -              case '\f':
        !          2033: -                      c = 'f';
        !          2034: -                      break;
        !          2035: -              case '\r':
        !          2036: -                      c = 'r';
        !          2037: -                      break;
        !          2038: -              }
        !          2039: -              putchar('\\');
        !          2040: -      }
        !          2041: -      putchar(c);
        !          2042: -}
        !          2043: -
        !          2044: -static void
        !          2045: -putCHAR(from, to)
        !          2046: -{
        !          2047: -      if(from != 0)
        !          2048: -              if(from == to)
        !          2049: -                      putC(from);
        !          2050: -              else{
        !          2051: -                      putC(from);
        !          2052: -                      putchar('-');
        !          2053: -                      putC(to);
        !          2054: -              }
        !          2055: -}
        !          2056: -
        !          2057: -static void
        !          2058: -dump(pp)
        !          2059: -      Prog *pp;
        !          2060: -{
        !          2061: -      int c, from;
        !          2062: -      Inst *l;
        !          2063: -      Class *classp;
        !          2064: -
        !          2065: -      l=pp->firstinst;
        !          2066: -      do{
        !          2067: -              printf("%d:\t%s\t%d\t", l-pp->firstinst, dumptype(l->type),
        !          2068: -                      l->left-pp->firstinst);
        !          2069: -              if(l->type == CCLASS){
        !          2070: -                      classp = (Class*) l->right;
        !          2071: -                      putchar('[');
        !          2072: -                      if(classp->map[0] & 02){        /* ^A? */
        !          2073: -                              putchar('^');           /* assume negation */
        !          2074: -                              for(from=0, c=1; c < 128; ++c){
        !          2075: -                                      if(classp->map[c/8] & (1<<(c&07))){
        !          2076: -                                              putCHAR(from, c-1);
        !          2077: -                                              from = 0;
        !          2078: -                                      } else {
        !          2079: -                                              if(from == 0)
        !          2080: -                                                      from = c;
        !          2081: -                                      }
        !          2082: -                              }
        !          2083: -                              putCHAR(from, c-1);
        !          2084: -                      } else {
        !          2085: -                              for(from=0, c=1; c < 128; ++c){
        !          2086: -                                      if(classp->map[c/8] & (1<<(c&07))){
        !          2087: -                                              if(from == 0)
        !          2088: -                                                      from = c;
        !          2089: -                                      } else {
        !          2090: -                                              putCHAR(from, c-1);
        !          2091: -                                              from = 0;
        !          2092: -                                      }
        !          2093: -                              }
        !          2094: -                              putCHAR(from, c-1);
        !          2095: -                      }
        !          2096: -                      putchar(']');
        !          2097: -              } else
        !          2098: -                      printf("%d", l->right-pp->firstinst);
        !          2099: -              putchar('\n');
        !          2100: -      }while(l++->type);
        !          2101: -}
        !          2102: -#endif
        !          2103: -
        !          2104: -static void
        !          2105: -startlex(s)
        !          2106: -      char *s;
        !          2107: -{
        !          2108: -      exprp=s;
        !          2109: -      nclass=0;
        !          2110: -      nbra=0;
        !          2111: -}
        !          2112: -
        !          2113: -static Class *
        !          2114: -newclass(){
        !          2115: -      register Class *p;
        !          2116: -      register n;
        !          2117: -
        !          2118: -      if(nclass >= NCLASS)
        !          2119: -              regerr2("too many character classes; limit", NCLASS+'0');
        !          2120: -      p = &(classp[nclass++]);
        !          2121: -      for(n=0; n<16; n++)
        !          2122: -              p->map[n]=0;
        !          2123: -      return p;
        !          2124: -}
        !          2125: -
        !          2126: -static int
        !          2127: -lex(){
        !          2128: -      register c= *exprp++;
        !          2129: -
        !          2130: -      switch(c){
        !          2131: -      case '\\':
        !          2132: -              if(*exprp)
        !          2133: -                      c= *exprp++;
        !          2134: -              break;
        !          2135: -      case 0:
        !          2136: -              c=END;
        !          2137: -              --exprp;        /* In case we come here again */
        !          2138: -              break;
        !          2139: -      case '*':
        !          2140: -              c=STAR;
        !          2141: -              break;
        !          2142: -      case '?':
        !          2143: -              c=QUEST;
        !          2144: -              break;
        !          2145: -      case '+':
        !          2146: -              c=PLUS;
        !          2147: -              break;
        !          2148: -      case '|':
        !          2149: -              c=OR;
        !          2150: -              break;
        !          2151: -      case '.':
        !          2152: -              c=ANY;
        !          2153: -              break;
        !          2154: -      case '(':
        !          2155: -              c=LBRA;
        !          2156: -              break;
        !          2157: -      case ')':
        !          2158: -              c=RBRA;
        !          2159: -              break;
        !          2160: -      case '^':
        !          2161: -              c=BOL;
        !          2162: -              break;
        !          2163: -      case '$':
        !          2164: -              c=EOL;
        !          2165: -              break;
        !          2166: -      case '[':
        !          2167: -              c=CCLASS;
        !          2168: -              bldcclass();
        !          2169: -              break;
        !          2170: -      }
        !          2171: -      return c;
        !          2172: -}
        !          2173: -
        !          2174: -static int
        !          2175: -nextc(){
        !          2176: -      if(exprp[0]==0 || (exprp[0]=='\\' && exprp[1]==0))
        !          2177: -              rcerror("malformed '[]'");
        !          2178: -      if(exprp[0]=='\\'){
        !          2179: -              exprp++;
        !          2180: -              return *exprp++|0200;
        !          2181: -      }
        !          2182: -      return *exprp++;
        !          2183: -}
        !          2184: -
        !          2185: -static void
        !          2186: -bldcclass(){
        !          2187: -      register c1, c2;
        !          2188: -      register Class *classp;
        !          2189: -      register negate=FALSE;
        !          2190: -
        !          2191: -      classp=newclass();
        !          2192: -      /* we have already seen the '[' */
        !          2193: -      if(*exprp=='^'){
        !          2194: -              negate=TRUE;
        !          2195: -              exprp++;
        !          2196: -      }
        !          2197: -      while((c1=c2=nextc()) != ']'){
        !          2198: -              if(*exprp=='-'){
        !          2199: -                      exprp++;        /* eat '-' */
        !          2200: -                      if((c2=nextc()) == ']')
        !          2201: -                              rcerror("malformed '[]'");
        !          2202: -              }
        !          2203: -              for((c1&=0177), (c2&=0177); c1<=c2; c1++)
        !          2204: -                      classp->map[c1/8] |= 1<<(c1&07);
        !          2205: -      }
        !          2206: -      if(negate)
        !          2207: -              for(c1=0; c1<16; c1++)
        !          2208: -                      classp->map[c1]^=0377;
        !          2209: -      classp->map[0] &= 0376;         /* exclude NUL */
        !          2210: -}
        !          2211: -
        !          2212: -extern regexp *
        !          2213: -regcomp(s)
        !          2214: -      char *s;
        !          2215: -{
        !          2216: -      register token;
        !          2217: -      Prog *pp;
        !          2218: -
        !          2219: -      /* get memory for the program */
        !          2220: -      pp = (Prog *)malloc(sizeof(Prog) + 3*sizeof(Inst)*strlen(s));
        !          2221: -      if (pp == NULL) {
        !          2222: -              rcerror("out of memory");
        !          2223: -              return NULL;
        !          2224: -      }
        !          2225: -      freep = pp->firstinst;
        !          2226: -      classp = pp->class;
        !          2227: -      errors = 0;
        !          2228: -
        !          2229: -      /* go compile the sucker */
        !          2230: -      startlex(s);
        !          2231: -      atorp=atorstack;
        !          2232: -      andp=andstack;
        !          2233: -      subidp=subidstack;
        !          2234: -      lastwasand=FALSE;
        !          2235: -      cursubid=0;
        !          2236: -
        !          2237: -      /* Start with a low priority operator to prime parser */
        !          2238: -      pushator(START-1);
        !          2239: -      while((token=lex()) != END){
        !          2240: -              if((token&0300) == OPERATOR)
        !          2241: -                      operator(token);
        !          2242: -              else
        !          2243: -                      operand(token);
        !          2244: -      }
        !          2245: -
        !          2246: -      /* Close with a low priority operator */
        !          2247: -      evaluntil(START);
        !          2248: -
        !          2249: -      /* Force END */
        !          2250: -      operand(END);
        !          2251: -      evaluntil(START);
        !          2252: -#ifdef DEBUG
        !          2253: -      dumpstack();
        !          2254: -#endif
        !          2255: -      if(nbra)
        !          2256: -              rcerror("unmatched left paren");
        !          2257: -      --andp; /* points to first and only operand */
        !          2258: -      pp->startinst=andp->first;
        !          2259: -#ifdef DEBUG
        !          2260: -      dump(pp);
        !          2261: -#endif
        !          2262: -      pp = optimize(pp);
        !          2263: -#ifdef DEBUG
        !          2264: -      printf("start: %d\n", pp->startinst-pp->firstinst);
        !          2265: -      dump(pp);
        !          2266: -      fflush(stdout);
        !          2267: -#endif
        !          2268: -      if (errors) {
        !          2269: -              free((char *)pp);
        !          2270: -              pp = NULL;
        !          2271: -      }
        !          2272: -      return (regexp *)pp;
        !          2273: -}
        !          2274: -
        !          2275: -#ifdef DEBUG
        !          2276: -#include <setjmp.h>
        !          2277: -
        !          2278: -jmp_buf       jmpbuf;
        !          2279: -
        !          2280: -main( argc, argv )
        !          2281: -      char **argv;
        !          2282: -{
        !          2283: -      regexp *prog = NULL;
        !          2284: -      regsubexp match[NSUBEXP];
        !          2285: -      char line[256];
        !          2286: -      int i;
        !          2287: -
        !          2288: -      while( TRUE ) {
        !          2289: -              setjmp( jmpbuf );
        !          2290: -
        !          2291: -              if(prog)
        !          2292: -                      free( prog );
        !          2293: -
        !          2294: -              do {
        !          2295: -                      fputs( "Enter re: ", stdout );
        !          2296: -                      if ( gets(line) == NULL )
        !          2297: -                              exit(0);
        !          2298: -              } while( (prog = regcomp(line)) == NULL );
        !          2299: -
        !          2300: -              fputs( "Enter string: ", stdout );
        !          2301: -              while( gets(line) != NULL ) {
        !          2302: -                      if ( !regexec(prog,line,match,NSUBEXP) )
        !          2303: -                              puts( "*** NO MATCH ***" );
        !          2304: -                      else
        !          2305: -                              for( i = 0; i < NSUBEXP; ++i )
        !          2306: -                                      if ( match[i].sp )
        !          2307: -                                              printf( "match[%d] = \"%.*s\"\n", i, match[i].ep - match[i].sp, match[i].sp );
        !          2308: -              }
        !          2309: -      }
        !          2310: -}
        !          2311: -
        !          2312: -regerror( s )
        !          2313: -      char *s;
        !          2314: -{
        !          2315: -      puts( s );
        !          2316: -      longjmp( jmpbuf );
        !          2317: -}
        !          2318: -
        !          2319: -#endif
        !          2320: //GO.SYSIN DD ./libc/new.mk
        !          2321: echo ./fio/README 1>&2
        !          2322: sed 's/.//' >./fio/README <<'//GO.SYSIN DD ./fio/README'
        !          2323: -here (as in ../libc) you have to add whatever commands
        !          2324: -you need to set up an archive in the shell file `gen'.
        !          2325: //GO.SYSIN DD ./fio/README
        !          2326: echo ./fio/fio.h 1>&2
        !          2327: sed 's/.//' >./fio/fio.h <<'//GO.SYSIN DD ./fio/fio.h'
        !          2328: -#define       FIOBSIZE        4096
        !          2329: -
        !          2330: -typedef struct Fbuffer
        !          2331: -{
        !          2332: -      unsigned char *next;            /* next char to be used */
        !          2333: -      unsigned char *end;             /* first invalid char */
        !          2334: -      unsigned char *lnext;           /* previous value of next */
        !          2335: -      unsigned short flags;           /* see FIO_.* below */
        !          2336: -      short oflush;                   /* if >= 0 fd to flush on read */
        !          2337: -      long offset;                    /* seek of end */
        !          2338: -      unsigned char buf[FIOBSIZE];
        !          2339: -} Fbuffer;
        !          2340: -extern Fbuffer *Ffb[];
        !          2341: -
        !          2342: -#define       FIORESET(f)     ((f)->next=(f)->lnext=(f)->end=(f)->buf, (f)->flags&= ~FIO_MALLOCED, (f)->oflush= -1)
        !          2343: -#define       FIOSET(f, fd)   if((f=Ffb[fd&=0x7f]) == 0){Finit(fd,(char *)0);f=Ffb[fd];}
        !          2344: -/* FIOLINELEN is length of last input */
        !          2345: -#define       FIOLINELEN(fd)  (((int)(Ffb[fd]->next - Ffb[fd]->lnext))-1)
        !          2346: -/* FIOSEEK is lseek of next char to be processed */
        !          2347: -#define       FIOSEEK(fd)     (Ffb[fd]->offset - (Ffb[fd]->end - Ffb[fd]->next))
        !          2348: -#define       FIOFLUSH(fd)    if((fd >= 0) && Ffb[fd]) Fflush(fd)
        !          2349: -
        !          2350: -#define       FIO_RDLAST      0x0001          /* true if last input was rdline */
        !          2351: -#define       FIO_WRITING     0x0002          /* true if last action was write */
        !          2352: -#define       FIO_MALLOCED    0x0004          /* set if Finit did the malloc */
        !          2353: -
        !          2354: -extern void Finit();
        !          2355: -extern char *Frdline();
        !          2356: -extern void Fundo();
        !          2357: -extern int Fgetc();
        !          2358: -extern long Fread();
        !          2359: -extern long Fwrite();
        !          2360: -extern long Fseek();
        !          2361: -extern int Fflush();
        !          2362: -
        !          2363: -#ifdef        FIO_IMP
        !          2364: -/* COUNT is the type of counts to things like read, write, memcpy etc */
        !          2365: -#ifdef        GNOT
        !          2366: -#define       COUNT   long
        !          2367: -#define       FIOMALLOC(n)    malloc(n)
        !          2368: -#define       SEEK(a,b,c)     seek(a,b,c)
        !          2369: -#else
        !          2370: -#define       COUNT   int
        !          2371: -#define       FIOMALLOC(n)    malloc(n)
        !          2372: -#define       SEEK(a,b,c)     lseek(a,b,c)
        !          2373: -#endif
        !          2374: -extern COUNT read(), write();
        !          2375: -#endif
        !          2376: //GO.SYSIN DD ./fio/fio.h
        !          2377: echo ./fio/fiofillbuf.c 1>&2
        !          2378: sed 's/.//' >./fio/fiofillbuf.c <<'//GO.SYSIN DD ./fio/fiofillbuf.c'
        !          2379: -#define       FIO_IMP
        !          2380: -#include      "fio.h"
        !          2381: -#include      <libc.h>
        !          2382: -
        !          2383: -Ffillbuf(fd)
        !          2384: -{
        !          2385: -      register COUNT n;
        !          2386: -      register Fbuffer *f = Ffb[fd];
        !          2387: -
        !          2388: -      if(n = &f->buf[FIOBSIZE]-f->end){
        !          2389: -              FIOFLUSH(f->oflush);
        !          2390: -              n = read(fd, f->end, n);
        !          2391: -              if(n <= 0)
        !          2392: -                      return(-1);
        !          2393: -              f->end += n;
        !          2394: -              f->offset += n;
        !          2395: -      }
        !          2396: -      return(1);
        !          2397: -}
        !          2398: //GO.SYSIN DD ./fio/fiofillbuf.c
        !          2399: echo ./fio/fioflush.c 1>&2
        !          2400: sed 's/.//' >./fio/fioflush.c <<'//GO.SYSIN DD ./fio/fioflush.c'
        !          2401: -#define       FIO_IMP
        !          2402: -#include      "fio.h"
        !          2403: -#include      <libc.h>
        !          2404: -
        !          2405: -Fflush(fd)
        !          2406: -{
        !          2407: -      register Fbuffer *f;
        !          2408: -
        !          2409: -      FIOSET(f, fd);
        !          2410: -      if(f->flags&FIO_WRITING)
        !          2411: -              return(F_flush(f, fd));
        !          2412: -      else
        !          2413: -              return(0);
        !          2414: -}
        !          2415: -
        !          2416: -F_flush(f, fd)
        !          2417: -      register Fbuffer *f;
        !          2418: -{
        !          2419: -      register COUNT n;
        !          2420: -
        !          2421: -      f->flags &= ~FIO_WRITING;
        !          2422: -      if(n = f->next - f->buf){
        !          2423: -              if(write(fd, f->buf, n) != n)
        !          2424: -                      return(-1);
        !          2425: -              f->next = f->buf;
        !          2426: -      }
        !          2427: -      return(0);
        !          2428: -}
        !          2429: //GO.SYSIN DD ./fio/fioflush.c
        !          2430: echo ./fio/fiogetc.c 1>&2
        !          2431: sed 's/.//' >./fio/fiogetc.c <<'//GO.SYSIN DD ./fio/fiogetc.c'
        !          2432: -#define       FIO_IMP
        !          2433: -#include      "fio.h"
        !          2434: -#include      <libc.h>
        !          2435: -
        !          2436: -Fgetc(fd)
        !          2437: -{
        !          2438: -      register Fbuffer *f;
        !          2439: -
        !          2440: -      FIOSET(f, fd);
        !          2441: -      if(f->next >= f->end){
        !          2442: -              if(f->end >= &f->buf[FIOBSIZE])
        !          2443: -                      f->end = f->next = f->buf;
        !          2444: -              else
        !          2445: -                      f->next = f->end;
        !          2446: -              if(Ffillbuf(fd) <= 0)
        !          2447: -                      return(-1);
        !          2448: -      }
        !          2449: -      f->lnext = f->next;
        !          2450: -      f->flags &= ~(FIO_RDLAST|FIO_WRITING);
        !          2451: -      return(*f->next++);
        !          2452: -}
        !          2453: //GO.SYSIN DD ./fio/fiogetc.c
        !          2454: echo ./fio/fioinit.c 1>&2
        !          2455: sed 's/.//' >./fio/fioinit.c <<'//GO.SYSIN DD ./fio/fioinit.c'
        !          2456: -#define       FIO_IMP
        !          2457: -#include      "fio.h"
        !          2458: -#include      <libc.h>
        !          2459: -
        !          2460: -static Fdie()
        !          2461: -{
        !          2462: -      Fexit(0);
        !          2463: -}
        !          2464: -
        !          2465: -void
        !          2466: -Finit(fd, buf)
        !          2467: -      char *buf;
        !          2468: -{
        !          2469: -      register Fbuffer *f;
        !          2470: -      static setfioexit = 1;
        !          2471: -
        !          2472: -      if(setfioexit){
        !          2473: -              setfioexit = 0;
        !          2474: -              atexit(Fdie);
        !          2475: -      }
        !          2476: -      fd &= 0x7f;
        !          2477: -      if(buf){
        !          2478: -              Ffb[fd] = (Fbuffer *)buf;
        !          2479: -              Ffb[fd]->flags = 0;
        !          2480: -      } else if(!Ffb[fd]){
        !          2481: -              Ffb[fd] = (Fbuffer *)FIOMALLOC((COUNT)sizeof(Fbuffer));
        !          2482: -              Ffb[fd]->flags = FIO_MALLOCED;
        !          2483: -      }
        !          2484: -      f = Ffb[fd];
        !          2485: -      FIORESET(f);
        !          2486: -      f->offset = SEEK(fd, 0L, 1);
        !          2487: -      if(f->offset < 0)
        !          2488: -              f->offset = 0;          /* file not been written yet */
        !          2489: -}
        !          2490: -
        !          2491: -#ifdef        GNOT
        !          2492: -#define       NOFILE  128
        !          2493: -#endif
        !          2494: -#ifndef       GNOT
        !          2495: -#include      <sys/param.h>
        !          2496: -#endif
        !          2497: -
        !          2498: -Fbuffer *Ffb[NOFILE];
        !          2499: -
        !          2500: -Fexit(type)
        !          2501: -{
        !          2502: -      register n;
        !          2503: -
        !          2504: -      for(n = 0; n < NOFILE; n++)
        !          2505: -              if(Ffb[n])
        !          2506: -                      if(type == 0)
        !          2507: -                              Fflush(n);
        !          2508: -                      else
        !          2509: -                              Fclose(n);
        !          2510: -}
        !          2511: //GO.SYSIN DD ./fio/fioinit.c
        !          2512: echo ./fio/fioprint.c 1>&2
        !          2513: sed 's/.//' >./fio/fioprint.c <<'//GO.SYSIN DD ./fio/fioprint.c'
        !          2514: -#define       FIO_IMP
        !          2515: -#include      <varargs.h>
        !          2516: -#include      <fio.h>
        !          2517: -
        !          2518: -/* VARARGS 2 */
        !          2519: -Fprint(f, fmt, va_alist)
        !          2520: -int f;
        !          2521: -char *fmt;
        !          2522: -va_dcl
        !          2523: -{
        !          2524: -      char buf[FIOBSIZE], *out;
        !          2525: -      register long n;
        !          2526: -      va_list ap;
        !          2527: -      extern char *doprint();
        !          2528: -
        !          2529: -      va_start(ap);
        !          2530: -      out = doprint(buf, fmt, &ap);
        !          2531: -      va_end(ap);
        !          2532: -      n = out-buf;
        !          2533: -      if(Fwrite(f, buf, n) != n)
        !          2534: -              return(-1);
        !          2535: -      else
        !          2536: -              return((int)n);
        !          2537: -}
        !          2538: //GO.SYSIN DD ./fio/fioprint.c
        !          2539: echo ./fio/fioputc.c 1>&2
        !          2540: sed 's/.//' >./fio/fioputc.c <<'//GO.SYSIN DD ./fio/fioputc.c'
        !          2541: -#define       FIO_IMP
        !          2542: -#include      "fio.h"
        !          2543: -#include      <libc.h>
        !          2544: -
        !          2545: -Fputc(fd, c)
        !          2546: -{
        !          2547: -      register Fbuffer *f;
        !          2548: -
        !          2549: -      FIOSET(f, fd);
        !          2550: -      if(f->next >= &f->buf[FIOBSIZE]){
        !          2551: -              if(F_flush(f, fd))
        !          2552: -                      return(-1);
        !          2553: -      }
        !          2554: -      *f->next++ = c;
        !          2555: -      f->end = f->next;
        !          2556: -      f->offset++;
        !          2557: -      f->flags |= FIO_WRITING;
        !          2558: -      return(0);
        !          2559: -}
        !          2560: //GO.SYSIN DD ./fio/fioputc.c
        !          2561: echo ./fio/fiordline.c 1>&2
        !          2562: sed 's/.//' >./fio/fiordline.c <<'//GO.SYSIN DD ./fio/fiordline.c'
        !          2563: -#define       FIO_IMP
        !          2564: -#include      "fio.h"
        !          2565: -#include      <libc.h>
        !          2566: -
        !          2567: -char *
        !          2568: -Frdline(fd)
        !          2569: -{
        !          2570: -      register unsigned char *p;
        !          2571: -      register Fbuffer *f;
        !          2572: -      register n;
        !          2573: -      register char *nextnl;
        !          2574: -
        !          2575: -      FIOSET(f, fd);
        !          2576: -      while((nextnl = memchr(f->next, '\n', (COUNT)(f->end-f->next))) == 0){
        !          2577: -              if(f->next == f->buf){
        !          2578: -                      if(f->end >= &f->buf[FIOBSIZE])
        !          2579: -                              f->end = &f->buf[FIOBSIZE-64];  /* full buffer, no newline */
        !          2580: -              } else {
        !          2581: -                      n = f->next-f->buf;
        !          2582: -                      memcpy(f->buf, f->next, (COUNT)(FIOBSIZE-n));
        !          2583: -                      f->next -= n;
        !          2584: -                      f->end -= n;
        !          2585: -              }
        !          2586: -              if(Ffillbuf(fd) <= 0)
        !          2587: -                      return((char *)0);
        !          2588: -      }
        !          2589: -      f->lnext = f->next;
        !          2590: -      f->next = (unsigned char *)(nextnl+1);
        !          2591: -      *nextnl = 0;
        !          2592: -      f->flags = (f->flags|FIO_RDLAST)&~FIO_WRITING;
        !          2593: -      return((char *)f->lnext);
        !          2594: -}
        !          2595: //GO.SYSIN DD ./fio/fiordline.c
        !          2596: echo ./fio/fioread.c 1>&2
        !          2597: sed 's/.//' >./fio/fioread.c <<'//GO.SYSIN DD ./fio/fioread.c'
        !          2598: -#define       FIO_IMP
        !          2599: -#include      "fio.h"
        !          2600: -#include      <libc.h>
        !          2601: -
        !          2602: -#define               MAXREAD         0xff00          /* 64K - 4K */
        !          2603: -#define               FIOSHORT        100
        !          2604: -
        !          2605: -long
        !          2606: -Fread(fd, addr, n)
        !          2607: -      char *addr;
        !          2608: -      long n;
        !          2609: -{
        !          2610: -      register unsigned char *p;
        !          2611: -      register Fbuffer *f;
        !          2612: -      COUNT k;
        !          2613: -      char *oaddr = addr;
        !          2614: -      char *goal = addr+n;
        !          2615: -
        !          2616: -      FIOSET(f, fd);
        !          2617: -again:
        !          2618: -      k = f->end - f->next;
        !          2619: -      if(n < k) k = n;
        !          2620: -      memcpy(addr, (char *)f->next, k);
        !          2621: -      f->next += k;
        !          2622: -      f->lnext = f->next;     /* effectively disable undo */
        !          2623: -      n -= k;
        !          2624: -      addr += k;
        !          2625: -      if((n > 0) && (n < FIOSHORT)){  /* buffer reads of less than FIOSHORT */
        !          2626: -              if(f->next == f->end)
        !          2627: -                      f->next = f->end = f->buf;
        !          2628: -              if(Ffillbuf(fd) < 0)
        !          2629: -                      return((long)(addr - oaddr));
        !          2630: -              goto again;
        !          2631: -      }
        !          2632: -      if(n > 0)
        !          2633: -              FIOFLUSH(f->oflush);
        !          2634: -      while(n > 0){   /* buffer is empty so do real reads */
        !          2635: -              k = n;
        !          2636: -              if(k > MAXREAD) k = MAXREAD;
        !          2637: -              if((k = read(fd, addr, k)) < 0)
        !          2638: -                      return(-1L);
        !          2639: -              if(k == 0) break;
        !          2640: -              addr += k;
        !          2641: -              n -= k;
        !          2642: -              f->offset += k;
        !          2643: -      }
        !          2644: -      return((long)(addr - oaddr));
        !          2645: -}
        !          2646: //GO.SYSIN DD ./fio/fioread.c
        !          2647: echo ./fio/fioseek.c 1>&2
        !          2648: sed 's/.//' >./fio/fioseek.c <<'//GO.SYSIN DD ./fio/fioseek.c'
        !          2649: -#define       FIO_IMP
        !          2650: -#include      "fio.h"
        !          2651: -#include      <libc.h>
        !          2652: -
        !          2653: -long
        !          2654: -Fseek(fd, n, cmd)
        !          2655: -      long n;
        !          2656: -{
        !          2657: -      register Fbuffer *f;
        !          2658: -      register long dest, k;
        !          2659: -
        !          2660: -      FIOSET(f, fd);
        !          2661: -      switch(cmd)
        !          2662: -      {
        !          2663: -      case 0:
        !          2664: -              dest = n;
        !          2665: -              break;
        !          2666: -      case 1:
        !          2667: -              /* allow for the fact we are beyond where we think we are */
        !          2668: -              dest = f->offset + n + f->next-f->end;
        !          2669: -              break;
        !          2670: -      case 2:
        !          2671: -              if(f->flags&FIO_WRITING)
        !          2672: -                      F_flush(f, fd);
        !          2673: -              dest = SEEK(fd, n, cmd);
        !          2674: -              FIORESET(f);
        !          2675: -              f->offset = dest;
        !          2676: -              break;
        !          2677: -      }
        !          2678: -      if(dest < 0)
        !          2679: -              return(dest);
        !          2680: -      k = f->end - ((f->flags&FIO_WRITING)? f->buf : f->lnext);
        !          2681: -      if((dest >= f->offset) || (dest < f->offset-k)){
        !          2682: -              if(f->flags&FIO_WRITING)
        !          2683: -                      F_flush(f, fd);
        !          2684: -              FIORESET(f);
        !          2685: -              f->offset = dest;
        !          2686: -              SEEK(fd, f->offset, 0);
        !          2687: -      } else {
        !          2688: -              f->next = f->lnext + (dest-(f->offset-k));
        !          2689: -              if(f->flags&FIO_WRITING){
        !          2690: -                      f->offset -= f->end - f->next;
        !          2691: -                      f->end = f->next;
        !          2692: -              }
        !          2693: -              SEEK(fd, f->offset, 0);
        !          2694: -      }
        !          2695: -      return(dest);
        !          2696: -}
        !          2697: //GO.SYSIN DD ./fio/fioseek.c
        !          2698: echo ./fio/fioundo.c 1>&2
        !          2699: sed 's/.//' >./fio/fioundo.c <<'//GO.SYSIN DD ./fio/fioundo.c'
        !          2700: -#define       FIO_IMP
        !          2701: -#include      "fio.h"
        !          2702: -#include      <libc.h>
        !          2703: -
        !          2704: -void
        !          2705: -Fundo(fd)
        !          2706: -{
        !          2707: -      register Fbuffer *f;
        !          2708: -
        !          2709: -      FIOSET(f, fd);
        !          2710: -      if(f->flags&FIO_WRITING)
        !          2711: -              return;
        !          2712: -      if(f->flags&FIO_RDLAST)
        !          2713: -              f->next[-1] = '\n';
        !          2714: -      f->next = f->lnext;
        !          2715: -}
        !          2716: //GO.SYSIN DD ./fio/fioundo.c
        !          2717: echo ./fio/fiowrite.c 1>&2
        !          2718: sed 's/.//' >./fio/fiowrite.c <<'//GO.SYSIN DD ./fio/fiowrite.c'
        !          2719: -#define       FIO_IMP
        !          2720: -#include      "fio.h"
        !          2721: -#include      <libc.h>
        !          2722: -
        !          2723: -long
        !          2724: -Fwrite(fd, addr, nbytes)
        !          2725: -      register char *addr;
        !          2726: -      register long nbytes;
        !          2727: -{
        !          2728: -      register Fbuffer *f;
        !          2729: -      register COUNT n;
        !          2730: -      long nnbytes = nbytes;
        !          2731: -
        !          2732: -      FIOSET(f, fd);
        !          2733: -      f->flags |= FIO_WRITING;
        !          2734: -      n = &f->buf[FIOBSIZE] - f->next;
        !          2735: -      if(nbytes < n) n = nbytes;
        !          2736: -      memcpy(f->next, addr, n);
        !          2737: -      f->end = (f->next += n);
        !          2738: -      f->offset += n;
        !          2739: -      nbytes -= n;
        !          2740: -      addr += n;
        !          2741: -      if(nbytes){
        !          2742: -              if(F_flush(f, fd))
        !          2743: -                      return(-1L);
        !          2744: -              while(nbytes >= FIOBSIZE){
        !          2745: -                      if(write(fd, addr, (COUNT)FIOBSIZE) != FIOBSIZE)
        !          2746: -                              return(-1L);
        !          2747: -                      addr += FIOBSIZE;
        !          2748: -                      nbytes -= FIOBSIZE;
        !          2749: -                      f->offset += FIOBSIZE;
        !          2750: -              }
        !          2751: -              memcpy(f->buf, addr, (COUNT)(n = nbytes));
        !          2752: -              f->end = f->next = f->buf+n;
        !          2753: -              f->offset += n;
        !          2754: -              f->flags |= FIO_WRITING;
        !          2755: -      }
        !          2756: -      return(nnbytes);
        !          2757: -}
        !          2758: //GO.SYSIN DD ./fio/fiowrite.c
        !          2759: echo ./fio/libc.h 1>&2
        !          2760: sed 's/.//' >./fio/libc.h <<'//GO.SYSIN DD ./fio/libc.h'
        !          2761: -/* system calls */
        !          2762: -extern unsigned alarm();
        !          2763: -extern void nap(), pause();
        !          2764: -extern char *sbrk();
        !          2765: -extern void exit(), _exit();
        !          2766: -extern long lseek();
        !          2767: -extern void nice();
        !          2768: -extern void profil();
        !          2769: -extern unsigned long settod();
        !          2770: -extern void sync();
        !          2771: -extern long time();
        !          2772: -
        !          2773: -/* libc et al */
        !          2774: -extern long lcm();
        !          2775: -extern double atof(), strtod();
        !          2776: -extern long atol();
        !          2777: -extern char *crypt();
        !          2778: -extern char *ctime();
        !          2779: -extern char *ecvt(), *fcvt(), *gcvt();
        !          2780: -extern char *galloc();
        !          2781: -extern char *getenv();
        !          2782: -extern char *getlogin();
        !          2783: -extern char *getpass();
        !          2784: -extern char *getwd(), *getcwd();
        !          2785: -extern char *malloc(), *realloc(), *calloc();
        !          2786: -extern char *memcpy(), *memchr(), *memccpy(), *memset();
        !          2787: -extern char *mktemp();
        !          2788: -extern double frand();
        !          2789: -extern char *strcpy(), *strncpy(), *strcat(), *strncat(), *strchr(), *strrchr();
        !          2790: -extern char *strpbrk(), *strtok(), *strdup();
        !          2791: -extern int atoi();
        !          2792: -extern char *tgetstr(), tgoto();
        !          2793: -extern char *ttyname(), *cttyname();
        !          2794: -
        !          2795: -#define       NONEXIT         33
        !          2796: //GO.SYSIN DD ./fio/libc.h
        !          2797: echo ./fio/tstrd.c 1>&2
        !          2798: sed 's/.//' >./fio/tstrd.c <<'//GO.SYSIN DD ./fio/tstrd.c'
        !          2799: -#include      <fio.h>
        !          2800: -#include      <libc.h>
        !          2801: -
        !          2802: -main(argc, argv)
        !          2803: -      char **argv;
        !          2804: -{
        !          2805: -      register n, c, k;
        !          2806: -      int len, fd, cd;
        !          2807: -      char *b1, *b2, *p;
        !          2808: -
        !          2809: -      if(argc < 2){
        !          2810: -              Fprint(2, "Usage: tstrd file\n");
        !          2811: -              exit(1);
        !          2812: -      }
        !          2813: -      len = flen(argv[1]);
        !          2814: -      if((fd = open(argv[1], 0)) < 0){
        !          2815: -              perror(argv[1]);        
        !          2816: -              exit(1);
        !          2817: -      }
        !          2818: -      if((b1 = malloc(len)) == 0){
        !          2819: -              Fprint(2, "malloc(%d) failed\n", len);
        !          2820: -              exit(1);
        !          2821: -      }
        !          2822: -      if(read(fd, b1, len) != len){
        !          2823: -              perror("read");
        !          2824: -              exit(1);
        !          2825: -      }
        !          2826: -      lseek(fd, 0L, 0);
        !          2827: -      if((b2 = malloc(len)) == 0){
        !          2828: -              Fprint(2, "malloc(%d) failed\n", len);
        !          2829: -              exit(1);
        !          2830: -      }
        !          2831: -      for(p = b2, cd = 0; cd < len;){
        !          2832: -              n = 1000*nrand(6) + nrand(199);
        !          2833: -              if(n > len-cd) n = len-cd;
        !          2834: -              Fprint(1, "%d getchars\n", n);
        !          2835: -              cd += n;
        !          2836: -              while(n--)
        !          2837: -                      *p++ = Fgetc(fd);
        !          2838: -              if(cd == len)
        !          2839: -                      continue;
        !          2840: -              n = 1000*nrand(12) + nrand(199);
        !          2841: -              if(n > len-cd) n = len-cd;
        !          2842: -              cd += n;
        !          2843: -              Fprint(1, "%d read\n", n);
        !          2844: -              if(Fread(fd, p, (long)n) != (long)n) break;
        !          2845: -              p += n;
        !          2846: -      }
        !          2847: -done:
        !          2848: -      if(memcmp(b1, b2, len)){
        !          2849: -              Fprint(2, "memcmp failed!\n");
        !          2850: -              exit(1);
        !          2851: -      }
        !          2852: -      Fprint(2, "tstrd: %d bytes, succeeded\n", len);
        !          2853: -      exit(0);
        !          2854: -}
        !          2855: -
        !          2856: -#include      <sys/types.h>
        !          2857: -#include      <sys/stat.h>
        !          2858: -
        !          2859: -flen(s)
        !          2860: -      char *s;
        !          2861: -{
        !          2862: -      struct stat sb;
        !          2863: -      int n;
        !          2864: -
        !          2865: -      if(stat(s, &sb) < 0){
        !          2866: -              perror(s);
        !          2867: -              exit(1);
        !          2868: -      }
        !          2869: -      n = sb.st_size;
        !          2870: -      if(sizeof(int) == 2)
        !          2871: -              n &= 0x7FFF;
        !          2872: -      return(n);
        !          2873: -}
        !          2874: //GO.SYSIN DD ./fio/tstrd.c
        !          2875: echo ./fio/tstsk.c 1>&2
        !          2876: sed 's/.//' >./fio/tstsk.c <<'//GO.SYSIN DD ./fio/tstsk.c'
        !          2877: -#include      <fio.h>
        !          2878: -#include      <libc.h>
        !          2879: -
        !          2880: -#define       TMP     "/tmp/tstsk"
        !          2881: -#define       FN(x)   (unsigned char)((x&0xFF)^(x/251))
        !          2882: -
        !          2883: -main(argc, argv)
        !          2884: -      char **argv;
        !          2885: -{
        !          2886: -      register n, c, k;
        !          2887: -      int len, fd, cd;
        !          2888: -      char *b1, *b2, *p;
        !          2889: -
        !          2890: -      if(argc != 1){
        !          2891: -              Fprint(2, "Usage: tstsk\n");
        !          2892: -              exit(1);
        !          2893: -      }
        !          2894: -      len = 1000000;
        !          2895: -      if(sizeof(int) == 2)
        !          2896: -              len &= 0x7FFF;
        !          2897: -      if((fd = creat(TMP, 0666)) < 0){
        !          2898: -              perror(TMP);    
        !          2899: -              exit(1);
        !          2900: -      }
        !          2901: -      close(fd);
        !          2902: -      if((fd = open(TMP, 2)) < 0){
        !          2903: -              perror(TMP);    
        !          2904: -              exit(1);
        !          2905: -      }
        !          2906: -      unlink(TMP);
        !          2907: -      if((b2 = malloc(len)) == 0){
        !          2908: -              Fprint(2, "malloc(%d) failed\n", len);
        !          2909: -              exit(1);
        !          2910: -      }
        !          2911: -      for(n = 0, p = b2; n < len; n++)
        !          2912: -              *p++ = FN(n);
        !          2913: -      if(write(fd, b2, len) != len){
        !          2914: -              perror("write");
        !          2915: -              exit(1);
        !          2916: -      }
        !          2917: -      lseek(fd, 0L, 0);
        !          2918: -      Finit(fd, (char *)0);
        !          2919: -      for(n = 0; n < 500; n++){
        !          2920: -              k = nrand(len);
        !          2921: -              c = nrand(sizeof(Fbuffer))+100;
        !          2922: -              if(k+c > len) c = len-k;
        !          2923: -              test(fd, k, c, n);
        !          2924: -      }
        !          2925: -done:
        !          2926: -      Fprint(2, "tstsk: %d bytes, %d seeks, succeeded\n", len, n);
        !          2927: -      exit(0);
        !          2928: -}
        !          2929: -
        !          2930: -test(fd, off, n, count)
        !          2931: -{
        !          2932: -      long offset;
        !          2933: -      int c;
        !          2934: -
        !          2935: -      offset = off;
        !          2936: -      if(Fseek(fd, offset, 0) != offset){
        !          2937: -              fprint(2, "fseek(%ld) != %ld!!\n", offset, offset);
        !          2938: -              exit(1);
        !          2939: -      }
        !          2940: -      while(n-- > 0){
        !          2941: -              if((c = Fgetc(fd)) != FN(offset)){
        !          2942: -                      fprint(2, "tst %d: char mismatch; %ld: %x, expected %x\n",
        !          2943: -                              count, offset, c, FN(offset));
        !          2944: -                      dumpfb(fd);
        !          2945: -                      exit(1);
        !          2946: -              }
        !          2947: -              offset++;
        !          2948: -      }
        !          2949: -}
        !          2950: -
        !          2951: -dumpfb(fd)
        !          2952: -{
        !          2953: -      register Fbuffer *f = Ffb[fd];
        !          2954: -      register unsigned char *c;
        !          2955: -      register long off;
        !          2956: -      int i;
        !          2957: -
        !          2958: -      fprint(2, "buf@%ld: next=%ld end=%ld lnext=%ld buf=%ld offset=%ld\n",
        !          2959: -              f, f->next, f->end, f->lnext, f->buf, f->offset);
        !          2960: -      off = f->offset - (f->end - f->buf);
        !          2961: -      for(c = f->buf; c < &f->buf[64]; ){
        !          2962: -              fprint(2, "%7ld:", off);
        !          2963: -              for(i = 0; i < 16; i++, off++)
        !          2964: -                      fprint(2, " %2x", *c++);
        !          2965: -              fprint(2, "\n");
        !          2966: -      }
        !          2967: -}
        !          2968: //GO.SYSIN DD ./fio/tstsk.c
        !          2969: echo ./fio/tstwr.c 1>&2
        !          2970: sed 's/.//' >./fio/tstwr.c <<'//GO.SYSIN DD ./fio/tstwr.c'
        !          2971: -#include      <fio.h>
        !          2972: -#include      <libc.h>
        !          2973: -
        !          2974: -#define       TMP     "/tmp/tstwr"
        !          2975: -
        !          2976: -main(argc, argv)
        !          2977: -      char **argv;
        !          2978: -{
        !          2979: -      register n, c, k;
        !          2980: -      int len, fd, cd;
        !          2981: -      char *b1, *b2, *p;
        !          2982: -
        !          2983: -      if(argc < 2){
        !          2984: -              Fprint(2, "Usage: tstwr file\n");
        !          2985: -              exit(1);
        !          2986: -      }
        !          2987: -      len = flen(argv[1]);
        !          2988: -      if((fd = open(argv[1], 0)) < 0){
        !          2989: -              perror(argv[1]);        
        !          2990: -              exit(1);
        !          2991: -      }
        !          2992: -      if((b1 = malloc(len)) == 0){
        !          2993: -              Fprint(2, "malloc(%d) failed\n", len);
        !          2994: -              exit(1);
        !          2995: -      }
        !          2996: -      if(read(fd, b1, len) != len){
        !          2997: -              perror("read");
        !          2998: -              exit(1);
        !          2999: -      }
        !          3000: -      close(fd);
        !          3001: -      if((fd = creat(TMP, 0666)) < 0){
        !          3002: -              perror(TMP);    
        !          3003: -              exit(1);
        !          3004: -      }
        !          3005: -      close(fd);
        !          3006: -      if((fd = open(TMP, 2)) < 0){
        !          3007: -              perror(TMP);    
        !          3008: -              exit(1);
        !          3009: -      }
        !          3010: -/*    unlink(TMP);    /**/
        !          3011: -      if((b2 = malloc(len)) == 0){
        !          3012: -              Fprint(2, "malloc(%d) failed\n", len);
        !          3013: -              exit(1);
        !          3014: -      }
        !          3015: -      for(p = b1, cd = 0; cd < len;){
        !          3016: -              n = 1000*nrand(6) + nrand(199);
        !          3017: -              if(n > len-cd) n = len-cd;
        !          3018: -              Fprint(1, "%d putc's\n", n);
        !          3019: -              cd += n;
        !          3020: -              while(n--)
        !          3021: -                      Fputc(fd, *p++);
        !          3022: -              if(len == cd)
        !          3023: -                      continue;
        !          3024: -              n = 1000*nrand(12) + nrand(199);
        !          3025: -              if(n > len-cd) n = len-cd;
        !          3026: -              cd += n;
        !          3027: -              Fprint(1, "%d write\n", n);
        !          3028: -              if(Fwrite(fd, p, (long)n) != (long)n) break;
        !          3029: -              p += n;
        !          3030: -      }
        !          3031: -done:
        !          3032: -      Fflush(fd);
        !          3033: -      lseek(fd, 0L, 0);
        !          3034: -      if((n = read(fd, b2, len)) != len){
        !          3035: -              fprint(2, "read %d, len=%d: ", n, len);
        !          3036: -              perror("read2");
        !          3037: -              exit(1);
        !          3038: -      }
        !          3039: -      if(memcmp(b1, b2, len)){
        !          3040: -              Fprint(2, "memcmp failed!\n");
        !          3041: -              exit(1);
        !          3042: -      }
        !          3043: -      Fprint(2, "tstwr: %d bytes, succeeded\n", len);
        !          3044: -      exit(0);
        !          3045: -}
        !          3046: -
        !          3047: -#include      <sys/types.h>
        !          3048: -#include      <sys/stat.h>
        !          3049: -
        !          3050: -flen(s)
        !          3051: -      char *s;
        !          3052: -{
        !          3053: -      struct stat sb;
        !          3054: -      int n;
        !          3055: -
        !          3056: -      if(stat(s, &sb) < 0){
        !          3057: -              perror(s);
        !          3058: -              exit(1);
        !          3059: -      }
        !          3060: -      n = sb.st_size;
        !          3061: -      if(sizeof(int) == 2)
        !          3062: -              n &= 0x7FFF;
        !          3063: -      return(n);
        !          3064: -}
        !          3065: //GO.SYSIN DD ./fio/tstwr.c
        !          3066: echo ./fio/Makefile 1>&2
        !          3067: sed 's/.//' >./fio/Makefile <<'//GO.SYSIN DD ./fio/Makefile'
        !          3068: -OBJ=fiofillbuf.o fioflush.o fiogetc.o fioinit.o fioprint.o fioputc.o\
        !          3069: -      fiordline.o fioread.o fioseek.o fioundo.o fiowrite.o fiotie.o fioclose.o
        !          3070: -
        !          3071: -fio.a:        $(OBJ)
        !          3072: -      ar r fio.a $(OBJ)
        !          3073: -      $(RANLIB) fio.a
        !          3074: -
        !          3075: -cray: fio.o
        !          3076: -
        !          3077: -fio.o:        $(OBJ)
        !          3078: -      cat $(OBJ) > fio.o
        !          3079: //GO.SYSIN DD ./fio/Makefile
        !          3080: echo ./fio/fiotie.c 1>&2
        !          3081: sed 's/.//' >./fio/fiotie.c <<'//GO.SYSIN DD ./fio/fiotie.c'
        !          3082: -#define       FIO_IMP
        !          3083: -#include      "fio.h"
        !          3084: -
        !          3085: -void
        !          3086: -Ftie(ifd, ofd)
        !          3087: -{
        !          3088: -      register Fbuffer *f;
        !          3089: -
        !          3090: -      FIOSET(f, ifd);
        !          3091: -      f->oflush = ofd;
        !          3092: -}
        !          3093: //GO.SYSIN DD ./fio/fiotie.c
        !          3094: echo ./fio/tstagh.c 1>&2
        !          3095: sed 's/.//' >./fio/tstagh.c <<'//GO.SYSIN DD ./fio/tstagh.c'
        !          3096: -#include      <fio.h>
        !          3097: -#include      <libc.h>
        !          3098: -
        !          3099: -#define       TMP     "/tmp/tstsk"
        !          3100: -#define       FN(x)   (unsigned char)((x&0xFF)^(x/251))
        !          3101: -
        !          3102: -main(argc, argv)
        !          3103: -      char **argv;
        !          3104: -{
        !          3105: -      register n, c, k;
        !          3106: -      int len, fd, cd;
        !          3107: -      char *b1, *b2, *p;
        !          3108: -
        !          3109: -      Fprint(1, "the letter 'c' is 'c'\n");
        !          3110: -      dumpfb(1);
        !          3111: -      Fseek(1, -3, 1);
        !          3112: -      dumpfb(1);
        !          3113: -      Fputc(1, '\n');
        !          3114: -      dumpfb(1);
        !          3115: -      exit(0);
        !          3116: -}
        !          3117: -
        !          3118: -dumpfb(fd)
        !          3119: -{
        !          3120: -      register Fbuffer *f = Ffb[fd];
        !          3121: -      register unsigned char *c;
        !          3122: -      register long off;
        !          3123: -      int i;
        !          3124: -
        !          3125: -      fprint(2, "buf@%ld: next=%ld end=%ld lnext=%ld buf=%ld offset=%ld\n",
        !          3126: -              f, f->next, f->end, f->lnext, f->buf, f->offset);
        !          3127: -      off = f->offset - (f->end - f->buf);
        !          3128: -      for(c = f->buf; c < &f->buf[64]; ){
        !          3129: -              fprint(2, "%7ld:", off);
        !          3130: -              for(i = 0; i < 16; i++, off++)
        !          3131: -                      fprint(2, " %2x", *c++);
        !          3132: -              fprint(2, "\n");
        !          3133: -      }
        !          3134: -}
        !          3135: //GO.SYSIN DD ./fio/tstagh.c
        !          3136: echo ./fio/fioclose.c 1>&2
        !          3137: sed 's/.//' >./fio/fioclose.c <<'//GO.SYSIN DD ./fio/fioclose.c'
        !          3138: -#define       FIO_IMP
        !          3139: -#include      "fio.h"
        !          3140: -#include      <libc.h>
        !          3141: -
        !          3142: -void
        !          3143: -Fclose(fd)
        !          3144: -{
        !          3145: -      register Fbuffer *f;
        !          3146: -
        !          3147: -      FIOSET(f, fd);
        !          3148: -      Fflush(fd);
        !          3149: -      if(f->flags&FIO_MALLOCED)
        !          3150: -              free((char *)f);
        !          3151: -      Ffb[fd] = 0;
        !          3152: -      close(fd);
        !          3153: -}
        !          3154: //GO.SYSIN DD ./fio/fioclose.c
        !          3155: echo ./README 1>&2
        !          3156: sed 's/.//' >./README <<'//GO.SYSIN DD ./README'
        !          3157: -mk runs on Unix V9. To run on other systems requires some help.
        !          3158: -the help takes the form of the fast i/o library (fio) and some
        !          3159: -libc routines. dir.o provides support for the directory routines
        !          3160: -on V7-style filesystems; on most modern systems you should probably
        !          3161: -not use dir.o.
        !          3162: -
        !          3163: -      - edit Makefile by setting the initial variables as
        !          3164: -per the instructions.
        !          3165: -
        !          3166: -      - type make (unless on the cray, in which case, type make cray).
        !          3167: -
        !          3168: -      - everything should now be compiled and you should have a mk.
        !          3169: -
        !          3170: -      - edit mkfile to set the system type as in the Makefile
        !          3171: -
        !          3172: -as a first order test that all is well, try
        !          3173: -      mk
        !          3174: -which generates a `correctly compiled' mk in the file nmk.
        !          3175: -
        !          3176: -If things go badly, (core dump hell), try not using alloc.c. it may be
        !          3177: -that your hardware needs special alloc treatment. otherwise, mail
        !          3178: -research!andrew (or [email protected]).
        !          3179: -
        !          3180: -the manual page and a tutorial style document are included.
        !          3181: //GO.SYSIN DD ./README
        !          3182: echo ./fio.h 1>&2
        !          3183: sed 's/.//' >./fio.h <<'//GO.SYSIN DD ./fio.h'
        !          3184: -#define       FIOBSIZE        4096
        !          3185: -
        !          3186: -typedef struct Fbuffer
        !          3187: -{
        !          3188: -      unsigned char *next;            /* next char to be used */
        !          3189: -      unsigned char *end;             /* first invalid char */
        !          3190: -      unsigned char *lnext;           /* previous value of next */
        !          3191: -      unsigned short flags;           /* see FIO_.* below */
        !          3192: -      short oflush;                   /* if >= 0 fd to flush on read */
        !          3193: -      long offset;                    /* seek of end */
        !          3194: -      unsigned char buf[FIOBSIZE];
        !          3195: -} Fbuffer;
        !          3196: -extern Fbuffer *Ffb[];
        !          3197: -
        !          3198: -#define       FIORESET(f)     ((f)->next=(f)->lnext=(f)->end=(f)->buf, (f)->flags&= ~FIO_MALLOCED, (f)->oflush= -1)
        !          3199: -#define       FIOSET(f, fd)   if((f=Ffb[fd&=0x7f]) == 0){Finit(fd,(char *)0);f=Ffb[fd];}
        !          3200: -/* FIOLINELEN is length of last input */
        !          3201: -#define       FIOLINELEN(fd)  (((int)(Ffb[fd]->next - Ffb[fd]->lnext))-1)
        !          3202: -/* FIOSEEK is lseek of next char to be processed */
        !          3203: -#define       FIOSEEK(fd)     (Ffb[fd]->offset - (Ffb[fd]->end - Ffb[fd]->next))
        !          3204: -#define       FIOFLUSH(fd)    if((fd >= 0) && Ffb[fd]) Fflush(fd)
        !          3205: -
        !          3206: -#define       FIO_RDLAST      0x0001          /* true if last input was rdline */
        !          3207: -#define       FIO_WRITING     0x0002          /* true if last action was write */
        !          3208: -#define       FIO_MALLOCED    0x0004          /* set if Finit did the malloc */
        !          3209: -
        !          3210: -extern void Finit();
        !          3211: -extern char *Frdline();
        !          3212: -extern void Fundo();
        !          3213: -extern int Fgetc();
        !          3214: -extern long Fread();
        !          3215: -extern long Fwrite();
        !          3216: -extern long Fseek();
        !          3217: -extern int Fflush();
        !          3218: -
        !          3219: -#ifdef        FIO_IMP
        !          3220: -/* COUNT is the type of counts to things like read, write, memcpy etc */
        !          3221: -#ifdef        GNOT
        !          3222: -#define       COUNT   long
        !          3223: -#define       FIOMALLOC(n)    malloc(n)
        !          3224: -#define       SEEK(a,b,c)     seek(a,b,c)
        !          3225: -#else
        !          3226: -#define       COUNT   int
        !          3227: -#define       FIOMALLOC(n)    malloc(n)
        !          3228: -#define       SEEK(a,b,c)     lseek(a,b,c)
        !          3229: -#endif
        !          3230: -extern COUNT read(), write();
        !          3231: -#endif
        !          3232: //GO.SYSIN DD ./fio.h
        !          3233: echo ./regexp.h 1>&2
        !          3234: sed 's/.//' >./regexp.h <<'//GO.SYSIN DD ./regexp.h'
        !          3235: -/* the structure describing a sub-expression match */
        !          3236: -typedef struct {
        !          3237: -      char *sp;
        !          3238: -      char *ep;
        !          3239: -} regsubexp;
        !          3240: -
        !          3241: -/* a compiled regular expression */
        !          3242: -typedef char *regexp;
        !          3243: -
        !          3244: -/* the routines */
        !          3245: -extern regexp *regcomp();
        !          3246: -extern int regexec();
        !          3247: -extern void regsub();
        !          3248: //GO.SYSIN DD ./regexp.h
        !          3249: echo ./libc.h 1>&2
        !          3250: sed 's/.//' >./libc.h <<'//GO.SYSIN DD ./libc.h'
        !          3251: -/* system calls */
        !          3252: -extern unsigned alarm();
        !          3253: -extern void nap(), pause();
        !          3254: -extern char *sbrk();
        !          3255: -extern void exit(), _exit();
        !          3256: -extern long lseek();
        !          3257: -extern void nice();
        !          3258: -extern void profil();
        !          3259: -extern unsigned long settod();
        !          3260: -extern void sync();
        !          3261: -extern long time();
        !          3262: -
        !          3263: -/* libc et al */
        !          3264: -extern long lcm();
        !          3265: -extern double atof(), strtod();
        !          3266: -extern long atol();
        !          3267: -extern char *crypt();
        !          3268: -extern char *ctime();
        !          3269: -extern char *ecvt(), *fcvt(), *gcvt();
        !          3270: -extern char *galloc();
        !          3271: -extern char *getenv();
        !          3272: -extern char *getlogin();
        !          3273: -extern char *getpass();
        !          3274: -extern char *getwd(), *getcwd();
        !          3275: -extern char *malloc(), *realloc(), *calloc();
        !          3276: -extern char *memcpy(), *memchr(), *memccpy(), *memset();
        !          3277: -extern char *mktemp();
        !          3278: -extern double frand();
        !          3279: -extern char *setfields();
        !          3280: -extern char *strcpy(), *strncpy(), *strcat(), *strncat(), *strchr(), *strrchr();
        !          3281: -extern char *strpbrk(), *strtok(), *strdup();
        !          3282: -extern int atoi();
        !          3283: -extern char *tgetstr(), tgoto();
        !          3284: -extern char *ttyname(), *cttyname();
        !          3285: -
        !          3286: -#define       NONEXIT         33
        !          3287: //GO.SYSIN DD ./libc.h
        !          3288: echo ./math/pow10.c 1>&2
        !          3289: sed 's/.//' >./math/pow10.c <<'//GO.SYSIN DD ./math/pow10.c'
        !          3290: -static        double  p[10] =
        !          3291: -{
        !          3292: -      1.0e0,
        !          3293: -      1.0e1,
        !          3294: -      1.0e2,
        !          3295: -      1.0e3,
        !          3296: -      1.0e4,
        !          3297: -      1.0e5,
        !          3298: -      1.0e6,
        !          3299: -      1.0e7,
        !          3300: -      1.0e8,
        !          3301: -      1.0e9,
        !          3302: -};
        !          3303: -
        !          3304: -double
        !          3305: -pow10(e)
        !          3306: -{
        !          3307: -      int i;
        !          3308: -
        !          3309: -      if(e < 0)
        !          3310: -              return 1 / pow10(-e);
        !          3311: -      if(e >= 10) {
        !          3312: -              i = e/2;
        !          3313: -              return pow10(i) * pow10(e-i);
        !          3314: -      }
        !          3315: -      return p[e];
        !          3316: -}
        !          3317: //GO.SYSIN DD ./math/pow10.c
        !          3318: echo ./math/Makefile 1>&2
        !          3319: sed 's/.//' >./math/Makefile <<'//GO.SYSIN DD ./math/Makefile'
        !          3320: -OBJ=pow10.o
        !          3321: -
        !          3322: -math.a:       $(OBJ)
        !          3323: -      ar r math.a $(OBJ)
        !          3324: -      $(RANLIB) math.a
        !          3325: -
        !          3326: -cray: math.o
        !          3327: -
        !          3328: -math.o:       $(OBJ)
        !          3329: -      cat $(OBJ) > math.o
        !          3330: //GO.SYSIN DD ./math/Makefile
        !          3331: echo ./Makefile 1>&2
        !          3332: sed 's/.//' >./Makefile <<'//GO.SYSIN DD ./Makefile'
        !          3333: -OBJ=alloc.o arc.o bquote.o builtins.o dir.o expand.o gen.o glob.o graph.o job.o lex.o main.o makefile.o match.o mk.o parse.o quote.o recipe.o regexp.o rule.o run.o shprint.o sig.o symtab.o t_ar.o t_driver.o t_file.o var.o word.o
        !          3334: -# first define the system type from V9, BSD42, SEQUENT, SYSV
        !          3335: -SYSTEM=SYSV
        !          3336: -# second add any special C flags (and -DCRAY and -g if on the cray)
        !          3337: -CFLAGS=-I. -D$(SYSTEM)
        !          3338: -# third, if you don't have a ranlib, set RANLIB=:
        !          3339: -RANLIB=:      # ranlib on other systems
        !          3340: -# now, to make everything just type make
        !          3341: -
        !          3342: -mk:   nlib $(OBJ)
        !          3343: -      $(CC) $(CFLAGS) -o mk $(OBJ) fio/fio.a libc/libc.a math/math.a
        !          3344: -nlib:
        !          3345: -      cd math; make CFLAGS="$(CFLAGS)" CC=$(CC) RANLIB=$(RANLIB)
        !          3346: -      cd libc; make CFLAGS="$(CFLAGS)" CC=$(CC) RANLIB=$(RANLIB)
        !          3347: -      cd fio; make CFLAGS="$(CFLAGS)" CC=$(CC) RANLIB=$(RANLIB)
        !          3348: -
        !          3349: -clean:
        !          3350: -      rm -f *.o mk nmk */*.[oa]
        !          3351: -alloc.o arc.o bquote.o builtins.o dir.o expand.o gen.o glob.o graph.o job.o lex.o main.o makefile.o match.o mk.o parse.o quote.o recipe.o regexp.o rule.o run.o shprint.o sig.o symtab.o t_ar.o t_driver.o t_file.o var.o word.o:      fio.h libc.h mk.h ndir.h regexp.h
        !          3352: //GO.SYSIN DD ./Makefile
        !          3353: echo ./mkconv 1>&2
        !          3354: sed 's/.//' >./mkconv <<'//GO.SYSIN DD ./mkconv'
        !          3355: -x=/tmp/mk$$
        !          3356: -trap 'rm -f $x' 0 1 2
        !          3357: -tee $x < $1 | sed -e 's/$(\([^)]*\))\([        :\/]\)/$\1\2/g
        !          3358: -      s/$(\([^)]*\))$/$\1/g
        !          3359: -      s/$(\([^)]*\))/${\1}/g
        !          3360: -      s/^     @/  /
        !          3361: -      /^      -/,/[^\\]$/{
        !          3362: -              /[^\\]$/s/$/; set -e/
        !          3363: -      }
        !          3364: -      /^      -/s/    -/      set +e; /
        !          3365: -      s/:&/:/
        !          3366: -      s/$% /$stem /g
        !          3367: -      s/$%\./$stem\./g
        !          3368: -      s/$%/${stem}/g
        !          3369: -      s/$@/${target}/g
        !          3370: -      s/$^/${prereq}/g
        !          3371: -      s/$?/$newprereq/g'
        !          3372: -if egrep -s 'cd[      ]|make' < $x
        !          3373: -then
        !          3374: -      echo "Warning: recipes containing \`cd' or \`make' need attention."
        !          3375: -      egrep 'cd[      ]|make' < $x
        !          3376: -fi 1>&2
        !          3377: //GO.SYSIN DD ./mkconv
        !          3378: echo ./membername 1>&2
        !          3379: sed 's/.//' >./membername <<'//GO.SYSIN DD ./membername'
        !          3380: -echo "$@" | tr " " "\012" | sed -e "s/[^(]*(\([^)]*\)).*/\1/" | tr "\012" " " 
        !          3381: //GO.SYSIN DD ./membername
        !          3382: echo ./mk.1 1>&2
        !          3383: sed 's/.//' >./mk.1 <<'//GO.SYSIN DD ./mk.1'
        !          3384: -.TH MK 1
        !          3385: -.CT 1 prog_c writing_troff prog_other
        !          3386: -.SH NAME
        !          3387: -mk, mkconv, membername \- maintain (make) related files
        !          3388: -.SH SYNOPSIS
        !          3389: -.B mk
        !          3390: -[
        !          3391: -.B -f
        !          3392: -.I mkfile
        !          3393: -] ...
        !          3394: -[
        !          3395: -.I option ...
        !          3396: -]
        !          3397: -[
        !          3398: -.I name ...
        !          3399: -]
        !          3400: -.PP
        !          3401: -.B mkconv
        !          3402: -.I makefile
        !          3403: -.PP
        !          3404: -.B membername
        !          3405: -.I aggregate ...
        !          3406: -.SH DESCRIPTION
        !          3407: -.I Mk
        !          3408: -is most often used to keep object files current with the
        !          3409: -source they depend on.
        !          3410: -.PP
        !          3411: -.I Mk
        !          3412: -reads
        !          3413: -.I mkfile
        !          3414: -and builds and executes dependency dags (directed acyclic graphs) for the target
        !          3415: -.IR names .
        !          3416: -If no target is specified, the targets of the first non-metarule in
        !          3417: -the first
        !          3418: -.I mkfile
        !          3419: -are used.
        !          3420: -If no
        !          3421: -.B -f
        !          3422: -option is present,
        !          3423: -.L mkfile
        !          3424: -is tried.
        !          3425: -Other options are:
        !          3426: -.TP \w'\fL-d[egp]\ 'u
        !          3427: -.B -a
        !          3428: -Assume all targets to be out of date.
        !          3429: -Thus, everything gets made.
        !          3430: -.PD 0
        !          3431: -.TP
        !          3432: -.BR -d [ egp ]
        !          3433: -Produce debugging output
        !          3434: -.RB ( p
        !          3435: -is for parsing,
        !          3436: -.B g
        !          3437: -for graph building,
        !          3438: -.B e
        !          3439: -for execution).
        !          3440: -.TP
        !          3441: -.B -e
        !          3442: -Explain why each target is made.
        !          3443: -.TP
        !          3444: -.B -i
        !          3445: -Force any missing intermediate targets to be made.
        !          3446: -.TP
        !          3447: -.B -k
        !          3448: -Do as much work as possible in the face of errors.
        !          3449: -.TP
        !          3450: -.B -m
        !          3451: -Generate an equivalent makefile on standard output.
        !          3452: -Recipes are not handled well.
        !          3453: -.TP
        !          3454: -.B -n
        !          3455: -Print, but do not execute, the commands
        !          3456: -needed to update the targets.
        !          3457: -.TP
        !          3458: -.B -t
        !          3459: -Touch (update the modified date of) non-virtual targets, without
        !          3460: -executing any recipes.
        !          3461: -.TP
        !          3462: -.B -u
        !          3463: -Produce a table of clock seconds spent with
        !          3464: -.I n
        !          3465: -recipes running.
        !          3466: -.TP
        !          3467: -.BI -w name1,name2,...
        !          3468: -Set the initial date stamp for each name
        !          3469: -to the current time.
        !          3470: -The names may also be separated by blanks or newlines.
        !          3471: -(Use with
        !          3472: -.B -n
        !          3473: -to find what else would need to change if the named files
        !          3474: -were modified.)
        !          3475: -.PD
        !          3476: -.PP
        !          3477: -.I Mkconv
        !          3478: -attempts to convert a
        !          3479: -.IR make (1)
        !          3480: -.I makefile
        !          3481: -to a
        !          3482: -.IR mkfile
        !          3483: -on standard output.
        !          3484: -The conversion is not likely to be faithful.
        !          3485: -.PP
        !          3486: -The shell script
        !          3487: -.I membername
        !          3488: -extracts member names
        !          3489: -(see `Aggregates' below)
        !          3490: -from its arguments.
        !          3491: -.SS Definitions
        !          3492: -A
        !          3493: -.I mkfile
        !          3494: -consists of
        !          3495: -.I assignments
        !          3496: -(described under `Environment') and
        !          3497: -.IR rules .
        !          3498: -A rule contains
        !          3499: -.I targets
        !          3500: -and a
        !          3501: -.I tail.
        !          3502: -A target is a literal string, or
        !          3503: -.I label,
        !          3504: -and is normally a file name.
        !          3505: -The tail contains zero or more 
        !          3506: -.I prerequisites
        !          3507: -and an optional
        !          3508: -.I recipe,
        !          3509: -which is a shell script.
        !          3510: -.PP
        !          3511: -A
        !          3512: -.I metarule 
        !          3513: -has a target of the form
        !          3514: -.IB A % B
        !          3515: -where
        !          3516: -.I A
        !          3517: -and
        !          3518: -.I B
        !          3519: -are (possibly empty) strings.
        !          3520: -A metarule applies to any label that matches the target with
        !          3521: -.B %
        !          3522: -replaced by an arbitrary string, called the
        !          3523: -.IR stem .
        !          3524: -In interpreting a metarule,
        !          3525: -the stem is substituted for all occurrences of
        !          3526: -.B %
        !          3527: -in the prerequisite names.
        !          3528: -A metarule may be marked as using regular expressions (described under `Syntax').
        !          3529: -In this case,
        !          3530: -.B %
        !          3531: -has no special meaning;
        !          3532: -the target is interpreted according to
        !          3533: -.IR regexp (3).
        !          3534: -The dependencies may refer to subexpressions in the normal way, using
        !          3535: -.BI \e n.
        !          3536: -The
        !          3537: -.I dependency dag
        !          3538: -for a target consists of
        !          3539: -.I nodes
        !          3540: -connected by directed
        !          3541: -.IR arcs .
        !          3542: -A node consists of a label
        !          3543: -and a set of arcs leading to prerequisite nodes.
        !          3544: -The root 
        !          3545: -node is labeled with an original target
        !          3546: -.I name.
        !          3547: -.SS Building the Dependency Dag
        !          3548: -.PP
        !          3549: -Read the
        !          3550: -.I mkfiles 
        !          3551: -in command line order and distribute rule tails over targets
        !          3552: -to get single-target rules.
        !          3553: -.PP
        !          3554: -For a node
        !          3555: -.IR n ,
        !          3556: -for every rule
        !          3557: -.I r
        !          3558: -that matches
        !          3559: -.IR n 's
        !          3560: -label generate an arc to a prerequisite node.
        !          3561: -The node
        !          3562: -.I n
        !          3563: -is then marked as done.
        !          3564: -The process is then repeated for each of the prerequisite nodes.
        !          3565: -The process stops if
        !          3566: -.I n
        !          3567: -is already done,
        !          3568: -or if
        !          3569: -.I n
        !          3570: -has no prerequisites,
        !          3571: -or if any rule would be used more than
        !          3572: -.B $NREP
        !          3573: -times on the current path in the dag.
        !          3574: -A probable node is one where the label exists as a file
        !          3575: -or is a target of a non-metarule.
        !          3576: -.PP
        !          3577: -After the graph is built, it is checked for cycles,
        !          3578: -and subdags containing no probable nodes are deleted.
        !          3579: -Also, for any node with arcs generated by a non-metarule with a recipe,
        !          3580: -arcs generated by a metarule with a recipe
        !          3581: -are deleted.
        !          3582: -Disconnected subdags are deleted.
        !          3583: -.SS Execution
        !          3584: -Labels have an associated date stamp.
        !          3585: -A label is
        !          3586: -.I ready
        !          3587: -if it has no prerequisites, or
        !          3588: -all its prerequisites are made.
        !          3589: -A ready label is
        !          3590: -.I trivially uptodate
        !          3591: -if it is not a target and has a nonzero date stamp, or
        !          3592: -it has a nonzero date stamp,
        !          3593: -and all its prerequisites are made and predate the ready label.
        !          3594: -A ready label is marked
        !          3595: -.I made
        !          3596: -(and given a date stamp)
        !          3597: -if it is trivially uptodate or by executing the recipe
        !          3598: -associated with the arcs leading from the node associated with the ready label.
        !          3599: -The
        !          3600: -.B P
        !          3601: -attribute can be used to generalize
        !          3602: -.IR mk 's
        !          3603: -notion of determining if prerequisites predate a label.
        !          3604: -Rather than comparing date stamps, it executes a specified program
        !          3605: -and uses the exit status.
        !          3606: -.PP
        !          3607: -Date stamps are calculated differently for virtual labels,
        !          3608: -for labels that correspond to extant files,
        !          3609: -and for other labels.
        !          3610: -If a label is
        !          3611: -.I virtual
        !          3612: -(target of a rule with the
        !          3613: -.B V
        !          3614: -attribute),
        !          3615: -its date stamp is initially zero and upon being made is set to
        !          3616: -the most recent date stamp of its prerequisites.
        !          3617: -Otherwise, if a label is nonexistent
        !          3618: -(does not exist as a file),
        !          3619: -its date stamp is set to the most recent date stamp of its prerequisites,
        !          3620: -or zero if it has no prerequisites.
        !          3621: -Otherwise, the label is the name of a file and
        !          3622: -the label's date stamp is always that file's modification date.
        !          3623: -.PP
        !          3624: -Nonexistent labels which have prerequisites
        !          3625: -and are prerequisite to other label(s) are treated specially unless the
        !          3626: -.B -i
        !          3627: -flag is used.
        !          3628: -Such a label
        !          3629: -.I l
        !          3630: -is given the date stamp of its most recent prerequisite
        !          3631: -and if this causes all the labels which have
        !          3632: -.I l
        !          3633: -as a prerequisite to be trivially uptodate,
        !          3634: -.I l
        !          3635: -is considered to be trivially uptodate.
        !          3636: -Otherwise,
        !          3637: -.I l
        !          3638: -is made in the normal fashion.
        !          3639: -.PP
        !          3640: -Two recipes are called identical if they arose by distribution
        !          3641: -from a single rule as described above.
        !          3642: -Identical recipes may be executed only when all
        !          3643: -their prerequisite nodes are ready, and then just one instance of
        !          3644: -the identical recipes is executed to make all their target nodes.
        !          3645: -.PP
        !          3646: -Files may be made in any order that respects
        !          3647: -the preceding restrictions.
        !          3648: -.PP
        !          3649: -A recipe is executed by supplying the recipe as standard input to
        !          3650: -the command
        !          3651: -.B
        !          3652: -        /bin/sh -e
        !          3653: -.br
        !          3654: -The environment is augmented by the following variables:
        !          3655: -.TP 14
        !          3656: -.B $alltarget
        !          3657: -all the targets of this rule.
        !          3658: -.TP
        !          3659: -.B $newprereq
        !          3660: -the prerequisites that caused this rule to execute.
        !          3661: -.TP
        !          3662: -.B $nproc
        !          3663: -the process slot for this recipe.
        !          3664: -It satisfies
        !          3665: -.RB 0\(<= $nproc < $NPROC ,
        !          3666: -where
        !          3667: -.B $NPROC
        !          3668: -is the maximum number of recipes that may be executing
        !          3669: -simultaneously.
        !          3670: -.TP
        !          3671: -.B $pid
        !          3672: -the process id for the
        !          3673: -.I mk
        !          3674: -forking the recipe.
        !          3675: -.TP
        !          3676: -.B $prereq
        !          3677: -all the prerequisites for this rule.
        !          3678: -.TP
        !          3679: -.B $stem
        !          3680: -if this is a metarule,
        !          3681: -.B $stem
        !          3682: -is the string that matched
        !          3683: -.BR % .
        !          3684: -Otherwise, it is empty.
        !          3685: -For regular expression metarules, the variables
        !          3686: -.LR stem0 ", ...,"
        !          3687: -.L stem9
        !          3688: -are set to the corresponding subexpressions.
        !          3689: -.TP
        !          3690: -.B $target
        !          3691: -the targets for this rule that need to be remade.
        !          3692: -.PP
        !          3693: -Unless the rule has the
        !          3694: -.B Q
        !          3695: -attribute,
        !          3696: -the recipe is printed prior to execution
        !          3697: -with recognizable shell variables expanded.
        !          3698: -To see the commands print as they execute,
        !          3699: -include a
        !          3700: -.L set -x
        !          3701: -in your rule.
        !          3702: -Commands returning nonzero status (see
        !          3703: -.IR intro (1))
        !          3704: -cause
        !          3705: -.I mk
        !          3706: -to terminate.
        !          3707: -.SS Aggregates
        !          3708: -Names of the form
        !          3709: -.IR a ( b )
        !          3710: -refer to member
        !          3711: -.I b
        !          3712: -of the aggregate
        !          3713: -.IR a .
        !          3714: -Currently, the only aggregates supported are
        !          3715: -.IR ar (1)
        !          3716: -archives.
        !          3717: -.SS Environment
        !          3718: -Rules may make use of shell (or environment) variables.
        !          3719: -A legal shell variable reference of the form
        !          3720: -.B $OBJ
        !          3721: -or
        !          3722: -.B ${name}
        !          3723: -is expanded as in
        !          3724: -.IR sh (1).
        !          3725: -A reference of the form
        !          3726: -.BI ${name: A % B = C\fB%\fID\fB}\fR,
        !          3727: -where
        !          3728: -.I A, B, C, D
        !          3729: -are (possibly empty) strings,
        !          3730: -has the value formed by expanding
        !          3731: -.B $name
        !          3732: -and substituting
        !          3733: -.I C
        !          3734: -for
        !          3735: -.I A
        !          3736: -and
        !          3737: -.I D
        !          3738: -for
        !          3739: -.I B
        !          3740: -in each word in
        !          3741: -.B $name
        !          3742: -that matches pattern
        !          3743: -.IB A % B .
        !          3744: -.PP
        !          3745: -Variables can be set by
        !          3746: -assignments of the form
        !          3747: -.I
        !          3748: -        var\fB=\fR[\fIattr\fB=\fR]\fItokens\fR
        !          3749: -.br
        !          3750: -where
        !          3751: -.I tokens
        !          3752: -and the optional attributes
        !          3753: -are defined under `Syntax' below.
        !          3754: -The environment is exported to recipe executions.
        !          3755: -Variable values are taken from (in increasing order of precedence)
        !          3756: -the default values below, the environment, the mkfiles,
        !          3757: -and any command line assignment.
        !          3758: -A variable assignment argument overrides the first (but not any subsequent)
        !          3759: -assignment to that variable.
        !          3760: -.br
        !          3761: -.ne 1i
        !          3762: -.EX
        !          3763: -.ta \n(.lu/3u +\n(.lu/3u
        !          3764: -.nf
        !          3765: -AS=as FFLAGS= NPROC=1
        !          3766: -CC=cc LEX=lex NREP=1
        !          3767: -CFLAGS=       LFLAGS= YACC=yacc
        !          3768: -FC=f77        LDFLAGS=        YFLAGS= 
        !          3769: -BUILTINS='
        !          3770: -.ta 8n
        !          3771: -%.o:  %.c
        !          3772: -      $CC $CFLAGS -c $stem.c
        !          3773: -%.o:  %.s
        !          3774: -      $AS -o $stem.o $stem.s
        !          3775: -%.o:  %.f
        !          3776: -      $FC $FFLAGS -c $stem.f
        !          3777: -%.o:  %.y
        !          3778: -      $YACC $YFLAGS $stem.y &&
        !          3779: -      $CC $CFLAGS -c y.tab.c && mv y.tab.o $stem.o; rm y.tab.c
        !          3780: -%.o:  %.l
        !          3781: -      $LEX $LFLAGS -t $stem.l > $stem.c &&
        !          3782: -      $CC $CFLAGS -c $stem.c && rm $stem.c'
        !          3783: -ENVIRON=
        !          3784: -.EE
        !          3785: -.PP
        !          3786: -The builtin rules are obtained from the variable
        !          3787: -.B BUILTINS
        !          3788: -after all input has been processed.
        !          3789: -The 
        !          3790: -.B ENVIRON
        !          3791: -variable is split into parts at control-A characters,
        !          3792: -the control-A characters are deleted, and the parts are 
        !          3793: -placed in the environment.
        !          3794: -The variable
        !          3795: -.B MKFLAGS
        !          3796: -contains all the option arguments (arguments starting with
        !          3797: -.L -
        !          3798: -or containing
        !          3799: -.LR = )
        !          3800: -and
        !          3801: -.B MKARGS
        !          3802: -contains all the targets in the call to
        !          3803: -.IR mk .
        !          3804: -.SS Syntax
        !          3805: -Leading white space (blank or tab) is ignored.
        !          3806: -Input after an unquoted
        !          3807: -.B #
        !          3808: -(a comment) is ignored as are blank lines.
        !          3809: -Lines can be spread over several physical lines by
        !          3810: -placing a
        !          3811: -.B \e
        !          3812: -before newlines to be elided.
        !          3813: -Non-recipe lines are processed by substituting for
        !          3814: -.BI ` cmd `
        !          3815: -and then substituting for variable references.
        !          3816: -Finally, the filename metacharacters
        !          3817: -.B []*?
        !          3818: -are expanded.
        !          3819: -.tr #"
        !          3820: -Quoting by
        !          3821: -.BR \&'' ,
        !          3822: -.BR ## ,
        !          3823: -and
        !          3824: -.B \e
        !          3825: -is supported.
        !          3826: -The semantics for substitution and quoting are given in
        !          3827: -.IR sh (1).
        !          3828: -.PP
        !          3829: -The contents of files may be included by lines beginning with
        !          3830: -.B <
        !          3831: -followed by a filename.
        !          3832: -.PP
        !          3833: -.tr ##
        !          3834: -Assignments and rule header lines are distinguished by
        !          3835: -the first unquoted occurrence of
        !          3836: -.B :
        !          3837: -(rule header)
        !          3838: -or
        !          3839: -.B =
        !          3840: -(assignment).
        !          3841: -.PP
        !          3842: -A rule definition consists of a header line followed by a recipe.
        !          3843: -The recipe consists of all lines following the header line
        !          3844: -that start with white space.
        !          3845: -The recipe may be empty.
        !          3846: -The first character on every line of the recipe is elided.
        !          3847: -The header line consists of at least one target followed by the rule separator
        !          3848: -and a possibly empty list of prerequisites.
        !          3849: -The rule separator is either a single
        !          3850: -.LR : 
        !          3851: -or is a 
        !          3852: -.L :
        !          3853: -immediately followed by attributes and another
        !          3854: -.LR : .
        !          3855: -If any prerequisite is more recent than any of the targets,
        !          3856: -the recipe is executed.
        !          3857: -This meaning is modified by the following attributes
        !          3858: -.TP
        !          3859: -.B <
        !          3860: -The standard output of the recipe is read by
        !          3861: -.I mk
        !          3862: -as an additional mkfile.
        !          3863: -Assignments take effect immediately.
        !          3864: -Rule definitions are used when a new dependency dag is constructed.
        !          3865: -.PD 0
        !          3866: -.TP
        !          3867: -.B D
        !          3868: -If the recipe exits with an error status, the target is deleted.
        !          3869: -.TP
        !          3870: -.B N
        !          3871: -If there is no recipe, the target has its time updated.
        !          3872: -.TP
        !          3873: -.B P
        !          3874: -The characters after the
        !          3875: -.B P
        !          3876: -until the terminating
        !          3877: -.B :
        !          3878: -are taken as a program name.
        !          3879: -It will be invoked as
        !          3880: -.B "sh -c prog 'arg1' 'arg2'"
        !          3881: -and should return 0 exit status
        !          3882: -if and only if arg1 is not out of date with respect to arg2.
        !          3883: -Date stamps are still propagated in the normal way.
        !          3884: -.TP
        !          3885: -.B Q
        !          3886: -The recipe is not printed prior to execution.
        !          3887: -.TP
        !          3888: -.B R
        !          3889: -The rule is a metarule using regular expressions.
        !          3890: -.TP
        !          3891: -.B U
        !          3892: -The targets are considered to have been updated
        !          3893: -even if the recipe did not do so.
        !          3894: -.TP
        !          3895: -.B V
        !          3896: -The targets of this rule are marked as virtual.
        !          3897: -They are distinct from files of the same name.
        !          3898: -.PD
        !          3899: -.PP
        !          3900: -Similarly, assignments may have attributes terminated by
        !          3901: -.BR = .
        !          3902: -The only assignment attribute is
        !          3903: -.TP 3
        !          3904: -.B U
        !          3905: -Do not export this variable to recipe executions.
        !          3906: -.SH EXAMPLES
        !          3907: -A simple mkfile to compile a program.
        !          3908: -.IP
        !          3909: -.EX
        !          3910: -prog: a.o b.o c.o
        !          3911: -      $CC $CFLAGS -o $target $prereq
        !          3912: -.EE
        !          3913: -.PP
        !          3914: -Override flag settings in the mkfile.
        !          3915: -.IP
        !          3916: -.EX
        !          3917: -$ mk target CFLAGS='-O -s'
        !          3918: -.EE
        !          3919: -.PP
        !          3920: -To get the prerequisites for an aggregate.
        !          3921: -.IP
        !          3922: -.EX
        !          3923: -$ membername 'libc.a(read.o)' 'libc.a(write.o)'
        !          3924: -read.o write.o
        !          3925: -.EE
        !          3926: -.PP
        !          3927: -Maintain a library.
        !          3928: -.IP
        !          3929: -.EX
        !          3930: -libc.a(%.o):N:        %.o
        !          3931: -libc.a:       libc.a(abs.o) libc.a(access.o) libc.a(alarm.o) ...
        !          3932: -      names=`membername $newprereq`
        !          3933: -      ar r libc.a $names && rm $names
        !          3934: -.EE
        !          3935: -.PP
        !          3936: -Backquotes used to derive a list from a master list.
        !          3937: -.IP
        !          3938: -.EX
        !          3939: -NAMES=alloc arc bquote builtins expand main match mk var word
        !          3940: -OBJ=`echo $NAMES|sed -e 's/[^ ][^ ]*/&.o/g'`
        !          3941: -.EE
        !          3942: -.PP
        !          3943: -Regular expression metarules.
        !          3944: -The single quotes are needed to protect the
        !          3945: -.BR \e s.
        !          3946: -.IP
        !          3947: -.EX
        !          3948: -\&'([^/]*)/(.*)\e.o':R:  '\e1/\e2.c'
        !          3949: -      cd $stem1; $CC $CFLAGS -c $stem2.c
        !          3950: -.EE
        !          3951: -.PP
        !          3952: -A correct way to deal with
        !          3953: -.IR yacc (1)
        !          3954: -grammars.
        !          3955: -The file
        !          3956: -.B lex.c
        !          3957: -includes the file
        !          3958: -.B x.tab.h
        !          3959: -rather than
        !          3960: -.B y.tab.h
        !          3961: -in order to reflect changes in content, not just modification time.
        !          3962: -.IP
        !          3963: -.EX
        !          3964: -YFLAGS=-d
        !          3965: -lex.o:        x.tab.h
        !          3966: -x.tab.h:      y.tab.h
        !          3967: -      cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h
        !          3968: -y.tab.c y.tab.h:      gram.y
        !          3969: -      $YACC $YFLAGS gram.y
        !          3970: -.EE
        !          3971: -.PP
        !          3972: -The above example could also use the
        !          3973: -.B P
        !          3974: -attribute for the
        !          3975: -.B x.tab.h
        !          3976: -rule:
        !          3977: -.IP
        !          3978: -.EX
        !          3979: -x.tab.h:Pcmp -s:      y.tab.h
        !          3980: -      cp y.tab.h x.tab.h
        !          3981: -.EE
        !          3982: -.SH SEE ALSO
        !          3983: -.IR make (1),
        !          3984: -.IR chdate (1),
        !          3985: -.IR sh (1),
        !          3986: -.IR regexp (3)
        !          3987: -.br
        !          3988: -A. Hume,
        !          3989: -.RI ` Mk :
        !          3990: -a Successor to
        !          3991: -.IR Make ',
        !          3992: -this manual, Volume 2
        !          3993: -.SH BUGS
        !          3994: -Identical recipes for regular expression metarules only have one target.
        !          3995: -.br
        !          3996: -Seemingly appropriate input like
        !          3997: -.B CFLAGS=-DHZ=60
        !          3998: -is parsed as an erroneous attribute; correct it by inserting
        !          3999: -a space after the first 
        !          4000: -.LR = .
        !          4001: //GO.SYSIN DD ./mk.1
        !          4002: echo ./alloc.c 1>&2
        !          4003: sed 's/.//' >./alloc.c <<'//GO.SYSIN DD ./alloc.c'
        !          4004: -#include      "libc.h"
        !          4005: -
        !          4006: -static int goo;               /* so no empty object on cray */
        !          4007: -
        !          4008: -#ifndef       CRAY
        !          4009: -
        !          4010: -#define       A(x)    ((((long)x)+sizeof(long)-1)&~(sizeof(long)-1))
        !          4011: -
        !          4012: -char *next;
        !          4013: -int nleft;
        !          4014: -
        !          4015: -char *
        !          4016: -malloc(n)
        !          4017: -{
        !          4018: -      extern char *sbrk();
        !          4019: -      char *s;
        !          4020: -
        !          4021: -      n = A(n);
        !          4022: -      if(n > nleft){
        !          4023: -              next = sbrk(nleft = A(32000));
        !          4024: -              if(next == (char *)-1){
        !          4025: -                      perror("mk: sbrk");
        !          4026: -                      Exit();
        !          4027: -              }
        !          4028: -      }
        !          4029: -      s = next;
        !          4030: -      next += n;
        !          4031: -      nleft -= n;
        !          4032: -      return(s);
        !          4033: -}
        !          4034: -
        !          4035: -free(s)
        !          4036: -      char *s;
        !          4037: -{
        !          4038: -}
        !          4039: -
        !          4040: -char *
        !          4041: -realloc(s, n)
        !          4042: -      char *s;
        !          4043: -      unsigned n;
        !          4044: -{
        !          4045: -      char *r;
        !          4046: -
        !          4047: -      r = malloc(n);
        !          4048: -      memcpy(r, s, n);
        !          4049: -      return(r);
        !          4050: -}
        !          4051: -
        !          4052: -#endif
        !          4053: //GO.SYSIN DD ./alloc.c
        !          4054: echo ./arc.c 1>&2
        !          4055: sed 's/.//' >./arc.c <<'//GO.SYSIN DD ./arc.c'
        !          4056: -#include      "mk.h"
        !          4057: -
        !          4058: -Arc *
        !          4059: -newarc(n, r, stem, match)
        !          4060: -      Node *n;
        !          4061: -      Rule *r;
        !          4062: -      char *stem;
        !          4063: -      regsubexp *match;
        !          4064: -{
        !          4065: -      register Arc *a;
        !          4066: -
        !          4067: -      a = (Arc *)Malloc(sizeof(Arc));
        !          4068: -      a->n = n;
        !          4069: -      a->r = r;
        !          4070: -      a->stem = strdup(stem);
        !          4071: -      memcpy((char *)a->match, (char *)match, sizeof a->match);
        !          4072: -      a->next = 0;
        !          4073: -      a->flag = 0;
        !          4074: -      a->prog = r->prog;
        !          4075: -      return(a);
        !          4076: -}
        !          4077: -
        !          4078: -dumpa(s, a)
        !          4079: -      char *s;
        !          4080: -      register Arc *a;
        !          4081: -{
        !          4082: -      char buf[1024];
        !          4083: -
        !          4084: -      sprint(buf, "%s    ", (*s == ' ')? s:"");
        !          4085: -      Fprint(1, "%sArc@%ld: n=%ld r=%ld flag=0x%x stem='%s'",
        !          4086: -              s, a, a->n, a->r, a->flag, a->stem);
        !          4087: -      if(a->prog)
        !          4088: -              Fprint(1, " prog='%s'", a->prog);
        !          4089: -      Fprint(1, "\n");
        !          4090: -      if(a->n)
        !          4091: -              dumpn(buf, a->n);
        !          4092: -}
        !          4093: -
        !          4094: -nrep()
        !          4095: -{
        !          4096: -      register Symtab *sym;
        !          4097: -
        !          4098: -      if(sym = symlook("NREP", S_VAR, (char *)0))
        !          4099: -              nreps = atoi(sym->value);
        !          4100: -      if(nreps < 1)
        !          4101: -              nreps = 1;
        !          4102: -      if(DEBUG(D_GRAPH))
        !          4103: -              Fprint(1, "nreps = %d\n", nreps);
        !          4104: -}
        !          4105: //GO.SYSIN DD ./arc.c
        !          4106: echo ./bquote.c 1>&2
        !          4107: sed 's/.//' >./bquote.c <<'//GO.SYSIN DD ./bquote.c'
        !          4108: -#include      "mk.h"
        !          4109: -
        !          4110: -bquote(fd, src, dest)
        !          4111: -      register char *src, *dest;
        !          4112: -{
        !          4113: -      int childin[2], childout[2], pid, i;
        !          4114: -      int quotedone = 1;
        !          4115: -      char *ldest, *t;
        !          4116: -      char *newline = "\n";
        !          4117: -      int wearedone = 0;
        !          4118: -      int initdone = 0;
        !          4119: -      extern char **environ;
        !          4120: -
        !          4121: -      while(wearedone == 0)
        !          4122: -              switch(*src)
        !          4123: -              {
        !          4124: -              default:
        !          4125: -                      *dest++ = *src++;
        !          4126: -                      break;
        !          4127: -              case 0:
        !          4128: -                      if(quotedone)
        !          4129: -                              wearedone = 1;
        !          4130: -                      else {
        !          4131: -                              if(t = Frdline(fd)){
        !          4132: -                                      inline++;
        !          4133: -                                      *dest++ = '\n'|EBIT;
        !          4134: -                                      strcpy(src, t);
        !          4135: -                                      continue;
        !          4136: -                              } else {
        !          4137: -                                      SYNERR(-1); Fprint(2, "missing closing `\n");
        !          4138: -                                      break;
        !          4139: -                              }
        !          4140: -                      }
        !          4141: -                      break;
        !          4142: -              case '\\':
        !          4143: -                      if(*src)
        !          4144: -                              *dest++ = *src++;
        !          4145: -                      else
        !          4146: -                              if(t = Frdline(fd)){
        !          4147: -                                      inline++;
        !          4148: -                                      strcpy(src, t);
        !          4149: -                              }
        !          4150: -                      break;
        !          4151: -              case '`':
        !          4152: -                      if(quotedone = 1-quotedone){
        !          4153: -                              if(initdone == 0){
        !          4154: -                                      execinit();
        !          4155: -                                      initdone = 1;
        !          4156: -                              }
        !          4157: -                              Fflush(1);
        !          4158: -                              Fflush(2);
        !          4159: -                              if(pipe(childin) < 0){
        !          4160: -                                      SYNERR(-1); perror("pipe1");
        !          4161: -                                      Exit();
        !          4162: -                              }
        !          4163: -                              if(pipe(childout) < 0){
        !          4164: -                                      SYNERR(-1); perror("pipe2");
        !          4165: -                                      Exit();
        !          4166: -                              }
        !          4167: -                              if((pid = fork()) < 0){
        !          4168: -                                      SYNERR(-1); perror("fork");
        !          4169: -                                      Exit();
        !          4170: -                              }
        !          4171: -                              if(pid){        /* parent */
        !          4172: -                                      close(childin[0]);
        !          4173: -                                      close(childout[1]);
        !          4174: -                                      if(ldest < dest){
        !          4175: -                                              writeout(childin[1], ldest, dest);
        !          4176: -                                              writeout(childin[1], newline, newline+1);
        !          4177: -                                      }
        !          4178: -                                      close(childin[1]);
        !          4179: -                                      dest = ldest;
        !          4180: -                                      while((i = read(childout[0], dest, 512)) > 0)
        !          4181: -                                              dest += i;
        !          4182: -                                      if((dest > ldest) && (dest[-1] == '\n'))
        !          4183: -                                              dest--;
        !          4184: -                                      close(childout[0]);
        !          4185: -                              } else {
        !          4186: -                                      dup2(childin[0], 0);
        !          4187: -                                      dup2(childout[1], 1);
        !          4188: -                                      close(childin[0]);
        !          4189: -                                      close(childin[1]);
        !          4190: -                                      close(childout[0]);
        !          4191: -                                      close(childout[1]);
        !          4192: -                                      if(execle(SHELL, "sh", (char *)0, environ) < 0)
        !          4193: -                                              perror("exec");
        !          4194: -                                      _exit(1);
        !          4195: -                              }
        !          4196: -                      } else
        !          4197: -                              ldest = dest;
        !          4198: -                      src++;
        !          4199: -                      break;
        !          4200: -              }
        !          4201: -      *dest = 0;
        !          4202: -}
        !          4203: -
        !          4204: -writeout(fd, b, e)
        !          4205: -      register char *b, *e;
        !          4206: -{
        !          4207: -      char buf[BIGBLOCK];
        !          4208: -      register char *s;
        !          4209: -
        !          4210: -      for(s = buf; b < e;){
        !          4211: -              if(s >= &buf[BIGBLOCK-1]){
        !          4212: -                      SYNERR(-1); Fprint(2, "too much text (%d chars) for `expr`\n", s-buf);
        !          4213: -                      Exit();
        !          4214: -              }
        !          4215: -              if(*b&EBIT){
        !          4216: -                      *s++ = '\\';
        !          4217: -                      *s++ = (~EBIT) & *b++;
        !          4218: -              } else
        !          4219: -                      *s++ = *b++;
        !          4220: -      }
        !          4221: -      write(fd, buf, s-buf);
        !          4222: -}
        !          4223: //GO.SYSIN DD ./bquote.c
        !          4224: echo ./builtins.c 1>&2
        !          4225: sed 's/.//' >./builtins.c <<'//GO.SYSIN DD ./builtins.c'
        !          4226: -#include      "mk.h"
        !          4227: -
        !          4228: -char *bltin[] =
        !          4229: -{
        !          4230: -      "AS", "as",
        !          4231: -      "CC", "cc",
        !          4232: -      "CFLAGS", "",
        !          4233: -      "FC", "f77",
        !          4234: -      "FFLAGS", "",
        !          4235: -      "LDFLAGS", "",
        !          4236: -      "LEX", "lex",
        !          4237: -      "LFLAGS", "",
        !          4238: -      "NPROC", "1",
        !          4239: -      "NREP", "1",
        !          4240: -      "YACC", "yacc",
        !          4241: -      "YFLAGS", "",
        !          4242: -      "BUILTINS", "%.o:       %.c\n\
        !          4243: -      $CC $CFLAGS -c $stem.c\n\
        !          4244: -%.o:  %.s\n\
        !          4245: -      $AS -o $stem.o $stem.s\n\
        !          4246: -%.o:  %.f\n\
        !          4247: -      $FC $FFLAGS -c $stem.f\n\
        !          4248: -%.o:  %.y\n\
        !          4249: -      $YACC $YFLAGS $stem.y && $CC $CFLAGS -c y.tab.c && mv y.tab.o $stem.o; rm y.tab.c\n\
        !          4250: -%.o:  %.l\n\
        !          4251: -      $LEX $LFLAGS -t $stem.l > /tmp/$$.c && $CC $CFLAGS -c /tmp/$$.c && mv /tmp/$$.o $stem.o; rm /tmp/$$.c\n",
        !          4252: -      "ENVIRON", "",
        !          4253: -      0
        !          4254: -};
        !          4255: -
        !          4256: -builtins()
        !          4257: -{
        !          4258: -      register char **b;
        !          4259: -
        !          4260: -      for(b = bltin; *b; b += 2)
        !          4261: -              setvar(b[0], strdup(b[1]));
        !          4262: -}
        !          4263: -
        !          4264: -parsebuiltins()
        !          4265: -{
        !          4266: -      char *s, *file;
        !          4267: -      int fd;
        !          4268: -      int n;
        !          4269: -
        !          4270: -      s = symlook("BUILTINS", S_VAR, (char *)0)->value;
        !          4271: -      if(*s == 0)
        !          4272: -              return;
        !          4273: -      file = mktemp("/tmp/mkXXXXXX");
        !          4274: -      if((fd = creat(file, 0600)) < 0){
        !          4275: -              fprint(2, "mk: builtins in ");
        !          4276: -              perror(file);
        !          4277: -              Exit();
        !          4278: -      }
        !          4279: -      if(n = strlen(s)){
        !          4280: -              write(fd, s, n);
        !          4281: -              if(s[n-1] != '\n')
        !          4282: -                      write(fd, "\n", 1);
        !          4283: -      }
        !          4284: -      close(fd);
        !          4285: -      parse("BUILTINS", open(file, 0), 0, 0);
        !          4286: -      unlink(file);
        !          4287: -}
        !          4288: //GO.SYSIN DD ./builtins.c
        !          4289: echo ./dir.c 1>&2
        !          4290: sed 's/.//' >./dir.c <<'//GO.SYSIN DD ./dir.c'
        !          4291: -#include      <sys/types.h>
        !          4292: -#include      <sys/stat.h>
        !          4293: -#ifndef SEQUENT
        !          4294: -#include      <ndir.h>
        !          4295: -#else
        !          4296: -#include      <dir.h>
        !          4297: -#endif
        !          4298: -
        !          4299: -#ifdef        SEQUENT
        !          4300: -#define               DIRSIZE MAXNAMELEN
        !          4301: -#else
        !          4302: -#define               DIRSIZE 14
        !          4303: -#endif
        !          4304: -#ifndef       MAXNAMELEN
        !          4305: -#define       MAXNAMELEN      255
        !          4306: -#endif
        !          4307: -#ifndef DIRSIZ
        !          4308: -#define DIRSIZ(dp) \
        !          4309: -    ((sizeof(struct direct) - MAXNAMLEN + (dp)->d_namlen + sizeof(ino_t) - 1) &\
        !          4310: -    ~(sizeof(ino_t) - 1))
        !          4311: -#endif
        !          4312: -
        !          4313: -extern char *strncpy(), *malloc();
        !          4314: -
        !          4315: -DIR *
        !          4316: -opendir(name)
        !          4317: -register char *name;
        !          4318: -{
        !          4319: -      DIR dirbuf, *dirp;
        !          4320: -      struct stat statb;
        !          4321: -      char buf[MAXNAMELEN+1];
        !          4322: -      register char *s;
        !          4323: -
        !          4324: -      strncpy(buf, name, MAXNAMELEN);
        !          4325: -      buf[MAXNAMELEN-1] = 0;
        !          4326: -      if ((dirbuf.dd_fd = open(buf, 0)) < 0)
        !          4327: -              return((DIR *)0);
        !          4328: -      if (fstat(dirbuf.dd_fd, &statb)!=0 || (statb.st_mode & S_IFMT)!=S_IFDIR){
        !          4329: -              close(dirbuf.dd_fd);
        !          4330: -              return((DIR *)0);
        !          4331: -      }
        !          4332: -      dirbuf.dd_loc = 0;
        !          4333: -      dirp = (DIR *)malloc(sizeof(DIR));
        !          4334: -      *dirp = dirbuf;
        !          4335: -      return(dirp);
        !          4336: -}
        !          4337: -
        !          4338: -void
        !          4339: -closedir(dirp)
        !          4340: -DIR *dirp;
        !          4341: -{
        !          4342: -      close(dirp->dd_fd);
        !          4343: -      free((char *)dirp);
        !          4344: -}
        !          4345: -
        !          4346: -/*
        !          4347: - * read an old stlye directory entry and present it as a new one
        !          4348: - */
        !          4349: -#define       ODIRSIZ 14
        !          4350: -
        !          4351: -struct        olddirect {
        !          4352: -      ino_t   d_ino;
        !          4353: -      char    d_name[ODIRSIZ];
        !          4354: -#ifdef        CRAY
        !          4355: -      char    d_pad[10];
        !          4356: -#endif
        !          4357: -};
        !          4358: -
        !          4359: -/*
        !          4360: - * get next entry in a directory.
        !          4361: - */
        !          4362: -struct direct *
        !          4363: -readdir(dirp)
        !          4364: -      register DIR *dirp;
        !          4365: -{
        !          4366: -      register struct olddirect *dp;
        !          4367: -      static struct direct dir;
        !          4368: -
        !          4369: -      for (;;) {
        !          4370: -              if (dirp->dd_loc == 0) {
        !          4371: -                      dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, 
        !          4372: -                          DIRBLKSIZ);
        !          4373: -                      if (dirp->dd_size <= 0)
        !          4374: -                              return((struct direct *)0);
        !          4375: -              }
        !          4376: -              if (dirp->dd_loc >= dirp->dd_size) {
        !          4377: -                      dirp->dd_loc = 0;
        !          4378: -                      continue;
        !          4379: -              }
        !          4380: -              dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
        !          4381: -              dirp->dd_loc += sizeof(struct olddirect);
        !          4382: -              if (dp->d_ino == 0)
        !          4383: -                      continue;
        !          4384: -              dir.d_ino = dp->d_ino;
        !          4385: -              strncpy(dir.d_name, dp->d_name, ODIRSIZ);
        !          4386: -              dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */
        !          4387: -              dir.d_namlen = strlen(dir.d_name);
        !          4388: -              dir.d_reclen = DIRSIZ(&dir);
        !          4389: -              return (&dir);
        !          4390: -      }
        !          4391: -}
        !          4392: //GO.SYSIN DD ./dir.c
        !          4393: echo ./expand.c 1>&2
        !          4394: sed 's/.//' >./expand.c <<'//GO.SYSIN DD ./expand.c'
        !          4395: -#include      "mk.h"
        !          4396: -#include      <ctype.h>
        !          4397: -
        !          4398: -static Word *bollard;
        !          4399: -
        !          4400: -static void
        !          4401: -append(s)
        !          4402: -      char *s;
        !          4403: -{
        !          4404: -      register Word *w;
        !          4405: -      register char *p;
        !          4406: -
        !          4407: -      if(bollard){
        !          4408: -              for(w = bollard; w->next; w = w->next)
        !          4409: -                      ;
        !          4410: -              w = w->next = stow(s);
        !          4411: -      } else
        !          4412: -              w = bollard = stow(s);
        !          4413: -      if(w)   /* if we got a word */
        !          4414: -              for(p = w->s; *p;)
        !          4415: -                      *p++ &= ~EBIT;
        !          4416: -}
        !          4417: -
        !          4418: -Word *
        !          4419: -expand(s)
        !          4420: -      register char *s;
        !          4421: -{
        !          4422: -      char save;
        !          4423: -      register char *t;
        !          4424: -      Word *head, *w;
        !          4425: -
        !          4426: -      w = head = newword("");
        !          4427: -      while(*s){
        !          4428: -              while(SEP(*s))
        !          4429: -                      s++;
        !          4430: -              if(*s == 0) break;
        !          4431: -              for(t = s+1; *t && !SEP(*t); t++)
        !          4432: -                      ;
        !          4433: -              save = *t;
        !          4434: -              *t = 0;
        !          4435: -              bollard = 0;
        !          4436: -              glob(s, append);
        !          4437: -              w->next = bollard;
        !          4438: -              while(w->next)
        !          4439: -                      w = w->next;
        !          4440: -              *t = save;
        !          4441: -              s = t;
        !          4442: -      }
        !          4443: -      w = head->next;
        !          4444: -      delword(head);
        !          4445: -      return(w);
        !          4446: -}
        !          4447: //GO.SYSIN DD ./expand.c
        !          4448: echo ./gen.c 1>&2
        !          4449: sed 's/.//' >./gen.c <<'//GO.SYSIN DD ./gen.c'
        !          4450: -#include      "mk.h"
        !          4451: -
        !          4452: -#define       NMATCH  10
        !          4453: -
        !          4454: -gen(buf)
        !          4455: -      char *buf;
        !          4456: -{
        !          4457: -      char buf1[BIGBLOCK];
        !          4458: -      register char *src, *dest;
        !          4459: -      register char *s1, *s2, *s3, *s4;
        !          4460: -      regexp *prog;
        !          4461: -      regsubexp match[NMATCH];
        !          4462: -      char c;
        !          4463: -
        !          4464: -      if((s1 = strchr(buf, '@')) == 0)
        !          4465: -                      return;
        !          4466: -      patrule = 0;
        !          4467: -      src = buf;
        !          4468: -      dest = buf1;
        !          4469: -      do {
        !          4470: -              while(src != s1)
        !          4471: -                      *dest++ = *src++;
        !          4472: -              if((s2 = strchr(s1+1, '@')) && (s3 = strchr(s2+1, '@'))
        !          4473: -              && (s4 = strchr(s3+1, '@')))
        !          4474: -                      ;
        !          4475: -              else {
        !          4476: -                      SYNERR(-1); Fprint(2, "expected four @\n");
        !          4477: -                      break;
        !          4478: -              }
        !          4479: -              src = s4+1;
        !          4480: -              *s2++ = *s3++ = *s4 = 0;
        !          4481: -              prog = regcomp(s2);
        !          4482: -              for(s2 = ++s1; ; s2 = s1){
        !          4483: -                      while((*s2 == ' ')||(*s2 == '\t'))
        !          4484: -                              s2++;
        !          4485: -                      if(s1 != s2) *dest++ = ' ';
        !          4486: -                      if(*s2 == 0) break;
        !          4487: -                      for(s1 = s2+1; *s1 && (*s1 != ' ') && (*s1 != '\t');)
        !          4488: -                              s1++;
        !          4489: -                      c = *s1;
        !          4490: -                      *s1 = 0;
        !          4491: -                      if(regexec(prog, s2, match, NMATCH)){
        !          4492: -                              regsub(s3, dest, match, NMATCH);
        !          4493: -                              while(*dest) dest++;
        !          4494: -                      } else
        !          4495: -                              while(*dest = *s2++)
        !          4496: -                                      dest++;
        !          4497: -                      *s1 = c;
        !          4498: -              }
        !          4499: -      } while(s1 = strchr(src, '@'));
        !          4500: -      while(*dest++ = *src++)
        !          4501: -              ;
        !          4502: -      memcpy(buf, buf1, (int)(dest-buf1));
        !          4503: -}
        !          4504: //GO.SYSIN DD ./gen.c
        !          4505: echo ./glob.c 1>&2
        !          4506: sed 's/.//' >./glob.c <<'//GO.SYSIN DD ./glob.c'
        !          4507: -#include      <sys/types.h>
        !          4508: -#include      <sys/stat.h>
        !          4509: -#ifndef SEQUENT
        !          4510: -#include      <ndir.h>
        !          4511: -#else
        !          4512: -#include      <dir.h>
        !          4513: -#endif
        !          4514: -#include      <string.h>
        !          4515: -#include      "mk.h"
        !          4516: -
        !          4517: -#define               MAXPATH         BIGBLOCK
        !          4518: -
        !          4519: -static char result[MAXPATH];
        !          4520: -static doit();
        !          4521: -
        !          4522: -/*
        !          4523: - * globals (file name generation)
        !          4524: - *
        !          4525: - * "*" in params matches r.e ".*"
        !          4526: - * "?" in params matches r.e. "."
        !          4527: - * "[...]" in params matches character class
        !          4528: - * "[...a-z...]" in params matches a through z.
        !          4529: - *
        !          4530: - */
        !          4531: -
        !          4532: -static
        !          4533: -gglob(arg, dest, fn)
        !          4534: -      char *arg, *dest;
        !          4535: -      void (*fn)();
        !          4536: -{
        !          4537: -      int meta;
        !          4538: -      char *slash, *s;
        !          4539: -      DIR *dirf;
        !          4540: -
        !          4541: -      /*
        !          4542: -              check for meta chars
        !          4543: -      */
        !          4544: -      for(s = arg, slash = 0, meta = 0; *s && !meta; s++)
        !          4545: -              switch(*s)
        !          4546: -              {
        !          4547: -              case '/':
        !          4548: -                      slash = s+1;
        !          4549: -                      break;
        !          4550: -              case '\\':
        !          4551: -                      if(s[1])
        !          4552: -                              s++;
        !          4553: -                      break;
        !          4554: -              case '[':
        !          4555: -              case '*':
        !          4556: -              case '?':
        !          4557: -                      meta = 1;
        !          4558: -                      break;
        !          4559: -              }
        !          4560: -      if(meta == 0){
        !          4561: -              strcpy(dest, arg);
        !          4562: -              (*fn)(result);
        !          4563: -              return;
        !          4564: -      }
        !          4565: -      if(slash){
        !          4566: -              memcpy(dest, arg, slash-arg);
        !          4567: -              dest += slash-arg;
        !          4568: -              *dest = 0;
        !          4569: -      } else
        !          4570: -              slash = arg;
        !          4571: -      s = strchr(slash, '/');
        !          4572: -      if(dirf = opendir(result[0] ? result : ".")){
        !          4573: -              struct direct *e;
        !          4574: -              int found;
        !          4575: -
        !          4576: -              found = 0;
        !          4577: -              if(s) *s = 0;
        !          4578: -              /* slash is null terminated (s) pattern */
        !          4579: -              while(e = readdir(dirf)){
        !          4580: -                      if(e->d_name[0] == '.' && *slash != '.'){
        !          4581: -                              if (e->d_name[1] == 0)
        !          4582: -                                      continue;
        !          4583: -                              if (e->d_name[1] == '.' && e->d_name[2] == 0)
        !          4584: -                                      continue;
        !          4585: -                      }
        !          4586: -                      if(gmatch(e->d_name, slash)){
        !          4587: -                              found = 1;
        !          4588: -                              strcpy(dest, e->d_name);
        !          4589: -                              doit(s, dest, fn);
        !          4590: -                      }
        !          4591: -              }
        !          4592: -              if(!found){
        !          4593: -                      strcpy(dest, slash);
        !          4594: -                      doit(s, dest, fn);
        !          4595: -              }
        !          4596: -              closedir(dirf);
        !          4597: -      } else {
        !          4598: -              if(s)
        !          4599: -                      *s = 0;
        !          4600: -              strcpy(dest, slash);
        !          4601: -              dest = strchr(dest, 0);
        !          4602: -              if(s){
        !          4603: -                      *dest++ = '/';
        !          4604: -                      *dest = 0;
        !          4605: -                      gglob(s+1, dest, fn);
        !          4606: -              } else
        !          4607: -                      (*fn)(result);
        !          4608: -      }
        !          4609: -      if(s) *s = '/';
        !          4610: -}
        !          4611: -
        !          4612: -static
        !          4613: -doit(s, dest, fn)
        !          4614: -      char *s, *dest;
        !          4615: -      void (*fn)();
        !          4616: -{
        !          4617: -      if(s){
        !          4618: -              register char *ss;
        !          4619: -
        !          4620: -              ss = strchr(dest, 0);
        !          4621: -              *ss++ = '/';
        !          4622: -              *ss = 0;
        !          4623: -              gglob(s+1, ss, fn);
        !          4624: -      } else
        !          4625: -              (*fn)(result);
        !          4626: -}
        !          4627: -
        !          4628: -gmatch(s, p)
        !          4629: -register char *s, *p;
        !          4630: -{
        !          4631: -      register int scc;
        !          4632: -      unsigned char c;
        !          4633: -
        !          4634: -      scc = *s++&(0xFF&~EBIT);
        !          4635: -      switch (c = *p++)
        !          4636: -      {
        !          4637: -      case '[':
        !          4638: -              {
        !          4639: -                      int ok;
        !          4640: -                      int lc;
        !          4641: -                      int notflag = 0;
        !          4642: -
        !          4643: -                      ok = 0;
        !          4644: -                      lc = 077777;
        !          4645: -                      if (*p == '^'){
        !          4646: -                              notflag = 1;
        !          4647: -                              p++;
        !          4648: -                      }
        !          4649: -                      while (c = *p++){
        !          4650: -                              if (c == ']')
        !          4651: -                                      return(ok ? gmatch(s, p) : 0);
        !          4652: -                              else if (c == '-'){
        !          4653: -                                      if (notflag){
        !          4654: -                                              if (scc < lc || scc > *(p++))
        !          4655: -                                                      ok++;
        !          4656: -                                              else
        !          4657: -                                                      return(0);
        !          4658: -                                      } else {
        !          4659: -                                              if (lc <= scc && scc <= (*p++))
        !          4660: -                                                      ok++;
        !          4661: -                                      }
        !          4662: -                              } else {
        !          4663: -                                      lc = c&~EBIT;
        !          4664: -                                      if (notflag){
        !          4665: -                                              if (scc && scc != lc)
        !          4666: -                                                      ok++;
        !          4667: -                                              else
        !          4668: -                                                      return(0);
        !          4669: -                                      } else {
        !          4670: -                                              if (scc == lc)
        !          4671: -                                                      ok++;
        !          4672: -                                      }
        !          4673: -                              }
        !          4674: -                      }
        !          4675: -                      return(0);
        !          4676: -              }
        !          4677: -
        !          4678: -      default:
        !          4679: -              if ((c&~EBIT) != scc)
        !          4680: -                      return(0);
        !          4681: -
        !          4682: -      case '?':
        !          4683: -              return(scc ? gmatch(s, p) : 0);
        !          4684: -
        !          4685: -      case '*':
        !          4686: -              while (*p == '*')
        !          4687: -                      p++;
        !          4688: -
        !          4689: -              if (*p == 0)
        !          4690: -                      return(1);
        !          4691: -              --s;
        !          4692: -              while (*s){
        !          4693: -                      if (gmatch(s++, p))
        !          4694: -                              return(1);
        !          4695: -              }
        !          4696: -              return(0);
        !          4697: -
        !          4698: -      case 0:
        !          4699: -              return(scc == 0);
        !          4700: -      }
        !          4701: -}
        !          4702: -
        !          4703: -glob(s, fn)
        !          4704: -      char *s;
        !          4705: -      void (*fn)();
        !          4706: -{
        !          4707: -      result[0] = 0;
        !          4708: -      if(strlen(s) >= MAXPATH){
        !          4709: -              SYNERR(inline-1);
        !          4710: -              Fprint(2, "too much input for glob expansion; max=%d, given %d\n", MAXPATH, strlen(s));
        !          4711: -              Exit();
        !          4712: -      }
        !          4713: -      gglob(s, result, fn);
        !          4714: -}
        !          4715: -
        !          4716: -#ifdef        MAIN
        !          4717: -
        !          4718: -void
        !          4719: -pr(s)
        !          4720: -      char *s;
        !          4721: -{
        !          4722: -      Fwrite(1, s, strlen(s));
        !          4723: -      Fputc(1, '\n');
        !          4724: -}
        !          4725: -
        !          4726: -main(argc, argv)
        !          4727: -      char **argv;
        !          4728: -{
        !          4729: -      for(argv++; *argv; argv++){
        !          4730: -              Fprint(1, "<%s>:\n", *argv);
        !          4731: -              glob(*argv, pr);
        !          4732: -              Fprint(1, "*******\n");
        !          4733: -      }
        !          4734: -      exit(0);
        !          4735: -}
        !          4736: -#endif
        !          4737: //GO.SYSIN DD ./glob.c
        !          4738: echo ./graph.c 1>&2
        !          4739: sed 's/.//' >./graph.c <<'//GO.SYSIN DD ./graph.c'
        !          4740: -#include      "mk.h"
        !          4741: -
        !          4742: -static Node *newnode(), *applyrules();
        !          4743: -static cyclechk(), vacuous(), ambiguous(), attribute();
        !          4744: -
        !          4745: -Node *
        !          4746: -graph(target)
        !          4747: -      char *target;
        !          4748: -{
        !          4749: -      Node *node;
        !          4750: -      char *cnt;
        !          4751: -
        !          4752: -      node = applyrules(target, cnt = rulecnt());
        !          4753: -      free(cnt);
        !          4754: -      cyclechk(node);
        !          4755: -      node->flags |= PROBABLE;        /* make sure it doesn't get deleted */
        !          4756: -      (void)vacuous(node);
        !          4757: -      (void)ambiguous(node);
        !          4758: -      (void)attribute(node);
        !          4759: -      return(node);
        !          4760: -}
        !          4761: -
        !          4762: -static Node *
        !          4763: -applyrules(target, cnt)
        !          4764: -      char *target, *cnt;
        !          4765: -{
        !          4766: -      Symtab *sym;
        !          4767: -      Node *node;
        !          4768: -      Rule *r;
        !          4769: -      Arc head, *a = &head;
        !          4770: -      Word *w;
        !          4771: -      char stem[NAMEBLOCK], buf[NAMEBLOCK];
        !          4772: -      regsubexp rmatch[NREGEXP];
        !          4773: -
        !          4774: -/*    print("appplyrules(%ld='%s')\n", target, target);/**/
        !          4775: -      if(sym = symlook(target, S_NODE, (char *)0)){
        !          4776: -              node = (Node *)(sym->value);
        !          4777: -              return(node);
        !          4778: -      }
        !          4779: -      target = strdup(target);
        !          4780: -      node = newnode(target);
        !          4781: -      head.n = 0;
        !          4782: -      head.next = 0;
        !          4783: -      sym = symlook(target, S_TARGET, (char *)0);
        !          4784: -      for(r = sym? (Rule *)(sym->value):0; r; r = r->chain){
        !          4785: -              if(r->attr&META) continue;
        !          4786: -              if(strcmp(target, r->target)) continue;
        !          4787: -              if(cnt[r->rule] >= nreps) continue;
        !          4788: -              cnt[r->rule]++;
        !          4789: -              node->flags |= PROBABLE;
        !          4790: -              if(r->attr&VIR)
        !          4791: -                      node->flags |= VIRTUAL;
        !          4792: -              if(r->attr&NOREC)
        !          4793: -                      node->flags |= NORECIPE;
        !          4794: -              if(r->attr&DEL)
        !          4795: -                      node->flags |= DELETE;
        !          4796: -              if(r->tail == 0)
        !          4797: -                      a = a->next = newarc((Node *)0, r, "", rmatch);
        !          4798: -              else
        !          4799: -                      for(w = r->tail; w; w = w->next){
        !          4800: -                              a = a->next = newarc(applyrules(w->s, cnt), r, "", rmatch);
        !          4801: -              }
        !          4802: -              cnt[r->rule]--;
        !          4803: -              head.n = node;
        !          4804: -      }
        !          4805: -      for(r = metarules; r; r = r->next){
        !          4806: -              if(r->attr&REGEXP){
        !          4807: -                      stem[0] = 0;
        !          4808: -                      patrule = r;
        !          4809: -                      if(regexec(r->pat, node->name, rmatch, NREGEXP) == 0)
        !          4810: -                              continue;
        !          4811: -              } else {
        !          4812: -                      if(!match(node->name, r->target, stem)) continue;
        !          4813: -              }
        !          4814: -              if(cnt[r->rule] >= nreps) continue;
        !          4815: -              cnt[r->rule]++;
        !          4816: -              if(r->attr&VIR)
        !          4817: -                      node->flags |= VIRTUAL;
        !          4818: -              if(r->attr&NOREC)
        !          4819: -                      node->flags |= NORECIPE;
        !          4820: -              if(r->attr&DEL)
        !          4821: -                      node->flags |= DELETE;
        !          4822: -              if(r->tail == 0)
        !          4823: -                      a = a->next = newarc((Node *)0, r, strdup(stem), rmatch);
        !          4824: -              else
        !          4825: -                      for(w = r->tail; w; w = w->next){
        !          4826: -                              if(r->attr&REGEXP)
        !          4827: -                                      regsub(w->s, buf, rmatch, NREGEXP);
        !          4828: -                              else
        !          4829: -                                      subst(stem, w->s, buf);
        !          4830: -                              a = a->next = newarc(applyrules(buf, cnt), r, strdup(stem), rmatch);
        !          4831: -                      }
        !          4832: -              cnt[r->rule]--;
        !          4833: -      }
        !          4834: -      a->next = node->prereqs;
        !          4835: -      node->prereqs = head.next;
        !          4836: -      return(node);
        !          4837: -}
        !          4838: -
        !          4839: -static
        !          4840: -togo(node)
        !          4841: -      register Node *node;
        !          4842: -{
        !          4843: -      register Arc *la, *a;
        !          4844: -
        !          4845: -      /* delete them now */
        !          4846: -      for(a = node->prereqs; a; la = a, a = a->next)
        !          4847: -              if(a->flag&TOGO){
        !          4848: -                      if(a == node->prereqs)
        !          4849: -                              node->prereqs = a->next;
        !          4850: -                      else
        !          4851: -                              la->next = a->next, a = la;
        !          4852: -              }
        !          4853: -}
        !          4854: -
        !          4855: -static
        !          4856: -vacuous(node)
        !          4857: -      register Node *node;
        !          4858: -{
        !          4859: -      register Arc *la, *a;
        !          4860: -      int vac = !(node->flags&PROBABLE);
        !          4861: -
        !          4862: -      if(node->flags&READY)
        !          4863: -              return(node->flags&VACUOUS);
        !          4864: -      node->flags |= READY;
        !          4865: -      for(a = node->prereqs; a; a = a->next)
        !          4866: -              if(a->n && vacuous(a->n) && (a->r->attr&META))
        !          4867: -                      a->flag |= TOGO;
        !          4868: -              else
        !          4869: -                      vac = 0;
        !          4870: -      /* if a rule generated arcs that DON'T go; no others from that rule go */
        !          4871: -      for(a = node->prereqs; a; a = a->next)
        !          4872: -              if((a->flag&TOGO) == 0)
        !          4873: -                      for(la = node->prereqs; la; la = la->next)
        !          4874: -                              if((la->flag&TOGO) && (la->r == a->r)){
        !          4875: -                                      la->flag &= ~TOGO;
        !          4876: -                              }
        !          4877: -      togo(node);
        !          4878: -      if(vac)
        !          4879: -              node->flags |= VACUOUS;
        !          4880: -      return(vac);
        !          4881: -}
        !          4882: -
        !          4883: -static Node *
        !          4884: -newnode(name)
        !          4885: -      char *name;
        !          4886: -{
        !          4887: -      register Node *node;
        !          4888: -
        !          4889: -      node = (Node *)Malloc(sizeof(Node));
        !          4890: -      symlook(name, S_NODE, (char *)node);
        !          4891: -      node->name = name;
        !          4892: -      node->time = timeof(name, 0);
        !          4893: -      node->prereqs = 0;
        !          4894: -      node->flags = node->time? PROBABLE : 0;
        !          4895: -      node->next = 0;
        !          4896: -      return(node);
        !          4897: -}
        !          4898: -
        !          4899: -dumpn(s, n)
        !          4900: -      char *s;
        !          4901: -      register Node *n;
        !          4902: -{
        !          4903: -      char buf[1024];
        !          4904: -      register Arc *a;
        !          4905: -
        !          4906: -      sprint(buf, "%s   ", (*s == ' ')? s:"");
        !          4907: -      Fprint(1, "%s%s@%ld: time=%ld flags=0x%x next=%ld\n",
        !          4908: -              s, n->name, n, n->time, n->flags, n->next);
        !          4909: -      for(a = n->prereqs; a; a = a->next)
        !          4910: -              dumpa(buf, a);
        !          4911: -}
        !          4912: -
        !          4913: -static
        !          4914: -trace(s, a)
        !          4915: -      char *s;
        !          4916: -      register Arc *a;
        !          4917: -{
        !          4918: -      Fprint(2, "\t%s", s);
        !          4919: -      while(a){
        !          4920: -              Fprint(2, " <-(%s:%d)- %s", a->r->file, a->r->line,
        !          4921: -                      a->n? a->n->name:"");
        !          4922: -              if(a->n){
        !          4923: -                      for(a = a->n->prereqs; a; a = a->next)
        !          4924: -                              if(*a->r->recipe) break;
        !          4925: -              } else
        !          4926: -                      a = 0;
        !          4927: -      }
        !          4928: -      Fputc(2, '\n');
        !          4929: -}
        !          4930: -
        !          4931: -static
        !          4932: -cyclechk(n)
        !          4933: -      register Node *n;
        !          4934: -{
        !          4935: -      register Arc *a;
        !          4936: -
        !          4937: -      if((n->flags&CYCLE) && n->prereqs){
        !          4938: -              Fprint(2, "mk: cycle in graph detected at target %s\n", n->name);
        !          4939: -              Exit();
        !          4940: -      }
        !          4941: -      n->flags |= CYCLE;
        !          4942: -      for(a = n->prereqs; a; a = a->next)
        !          4943: -              if(a->n)
        !          4944: -                      cyclechk(a->n);
        !          4945: -      n->flags &= ~CYCLE;
        !          4946: -}
        !          4947: -
        !          4948: -static
        !          4949: -ambiguous(n)
        !          4950: -      register Node *n;
        !          4951: -{
        !          4952: -      register Arc *a;
        !          4953: -      register Rule *r = 0;
        !          4954: -      Arc *la;
        !          4955: -      int bad = 0;
        !          4956: -
        !          4957: -      for(a = n->prereqs; a; a = a->next){
        !          4958: -              if(a->n)
        !          4959: -                      ambiguous(a->n);
        !          4960: -              if(*a->r->recipe == 0) continue;
        !          4961: -              if(r == 0)
        !          4962: -                      r = a->r, la = a;
        !          4963: -              else{
        !          4964: -                      if(r->recipe != a->r->recipe){
        !          4965: -                              if((r->attr&META) && !(a->r->attr&META)){
        !          4966: -                                      la->flag |= TOGO;
        !          4967: -                                      r = a->r, la = a;
        !          4968: -                              } else if(!(r->attr&META) && (a->r->attr&META)){
        !          4969: -                                      a->flag |= TOGO;
        !          4970: -                                      continue;
        !          4971: -                              }
        !          4972: -                      }
        !          4973: -                      if(r->recipe != a->r->recipe){
        !          4974: -                              if(bad == 0){
        !          4975: -                                      Fprint(2, "mk: ambiguous recipes for %s:\n", n->name);
        !          4976: -                                      bad = 1;
        !          4977: -                                      trace(n->name, la);
        !          4978: -                              }
        !          4979: -                              trace(n->name, a);
        !          4980: -                      }
        !          4981: -              }
        !          4982: -      }
        !          4983: -      if(bad)
        !          4984: -              Exit();
        !          4985: -      togo(n);
        !          4986: -}
        !          4987: -
        !          4988: -static
        !          4989: -attribute(n)
        !          4990: -      register Node *n;
        !          4991: -{
        !          4992: -      register Arc *a;
        !          4993: -
        !          4994: -      for(a = n->prereqs; a; a = a->next){
        !          4995: -              if(a->r->attr&VIR)
        !          4996: -                      n->flags |= VIRTUAL;
        !          4997: -              if(a->r->attr&NOREC)
        !          4998: -                      n->flags |= NORECIPE;
        !          4999: -              if(a->r->attr&DEL)
        !          5000: -                      n->flags |= DELETE;
        !          5001: -              if(a->n)
        !          5002: -                      attribute(a->n);
        !          5003: -      }
        !          5004: -      if(n->flags&VIRTUAL)
        !          5005: -              n->time = 0;
        !          5006: -}
        !          5007: //GO.SYSIN DD ./graph.c
        !          5008: echo ./job.c 1>&2
        !          5009: sed 's/.//' >./job.c <<'//GO.SYSIN DD ./job.c'
        !          5010: -#include      "mk.h"
        !          5011: -
        !          5012: -Job *
        !          5013: -newjob(r, nlist, stem, match, pre, npre, tar, atar)
        !          5014: -      Rule *r;
        !          5015: -      Node *nlist;
        !          5016: -      char *stem;
        !          5017: -      regsubexp *match;
        !          5018: -      Word *pre, *npre, *tar, *atar;
        !          5019: -{
        !          5020: -      register Job *j;
        !          5021: -
        !          5022: -      j = (Job *)Malloc(sizeof(Job));
        !          5023: -      j->r = r;
        !          5024: -      j->n = nlist;
        !          5025: -      j->stem = stem;
        !          5026: -      j->match = match;
        !          5027: -      j->p = pre;
        !          5028: -      j->np = npre;
        !          5029: -      j->t = tar;
        !          5030: -      j->at = atar;
        !          5031: -      j->nproc = -1;
        !          5032: -      j->fd = -1;
        !          5033: -      j->next = 0;
        !          5034: -      return(j);
        !          5035: -}
        !          5036: -
        !          5037: -dumpj(s, j, all)
        !          5038: -      char *s;
        !          5039: -      Job *j;
        !          5040: -{
        !          5041: -      Fprint(1, "%s\n", s);
        !          5042: -      while(j){
        !          5043: -              Fprint(1, "job@%ld: r=%ld n=%ld stem='%s' nproc=%d\n",
        !          5044: -                      j, j->r, j->n, j->stem, j->nproc);
        !          5045: -              Fprint(1, "\ttarget='%s' alltarget='%s' prereq='%s' nprereq='%s'\n",
        !          5046: -                      wtos(j->t), wtos(j->at), wtos(j->p), wtos(j->np));
        !          5047: -              j = all? j->next : 0;
        !          5048: -      }
        !          5049: -}
        !          5050: //GO.SYSIN DD ./job.c
        !          5051: echo ./lex.c 1>&2
        !          5052: sed 's/.//' >./lex.c <<'//GO.SYSIN DD ./lex.c'
        !          5053: -#include      "mk.h"
        !          5054: -
        !          5055: -lex(fd, buf)
        !          5056: -      char *buf;
        !          5057: -{
        !          5058: -      char buf1[BIGBLOCK];
        !          5059: -
        !          5060: -      quote1(fd, buf, buf1);  /* '..' */
        !          5061: -      bquote(fd, buf1, buf);  /* `cmd` */
        !          5062: -      quote2(fd, buf, buf1);  /* ".." and variable expansion */
        !          5063: -      strcpy(buf, buf1);
        !          5064: -}
        !          5065: //GO.SYSIN DD ./lex.c
        !          5066: echo ./main.c 1>&2
        !          5067: sed 's/.//' >./main.c <<'//GO.SYSIN DD ./main.c'
        !          5068: -#include      "mk.h"
        !          5069: -
        !          5070: -#define               MKFILE          "mkfile"
        !          5071: -
        !          5072: -static char *version = "@(#)mk general release 3";
        !          5073: -int debug;
        !          5074: -Rule *rules, *metarules;
        !          5075: -int nproclimit;
        !          5076: -int nflag = 0;
        !          5077: -int tflag = 0;
        !          5078: -int iflag = 0;
        !          5079: -int kflag = 0;
        !          5080: -int mflag = 0;
        !          5081: -int aflag = 0;
        !          5082: -int uflag = 0;
        !          5083: -char *explain = 0;
        !          5084: -Word *target1;
        !          5085: -int nreps = 1;
        !          5086: -Job *jobs;
        !          5087: -char *whatif = 0;
        !          5088: -#ifdef        PROF
        !          5089: -short buf[10000];
        !          5090: -#endif
        !          5091: -
        !          5092: -main(argc, argv)
        !          5093: -      char **argv;
        !          5094: -{
        !          5095: -      register Word *w;
        !          5096: -      register char *s;
        !          5097: -      char *files[256], **f = files, **ff;
        !          5098: -      char mkargs[256], *ma = mkargs;
        !          5099: -      int i;
        !          5100: -      int tfd = -1;
        !          5101: -      char *temp = "/tmp/mkargXXXXXX";
        !          5102: -
        !          5103: -      *ma = 0;
        !          5104: -      for(argv++; *argv && (**argv == '-'); argv++)
        !          5105: -      {
        !          5106: -              for(s = argv[0]; *s; *ma++ = *s++);
        !          5107: -              *ma++ = ' ';
        !          5108: -              switch(argv[0][1])
        !          5109: -              {
        !          5110: -              case 'a':
        !          5111: -                      aflag = 1;
        !          5112: -                      break;
        !          5113: -              case 'd':
        !          5114: -                      if(*(s = &argv[0][2]))
        !          5115: -                              while(*s) switch(*s++)
        !          5116: -                              {
        !          5117: -                              case 'p':       debug |= D_PARSE; break;
        !          5118: -                              case 'g':       debug |= D_GRAPH; break;
        !          5119: -                              case 'e':       debug |= D_EXEC; break;
        !          5120: -                              }
        !          5121: -                      else
        !          5122: -                              debug = 0xFFFF;
        !          5123: -                      break;
        !          5124: -              case 'e':
        !          5125: -                      explain = &argv[0][2];
        !          5126: -                      break;
        !          5127: -              case 'f':
        !          5128: -                      if(*++argv == 0)
        !          5129: -                              usage();
        !          5130: -                      *f++ = *argv;
        !          5131: -                      for(s = argv[0]; *s; *ma++ = *s++);
        !          5132: -                      *ma++ = ' ';
        !          5133: -                      break;
        !          5134: -              case 'i':
        !          5135: -                      iflag = 1;
        !          5136: -                      break;
        !          5137: -              case 'k':
        !          5138: -                      kflag = 1;
        !          5139: -                      break;
        !          5140: -              case 'm':
        !          5141: -                      mflag = 1;
        !          5142: -                      aflag = nflag = 1;
        !          5143: -                      break;
        !          5144: -              case 'n':
        !          5145: -                      nflag = 1;
        !          5146: -                      break;
        !          5147: -              case 't':
        !          5148: -                      tflag = 1;
        !          5149: -                      break;
        !          5150: -              case 'u':
        !          5151: -                      uflag = 1;
        !          5152: -                      break;
        !          5153: -              case 'w':
        !          5154: -                      if(argv[0][2])
        !          5155: -                              whatif = &argv[0][2];
        !          5156: -                      else {
        !          5157: -                              if(*++argv == 0)
        !          5158: -                                      usage();
        !          5159: -                              whatif = &argv[0][0];
        !          5160: -                      }
        !          5161: -                      break;
        !          5162: -              default:
        !          5163: -                      usage();
        !          5164: -              }
        !          5165: -      }
        !          5166: -#ifdef        PROF
        !          5167: -      {
        !          5168: -              extern etext();
        !          5169: -              monitor(main, etext, buf, sizeof buf, 300);
        !          5170: -      }
        !          5171: -#endif
        !          5172: -
        !          5173: -      if(aflag)
        !          5174: -              iflag = 1;
        !          5175: -
        !          5176: -      account();
        !          5177: -      syminit();
        !          5178: -      builtins();
        !          5179: -      initenv();
        !          5180: -
        !          5181: -      /*
        !          5182: -              assignment args become null strings
        !          5183: -      */
        !          5184: -      for(i = 0; argv[i]; i++) if(strchr(argv[i], '=')){
        !          5185: -              for(s = argv[i]; *s; *ma++ = *s++);
        !          5186: -              *ma++ = ' ';
        !          5187: -              if(tfd < 0){
        !          5188: -                      mktemp(temp);
        !          5189: -                      close(creat(temp, 0600));
        !          5190: -                      if((tfd = open(temp, 2)) < 0){
        !          5191: -                              perror(temp);
        !          5192: -                              Exit();
        !          5193: -                      }
        !          5194: -              }
        !          5195: -              Fprint(tfd, "%s\n", argv[i]);
        !          5196: -              *argv[i] = 0;
        !          5197: -      }
        !          5198: -      if(tfd >= 0){
        !          5199: -              Fflush(tfd);
        !          5200: -              lseek(tfd, 0L, 0);
        !          5201: -              parse("command line args", tfd, 1, 1);
        !          5202: -              unlink(temp);
        !          5203: -      }
        !          5204: -
        !          5205: -      if(ma != mkargs) ma--;
        !          5206: -      *ma = 0;
        !          5207: -      symlook("MKFLAGS", S_VAR, strdup(mkargs));
        !          5208: -      for(ma = mkargs, i = 0; argv[i]; i++){
        !          5209: -              if(*argv[i] == 0) continue;
        !          5210: -              if(i) *ma++ = ' ';
        !          5211: -              for(s = argv[i]; *s; *ma++ = *s++);
        !          5212: -      }
        !          5213: -      *ma = 0;
        !          5214: -      symlook("MKARGS", S_VAR, strdup(mkargs));
        !          5215: -
        !          5216: -      if(f == files){
        !          5217: -              if(access(MKFILE, 4) == 0)
        !          5218: -                      parse(MKFILE, open(MKFILE, 0), 0, 1);
        !          5219: -      } else
        !          5220: -              for(ff = files; ff < f; ff++)
        !          5221: -                      parse(*ff, open(*ff, 0), 0, 1);
        !          5222: -      parsebuiltins();
        !          5223: -      if(DEBUG(D_PARSE)){
        !          5224: -              dumpw("default targets", target1);
        !          5225: -              dumpr("rules", rules);
        !          5226: -              dumpr("metarules", metarules);
        !          5227: -              dumpv("variables");
        !          5228: -      }
        !          5229: -      if(whatif)
        !          5230: -              timeinit(whatif);
        !          5231: -      execinit();
        !          5232: -      /* skip assignment args */
        !          5233: -      while(*argv && (**argv == 0))
        !          5234: -              argv++;
        !          5235: -      sigcatch();
        !          5236: -      if(*argv == 0){
        !          5237: -              if(target1)
        !          5238: -                      for(w = target1; w; w = w->next)
        !          5239: -                              mk(w->s);
        !          5240: -              else {
        !          5241: -                      Fprint(2, "mk: nothing to mk\n");
        !          5242: -                      Exit();
        !          5243: -              }
        !          5244: -      } else
        !          5245: -              for(; *argv; argv++)
        !          5246: -                      if(**argv)
        !          5247: -                              mk(*argv);
        !          5248: -      if(uflag)
        !          5249: -              praccount();
        !          5250: -      if(mflag)
        !          5251: -              makefile();
        !          5252: -      exit(0);
        !          5253: -}
        !          5254: -
        !          5255: -usage()
        !          5256: -{
        !          5257: -
        !          5258: -      Fprint(2, "Usage: mk [-f file] [-n] [-a] [-e] [-t] [-k] [-i] [-d[egp]] [targets ...]\n");
        !          5259: -      Exit();
        !          5260: -}
        !          5261: -
        !          5262: -char *
        !          5263: -Malloc(n)
        !          5264: -{
        !          5265: -      register char *s;
        !          5266: -
        !          5267: -      if(s = malloc(n))
        !          5268: -              return(s);
        !          5269: -      Fprint(2, "mk: cannot alloc %d bytes\n", n);
        !          5270: -      Exit();
        !          5271: -      return((char *)0);      /* shut cyntax up */
        !          5272: -}
        !          5273: -
        !          5274: -Exit()
        !          5275: -{
        !          5276: -      while(wait((int *)0) >= 0)
        !          5277: -              ;
        !          5278: -      exit(1);
        !          5279: -}
        !          5280: -
        !          5281: -char *
        !          5282: -strndup(s, n)
        !          5283: -      char *s;
        !          5284: -{
        !          5285: -      register char *goo;
        !          5286: -
        !          5287: -      goo = Malloc(n);
        !          5288: -      memcpy(goo, s, n);
        !          5289: -      return(goo);
        !          5290: -}
        !          5291: -
        !          5292: -initenv()
        !          5293: -{
        !          5294: -      extern char **environ;
        !          5295: -      register char **p, *s, *ss;
        !          5296: -
        !          5297: -      for(p = environ; *p; p++){
        !          5298: -              s = shname(*p);
        !          5299: -              switch(*s)
        !          5300: -              {
        !          5301: -              case '=':
        !          5302: -                      *s = 0;
        !          5303: -                      ss = strdup(s+1);
        !          5304: -                      symlook(strdup(*p), S_VAR, ss)->value = ss;
        !          5305: -                      *s = '=';
        !          5306: -                      break;
        !          5307: -              case 0:
        !          5308: -                      ss = strdup("");
        !          5309: -                      symlook(strdup(*p), S_VAR, ss)->value = ss;
        !          5310: -                      break;
        !          5311: -              }
        !          5312: -      }
        !          5313: -}
        !          5314: -
        !          5315: -assert(s, n)
        !          5316: -      char *s;
        !          5317: -{
        !          5318: -      if(!n){
        !          5319: -              Fprint(2, "mk: Assertion ``%s'' failed.\n", s);
        !          5320: -              Exit();
        !          5321: -      }
        !          5322: -}
        !          5323: //GO.SYSIN DD ./main.c
        !          5324: echo ./makefile.c 1>&2
        !          5325: sed 's/.//' >./makefile.c <<'//GO.SYSIN DD ./makefile.c'
        !          5326: -#include      "mk.h"
        !          5327: -
        !          5328: -#define               FOLD    65
        !          5329: -
        !          5330: -static char *first = 0;
        !          5331: -static didit;
        !          5332: -
        !          5333: -maketarget(s)
        !          5334: -      char *s;
        !          5335: -{
        !          5336: -      if(first == 0)
        !          5337: -              first = s;
        !          5338: -}
        !          5339: -
        !          5340: -addmake(n)
        !          5341: -      Node *n;
        !          5342: -{
        !          5343: -      symlook(n->name, S_MAKEFILE, (char *)n);
        !          5344: -}
        !          5345: -
        !          5346: -static
        !          5347: -fold(s, sep)
        !          5348: -      char *s;
        !          5349: -{
        !          5350: -      int i = 0;
        !          5351: -
        !          5352: -      while(*s){
        !          5353: -              i++;
        !          5354: -              if((*s == ' ') && (i > FOLD)){
        !          5355: -                      Fprint(1, "\\\n%c", sep);
        !          5356: -                      i = 0;
        !          5357: -              } else
        !          5358: -                      Fputc(1, *s++);
        !          5359: -      }
        !          5360: -}
        !          5361: -
        !          5362: -static void
        !          5363: -vd(s)
        !          5364: -      register Symtab *s;
        !          5365: -{
        !          5366: -      Fprint(1, "%s=", s->name);
        !          5367: -      fold(symlook(s->name, S_VAR, (char *)0)->value, ' ');
        !          5368: -      Fputc(1, '\n');
        !          5369: -}
        !          5370: -
        !          5371: -#define       SUB(s)  { register char *ss = s; while(*dest++ = *ss++); dest--; copy = 0; }
        !          5372: -
        !          5373: -static char *
        !          5374: -vexpand(ww, dest, j)
        !          5375: -      char **ww, *dest;
        !          5376: -      Job *j;
        !          5377: -{
        !          5378: -      register char *s, *w = *ww;
        !          5379: -      char carry, *q;
        !          5380: -      int copy;
        !          5381: -
        !          5382: -      assert("vexpand no $", *w == '$');
        !          5383: -      if(*++w == '{'){
        !          5384: -              for(s = ++w; *s != '}'; s++)
        !          5385: -                      if(*s == 0) break;
        !          5386: -      } else
        !          5387: -              s = shname(w);
        !          5388: -      carry = *s;
        !          5389: -      *s = 0;
        !          5390: -      copy = 1;
        !          5391: -      if(!symlook(w, S_MAKEVAR, (char *)0)){
        !          5392: -              if(strcmp(w, "target") == 0){
        !          5393: -                      SUB("$?")
        !          5394: -              } else if(strcmp(w, "stem") == 0){
        !          5395: -                      SUB(j->stem)
        !          5396: -              } else if(strcmp(w, "prereq") == 0){
        !          5397: -                      SUB("$@")
        !          5398: -              } else if(strcmp(w, "pid") == 0){
        !          5399: -                      SUB("$$$$")
        !          5400: -              } else if(strcmp(w, "newprereq") == 0){
        !          5401: -                      SUB(wtos(j->np))
        !          5402: -              } else if(strcmp(w, "alltarget") == 0){
        !          5403: -                      SUB(wtos(j->at))
        !          5404: -                      Fprint(2, "Warning; $alltarget expanded to '%s'\n", wtos(j->at));
        !          5405: -              } else if((strncmp(w, "stem", 4) == 0) && (w[4] >= '0') && (w[4] <= '9')){
        !          5406: -                      int i = w[4] - '0';
        !          5407: -                      int nb = j->match[i].ep - j->match[i].sp;
        !          5408: -
        !          5409: -                      memcpy(dest, j->match[i].sp, nb);
        !          5410: -                      dest += nb;
        !          5411: -              } else {
        !          5412: -                      SUB("1");
        !          5413: -                      Fprint(2, "Warning; $%s expanded to 1\n", w);
        !          5414: -              }
        !          5415: -      }
        !          5416: -      if(copy){
        !          5417: -              *dest++ = '$';
        !          5418: -              *dest++ = '{';
        !          5419: -              for(q = w; q != s;)
        !          5420: -                      *dest++ = *q++;
        !          5421: -              *dest++ = '}';
        !          5422: -      }
        !          5423: -      *s = carry;
        !          5424: -      if(carry == '}')
        !          5425: -              s++;
        !          5426: -      *ww = s;
        !          5427: -      return(dest);
        !          5428: -}
        !          5429: -
        !          5430: -static
        !          5431: -recipepr(s, j)
        !          5432: -      char *s;
        !          5433: -      Job *j;
        !          5434: -{
        !          5435: -      char buf[BIGBLOCK];
        !          5436: -      register char *q = buf;
        !          5437: -
        !          5438: -      while(*s)
        !          5439: -              switch(*s)
        !          5440: -              {
        !          5441: -              case '\\':
        !          5442: -                      *q++ = *s++;
        !          5443: -                      *q++ = *s++;
        !          5444: -                      break;
        !          5445: -              case '$':
        !          5446: -                      q = vexpand(&s, q, j);
        !          5447: -                      break;
        !          5448: -              case '\n':
        !          5449: -                      *q = 0;
        !          5450: -                      Fprint(1, "\t%s\n", buf);
        !          5451: -                      q = buf;
        !          5452: -                      s++;
        !          5453: -                      break;
        !          5454: -              default:
        !          5455: -                      *q++ = *s++;
        !          5456: -                      break;
        !          5457: -              }
        !          5458: -      *q = 0;
        !          5459: -      if(q != buf)
        !          5460: -              Fprint(1, "\t%s\n", buf);
        !          5461: -}
        !          5462: -
        !          5463: -static void
        !          5464: -nd(s)
        !          5465: -      Symtab *s;
        !          5466: -{
        !          5467: -      Job *j = (Job *)s->value;
        !          5468: -      register Node *n = j->n;
        !          5469: -      Arc *a;
        !          5470: -      int i;
        !          5471: -      char *ss, *s, c;
        !          5472: -
        !          5473: -      if(strcmp(n->name, first) == 0){
        !          5474: -              if(didit)
        !          5475: -                      return;
        !          5476: -              didit = 1;
        !          5477: -      }
        !          5478: -      Fprint(1, "\n%s:", n->name);
        !          5479: -      fold(wtos(j->p), ' ');
        !          5480: -      Fputc(1, '\n');
        !          5481: -      recipepr(j->r->recipe, j);
        !          5482: -}
        !          5483: -
        !          5484: -makefile()
        !          5485: -{
        !          5486: -      symtraverse(S_MAKEVAR, vd);
        !          5487: -      didit = 0;
        !          5488: -      nd(symlook(first, S_MAKEFILE, (char *)0));
        !          5489: -      symtraverse(S_MAKEFILE, nd);
        !          5490: -}
        !          5491: //GO.SYSIN DD ./makefile.c
        !          5492: echo ./match.c 1>&2
        !          5493: sed 's/.//' >./match.c <<'//GO.SYSIN DD ./match.c'
        !          5494: -#include      "mk.h"
        !          5495: -
        !          5496: -mninlist(name, list, stem)
        !          5497: -      register char *name, *stem;
        !          5498: -      Word *list;
        !          5499: -{
        !          5500: -      for(; list; list = list->next){
        !          5501: -              if(match(name, list->s, stem))
        !          5502: -                      return(1);
        !          5503: -      }
        !          5504: -      return(0);
        !          5505: -}
        !          5506: -
        !          5507: -static
        !          5508: -isatomic(p)
        !          5509: -      char *p;
        !          5510: -{
        !          5511: -      while(*p){
        !          5512: -              if((*p == '.') || (*p == '/'))
        !          5513: -                      return(0);
        !          5514: -              p++;
        !          5515: -      }
        !          5516: -      return(1);
        !          5517: -}
        !          5518: -
        !          5519: -match(name, template, stem)
        !          5520: -      char *name, *template, *stem;
        !          5521: -{
        !          5522: -      register char *p, *q;
        !          5523: -      char *b;
        !          5524: -      char *ostem = stem;
        !          5525: -
        !          5526: -      for(p = name, q = template; *p && *q && !PERCENT(*q);)
        !          5527: -              if(*p++ != *q++) return(0);
        !          5528: -      if(!PERCENT(*q))
        !          5529: -              return(0);
        !          5530: -      b = p;
        !          5531: -      while(*p) p++;
        !          5532: -      while(*q) q++;
        !          5533: -      for(q--; !PERCENT(*q); q--)
        !          5534: -              if(*--p != *q) return(0);
        !          5535: -      while(b < p)
        !          5536: -              *stem++ = *b++;
        !          5537: -      *stem = 0;
        !          5538: -      if(*q == '&')
        !          5539: -              return(isatomic(ostem));
        !          5540: -      return(1);
        !          5541: -}
        !          5542: -
        !          5543: -subst(stem, template, dest)
        !          5544: -      register char *stem, *template, *dest;
        !          5545: -{
        !          5546: -      while(*template){
        !          5547: -              if(PERCENT(*template)){
        !          5548: -                      template++;
        !          5549: -                      while(*stem)
        !          5550: -                              *dest++ = *stem++;
        !          5551: -              } else
        !          5552: -                      *dest++ = *template++;
        !          5553: -      }
        !          5554: -      *dest = 0;
        !          5555: -}
        !          5556: //GO.SYSIN DD ./match.c
        !          5557: echo ./mk.c 1>&2
        !          5558: sed 's/.//' >./mk.c <<'//GO.SYSIN DD ./mk.c'
        !          5559: -#include      "mk.h"
        !          5560: -
        !          5561: -int runerrs;
        !          5562: -
        !          5563: -mk(target)
        !          5564: -      char *target;
        !          5565: -{
        !          5566: -      Node *node;
        !          5567: -      int did = 0;
        !          5568: -
        !          5569: -      nproc();                /* it can be updated dynamically */
        !          5570: -      nrep();                 /* it can be updated dynamically */
        !          5571: -      runerrs = 0;
        !          5572: -      if(mflag)
        !          5573: -              maketarget(target);
        !          5574: -      node = graph(target);
        !          5575: -      if(DEBUG(D_GRAPH)){
        !          5576: -              dumpn("new target\n", node);
        !          5577: -              Fflush(1);
        !          5578: -      }
        !          5579: -      clrmade(node);
        !          5580: -      while(node->flags&NOTMADE){
        !          5581: -              if(work(node, (Node *)0, (Arc *)0))
        !          5582: -                      did = 1;        /* found something to do */
        !          5583: -              else {
        !          5584: -                      if(waitup(1, (int *)0) > 0){
        !          5585: -                              if(node->flags&(NOTMADE|BEINGMADE)){
        !          5586: -                                      assert("must be run errors", runerrs);
        !          5587: -                                      break;  /* nothing more waiting */
        !          5588: -                              }
        !          5589: -                      }
        !          5590: -              }
        !          5591: -      }
        !          5592: -      if(node->flags&BEINGMADE)
        !          5593: -              waitup(-1, (int *)0);
        !          5594: -      while(jobs)
        !          5595: -              waitup(-2, (int *)0);
        !          5596: -      assert("target didn't get done", runerrs || (node->flags&MADE));
        !          5597: -      if(did == 0)
        !          5598: -              Fprint(1, "mk: '%s' is up to date\n", node->name);
        !          5599: -}
        !          5600: -
        !          5601: -clrmade(n)
        !          5602: -      register Node *n;
        !          5603: -{
        !          5604: -      register Arc *a;
        !          5605: -
        !          5606: -      n->flags &= ~(CANPRETEND|PRETENDING);
        !          5607: -      n->flags |= CANPRETEND;
        !          5608: -      MADESET(n, NOTMADE);
        !          5609: -      for(a = n->prereqs; a; a = a->next)
        !          5610: -              if(a->n)
        !          5611: -                      clrmade(a->n);
        !          5612: -}
        !          5613: -
        !          5614: -static void
        !          5615: -unpretend(n)
        !          5616: -      register Node *n;
        !          5617: -{
        !          5618: -      MADESET(n, NOTMADE);
        !          5619: -      n->flags &= ~(CANPRETEND|PRETENDING);
        !          5620: -      n->time = 0;
        !          5621: -}
        !          5622: -
        !          5623: -work(node, p, parc)
        !          5624: -      Node *node, *p;
        !          5625: -      Arc *parc;
        !          5626: -{
        !          5627: -      register Arc *a, *ra;
        !          5628: -      int weoutofdate;
        !          5629: -      int ready;
        !          5630: -      int did = 0;
        !          5631: -
        !          5632: -/*    print("work(%s) flags=0x%x time=%ld\n", node->name, node->flags, node->time);/**/
        !          5633: -      if(node->flags&BEINGMADE)
        !          5634: -              return(did);
        !          5635: -      if((node->flags&MADE) && (node->flags&PRETENDING) && p && outofdate(p, parc, 0)){
        !          5636: -              if(explain)
        !          5637: -                      fprint(1, "unpretending %s(%ld) because %s is out of date(%ld)\n",
        !          5638: -                              node->name, node->time, p->name, p->time);
        !          5639: -              unpretend(node);
        !          5640: -      }
        !          5641: -      /*
        !          5642: -              have a look if we are pretending in case
        !          5643: -              someone has been unpretended out from underneath us
        !          5644: -      */
        !          5645: -      if(node->flags&MADE){
        !          5646: -              if(node->flags&PRETENDING){
        !          5647: -                      node->time = 0;
        !          5648: -              }else
        !          5649: -                      return(did);
        !          5650: -      }
        !          5651: -      /* consider no prerequsite case */
        !          5652: -      if(node->prereqs == 0){
        !          5653: -              if(node->time == 0){
        !          5654: -                      Fprint(2, "mk: don't know how to make '%s'\n", node->name);
        !          5655: -                      if(kflag){
        !          5656: -                              node->flags |= BEINGMADE;
        !          5657: -                              runerrs++;
        !          5658: -                      } else
        !          5659: -                              Exit();
        !          5660: -              } else
        !          5661: -                      MADESET(node, MADE);
        !          5662: -              return(did);
        !          5663: -      }
        !          5664: -      /*
        !          5665: -              now see if we are out of date or what
        !          5666: -      */
        !          5667: -      ready = 1;
        !          5668: -      weoutofdate = aflag;
        !          5669: -      ra = 0;
        !          5670: -      for(a = node->prereqs; a; a = a->next)
        !          5671: -              if(a->n){
        !          5672: -                      did = work(a->n, node, a) || did;
        !          5673: -                      if(a->n->flags&(NOTMADE|BEINGMADE))
        !          5674: -                              ready = 0;
        !          5675: -                      if(outofdate(node, a, 0)){
        !          5676: -                              weoutofdate = 1;
        !          5677: -                              if((ra == 0) || (ra->n == 0)
        !          5678: -                                              || (ra->n->time < a->n->time))
        !          5679: -                                      ra = a;
        !          5680: -                      }
        !          5681: -              } else {
        !          5682: -                      if(node->time == 0){
        !          5683: -                              if(ra == 0)
        !          5684: -                                      ra = a;
        !          5685: -                              weoutofdate = 1;
        !          5686: -                      }
        !          5687: -              }
        !          5688: -      if(ready == 0)  /* can't do anything now */
        !          5689: -              return(did);
        !          5690: -      if(weoutofdate == 0){
        !          5691: -              MADESET(node, MADE);
        !          5692: -              return(did);
        !          5693: -      }
        !          5694: -      /*
        !          5695: -              can we pretend to be made?
        !          5696: -      */
        !          5697: -      if((iflag == 0) && (node->time == 0) && (node->flags&(PRETENDING|CANPRETEND)) && p && ra->n && !outofdate(p, ra, 0)){
        !          5698: -              node->flags &= ~CANPRETEND;
        !          5699: -              MADESET(node, MADE);
        !          5700: -              node->time = ra->n->time;
        !          5701: -              if(explain && ((node->flags&PRETENDING) == 0))
        !          5702: -                      fprint(1, "pretending %s has time %ld\n", node->name, node->time);
        !          5703: -              node->flags |= PRETENDING;
        !          5704: -              return(did);
        !          5705: -      }
        !          5706: -      /*
        !          5707: -              node is out of date and we REALLY do have to do something.
        !          5708: -              quickly rescan for pretenders
        !          5709: -      */
        !          5710: -      for(a = node->prereqs; a; a = a->next)
        !          5711: -              if(a->n && (a->n->flags&PRETENDING)){
        !          5712: -                      if(explain)
        !          5713: -                              Fprint(1, "unpretending %s because of %s because of %s\n",
        !          5714: -                              a->n->name, node->name, ra->n? ra->n->name : "rule with no prerequisites");
        !          5715: -
        !          5716: -                      unpretend(a->n);
        !          5717: -                      did = work(a->n, node, a) || did;
        !          5718: -                      ready = 0;
        !          5719: -              }
        !          5720: -      if(ready == 0)  /* try later unless nothing has happened for -k's sake */
        !          5721: -              return(did || work(node, p, parc));
        !          5722: -      did = dorecipe(node) || did;
        !          5723: -      return(did);
        !          5724: -}
        !          5725: -
        !          5726: -update(fake, node)
        !          5727: -      register Node *node;
        !          5728: -{
        !          5729: -      register Arc *a;
        !          5730: -
        !          5731: -      MADESET(node, fake? BEINGMADE : MADE);
        !          5732: -      if(((node->flags&VIRTUAL) == 0) && (access(node->name, 0) == 0)){
        !          5733: -              node->time = timeof(node->name, 1);
        !          5734: -              node->flags &= ~(CANPRETEND|PRETENDING);
        !          5735: -              for(a = node->prereqs; a; a = a->next)
        !          5736: -                      if(a->prog)
        !          5737: -                              (void)outofdate(node, a, 1);
        !          5738: -      } else {
        !          5739: -              node->time = 1;
        !          5740: -              for(a = node->prereqs; a; a = a->next)
        !          5741: -                      if(a->n && outofdate(node, a, 1))
        !          5742: -                              node->time = a->n->time;
        !          5743: -      }
        !          5744: -/*    print("----node %s time=%ld flags=0x%x\n", node->name, node->time, node->flags);/**/
        !          5745: -}
        !          5746: -
        !          5747: -static
        !          5748: -pcmp(prog, n1, n2)
        !          5749: -      char *prog, *n1, *n2;
        !          5750: -{
        !          5751: -      char buf[3*NAMEBLOCK];
        !          5752: -      int ret, pid;
        !          5753: -
        !          5754: -      pid = fork();
        !          5755: -      if(pid < 0){
        !          5756: -              fprint(2, "mk: ");
        !          5757: -              perror("pcmp fork");
        !          5758: -              Exit();
        !          5759: -      }
        !          5760: -      Fexit(0);
        !          5761: -      if(pid == 0){
        !          5762: -              sprint(buf, "%s '%s' '%s'", prog, n1, n2);
        !          5763: -              execl(SHELL, "sh", "-c", buf, (char *)0);
        !          5764: -              sprint(buf, "exec %s", SHELL);
        !          5765: -              perror(buf);
        !          5766: -              _exit(1);
        !          5767: -      } else {
        !          5768: -              while(waitup(-3, &pid) >= 0)
        !          5769: -                      ;
        !          5770: -              return(pid? 2:1);
        !          5771: -      }
        !          5772: -}
        !          5773: -
        !          5774: -
        !          5775: -outofdate(node, arc, eval)
        !          5776: -      register Node *node;
        !          5777: -      register Arc *arc;
        !          5778: -{
        !          5779: -      char buf[3*NAMEBLOCK], *str;
        !          5780: -      Symtab *sym;
        !          5781: -      int ret;
        !          5782: -
        !          5783: -      if(arc->prog){
        !          5784: -              sprint(buf, "%s%c%s", node->name, 0377, arc->n->name);
        !          5785: -              if(!(sym = symlook(buf, S_OUTOFDATE, (char *)0)) || eval){
        !          5786: -                      if(!sym)
        !          5787: -                              str = strdup(buf);
        !          5788: -                      ret = pcmp(arc->prog, node->name, arc->n->name);
        !          5789: -                      if(sym)
        !          5790: -                              sym->value = (char *)ret;
        !          5791: -                      else
        !          5792: -                              symlook(str, S_OUTOFDATE, (char *)ret);
        !          5793: -              } else
        !          5794: -                      ret = (int)sym->value;
        !          5795: -              return(ret-1);
        !          5796: -      } else
        !          5797: -              return(node->time < arc->n->time);
        !          5798: -}
        !          5799: -
        !          5800: //GO.SYSIN DD ./mk.c
        !          5801: echo ./mk.h 1>&2
        !          5802: sed 's/.//' >./mk.h <<'//GO.SYSIN DD ./mk.h'
        !          5803: -#include      "libc.h"
        !          5804: -#include      "fio.h"
        !          5805: -#include      "regexp.h"
        !          5806: -
        !          5807: -typedef struct Word
        !          5808: -{
        !          5809: -      char *s;
        !          5810: -      struct Word *next;
        !          5811: -} Word;
        !          5812: -extern Word *newword(), *expand(), *wsubst(), *stow();
        !          5813: -
        !          5814: -typedef struct Rule
        !          5815: -{
        !          5816: -      char *target;           /* one target */
        !          5817: -      Word *tail;             /* constituents of targets */
        !          5818: -      char *recipe;           /* do it ! */
        !          5819: -      short attr;             /* attributes */
        !          5820: -      short line;             /* source line */
        !          5821: -      char *file;             /* source file */
        !          5822: -      Word *alltargets;       /* all the targets */
        !          5823: -      int rule;               /* rule number */
        !          5824: -      regexp *pat;            /* reg exp goo */
        !          5825: -      char *prog;             /* to use in out of date */
        !          5826: -      struct Rule *chain;     /* hashed per target */
        !          5827: -      struct Rule *next;
        !          5828: -} Rule;
        !          5829: -extern Rule *rules, *metarules, *patrule;
        !          5830: -
        !          5831: -#define               META            0x0001
        !          5832: -#define               SEQ             0x0002
        !          5833: -#define               UPD             0x0004
        !          5834: -#define               RED             0x0008
        !          5835: -#define               QUIET           0x0010
        !          5836: -#define               VIR             0x0020
        !          5837: -#define               REGEXP          0x0040
        !          5838: -#define               NOREC           0x0080
        !          5839: -#define               DEL             0x0100
        !          5840: -
        !          5841: -#define               NREGEXP         10
        !          5842: -
        !          5843: -typedef struct Arc
        !          5844: -{
        !          5845: -      short flag;
        !          5846: -      struct Node *n;
        !          5847: -      Rule *r;
        !          5848: -      char *stem;
        !          5849: -      char *prog;
        !          5850: -      regsubexp match[NREGEXP];
        !          5851: -      struct Arc *next;
        !          5852: -} Arc;
        !          5853: -extern Arc *newarc();
        !          5854: -#define               TOGO            1
        !          5855: -
        !          5856: -typedef struct Node
        !          5857: -{
        !          5858: -      char *name;
        !          5859: -      long time;
        !          5860: -      unsigned short flags;
        !          5861: -      Arc *prereqs;
        !          5862: -      struct Node *next;      /* list for a rule */
        !          5863: -} Node;
        !          5864: -extern Node *graph();
        !          5865: -#define               VIRTUAL         0x0001
        !          5866: -#define               CYCLE           0x0002
        !          5867: -#define               READY           0x0004
        !          5868: -#define               CANPRETEND      0x0008
        !          5869: -#define               PRETENDING      0x0010
        !          5870: -#define               NOTMADE         0x0020
        !          5871: -#define               BEINGMADE       0x0040
        !          5872: -#define               MADE            0x0080
        !          5873: -#define               MADESET(n,m)    n->flags = (n->flags&~(NOTMADE|BEINGMADE|MADE))|(m)
        !          5874: -#define               PROBABLE        0x0100
        !          5875: -#define               VACUOUS         0x0200
        !          5876: -#define               NORECIPE        0x0400
        !          5877: -#define               DELETE          0x0800
        !          5878: -
        !          5879: -typedef struct Job
        !          5880: -{
        !          5881: -      Rule *r;                /* master rule for job */
        !          5882: -      Node *n;                /* list of node targets */
        !          5883: -      char *stem;
        !          5884: -      regsubexp *match;
        !          5885: -      Word *p;                /* prerequisites */
        !          5886: -      Word *np;               /* new prerequisites */
        !          5887: -      Word *t;                /* targets */
        !          5888: -      Word *at;               /* all targets */
        !          5889: -      int nproc;              /* slot number */
        !          5890: -      int fd;                 /* if redirecting */
        !          5891: -      struct Job *next;
        !          5892: -} Job;
        !          5893: -extern Job *newjob(), *jobs;
        !          5894: -
        !          5895: -typedef struct Symtab
        !          5896: -{
        !          5897: -      short space;
        !          5898: -      char *name;
        !          5899: -      char *value;
        !          5900: -      struct Symtab *next;
        !          5901: -} Symtab;
        !          5902: -extern Symtab *symlook();
        !          5903: -enum {
        !          5904: -      S_VAR,          /* variable -> value */
        !          5905: -      S_TARGET,       /* target -> rule */
        !          5906: -      S_TIME,         /* file -> time */
        !          5907: -      S_PID,          /* pid -> products */
        !          5908: -      S_NODE,         /* target name -> node */
        !          5909: -      S_AGG,          /* aggregate -> time */
        !          5910: -      S_BITCH,        /* bitched about aggregate not there */
        !          5911: -      S_NOEXPORT,     /* var -> noexport */
        !          5912: -      S_OVERRIDE,     /* can't override */
        !          5913: -      S_OUTOFDATE,    /* n1\377n2 -> 2(outofdate) or 1(not outofdate) */
        !          5914: -      S_MAKEFILE,     /* target -> node */
        !          5915: -      S_MAKEVAR,      /* dumpable mk variable */
        !          5916: -};
        !          5917: -
        !          5918: -extern int debug;
        !          5919: -extern int nflag, tflag, iflag, kflag, aflag, mflag;
        !          5920: -extern int inline;
        !          5921: -extern char *infile;
        !          5922: -extern char *Malloc(), *strndup();
        !          5923: -extern long timeof();
        !          5924: -extern void touch(), delete();
        !          5925: -extern char *shname(), *vexpand();
        !          5926: -extern int nproclimit;
        !          5927: -extern int nreps;
        !          5928: -extern char *explain;
        !          5929: -extern char *envpr(), *wtos();
        !          5930: -extern char *rulecnt();
        !          5931: -
        !          5932: -#define       SYNERR(l)       (Fprint(2, "mk: %s:%d: syntax error; ", infile, (((l)>=0)?(l):inline)))
        !          5933: -#define       RERR(r) (Fprint(2, "mk: %s:%d: rule error; ", (r)->file, (r)->line))
        !          5934: -#define       NAMEBLOCK       1000
        !          5935: -#define       BIGBLOCK        20000
        !          5936: -
        !          5937: -#ifndef       SHELL
        !          5938: -#define       SHELL           "/bin/sh"               /* should be bourne-like */
        !          5939: -#endif
        !          5940: -
        !          5941: -#define       SEP(c)  (((c)==' ')||((c)=='\t')||((c)=='\n'))
        !          5942: -
        !          5943: -#define       DEBUG(x)        (debug&(x))
        !          5944: -#define               D_PARSE         0x01
        !          5945: -#define               D_GRAPH         0x02
        !          5946: -#define               D_EXEC          0x04
        !          5947: -
        !          5948: -#define               EBIT            0x80    /* sorry japan */
        !          5949: -
        !          5950: -#define       PERCENT(ch)     (((ch) == '%') || ((ch) == '&'))
        !          5951: //GO.SYSIN DD ./mk.h
        !          5952: echo ./parse.c 1>&2
        !          5953: sed 's/.//' >./parse.c <<'//GO.SYSIN DD ./parse.c'
        !          5954: -#include      "mk.h"
        !          5955: -
        !          5956: -char *infile;
        !          5957: -int inline;
        !          5958: -static longline();
        !          5959: -extern Word *target1;
        !          5960: -
        !          5961: -parse(f, fd, varoverride, ruleoverride)
        !          5962: -      char *f;
        !          5963: -{
        !          5964: -      int hline;
        !          5965: -      char *s, *body;
        !          5966: -      Word *head, *tail;
        !          5967: -      int attr, set;
        !          5968: -      char *prog, *inc;
        !          5969: -
        !          5970: -      if(fd < 0){
        !          5971: -              perror(f);
        !          5972: -              Exit();
        !          5973: -      }
        !          5974: -      ipush();
        !          5975: -      infile = strdup(f);
        !          5976: -      inline = 1;
        !          5977: -      Finit(fd, (char *)0);
        !          5978: -      while(s = Frdline(fd)){
        !          5979: -              if((*s == '#') || (*s == 0)){
        !          5980: -                      inline++;
        !          5981: -                      continue;
        !          5982: -              }
        !          5983: -              hline = inline;
        !          5984: -              switch(rhead(s, fd, &head, &tail, &attr, &prog))
        !          5985: -              {
        !          5986: -              case '<':
        !          5987: -                      if((tail == 0) || ((inc = wtos(tail)) == 0)){
        !          5988: -                              SYNERR(-1);
        !          5989: -                              Fprint(2, "missing include file name\n");
        !          5990: -                              Exit();
        !          5991: -                      }
        !          5992: -                      parse(inc, open(inc, 0), 0, 1);
        !          5993: -                      break;
        !          5994: -              case ':':
        !          5995: -                      rbody(fd, &body);
        !          5996: -                      addrules(head, tail, body, attr, hline, ruleoverride, prog);
        !          5997: -                      break;
        !          5998: -              case '=':
        !          5999: -                      if(head->next){
        !          6000: -                              SYNERR(-1);
        !          6001: -                              Fprint(2, "multiple vars on left side of assignment\n");
        !          6002: -                              Exit();
        !          6003: -                      }
        !          6004: -                      if(symlook(head->s, S_OVERRIDE, (char *)0)){
        !          6005: -                              set = varoverride;
        !          6006: -                              symdel(head->s, S_OVERRIDE);
        !          6007: -                      } else {
        !          6008: -                              set = 1;
        !          6009: -                              if(varoverride)
        !          6010: -                                      symlook(head->s, S_OVERRIDE, "");
        !          6011: -                      }
        !          6012: -                      if(set)
        !          6013: -                              setvar(head->s, wtos(tail));
        !          6014: -                      if(attr)
        !          6015: -                              (void)symlook(head->s, S_NOEXPORT, "");
        !          6016: -                      break;
        !          6017: -              default:
        !          6018: -                      SYNERR(hline);
        !          6019: -                      Fprint(2, "expected : or =\n");
        !          6020: -                      Exit();
        !          6021: -                      break;
        !          6022: -              }
        !          6023: -      }
        !          6024: -      close(fd);
        !          6025: -      ipop();
        !          6026: -}
        !          6027: -
        !          6028: -addrules(head, tail, body, attr, hline, override, prog)
        !          6029: -      Word *head, *tail;
        !          6030: -      char *body, *prog;
        !          6031: -{
        !          6032: -      register Word *w;
        !          6033: -
        !          6034: -      assert("addrules args", head && body);
        !          6035: -      if((target1 == 0) && !(attr&REGEXP))
        !          6036: -              frule(head);
        !          6037: -      for(w = head; w; w = w->next)
        !          6038: -              addrule(w->s, tail, body, head, attr, hline, override, prog);
        !          6039: -}
        !          6040: -
        !          6041: -rhead(s, fd, h, t, attr, prog)
        !          6042: -      char *s;
        !          6043: -      Word **h, **t;
        !          6044: -      int *attr;
        !          6045: -      char **prog;
        !          6046: -{
        !          6047: -      char buf[BIGBLOCK];
        !          6048: -      register char *p;
        !          6049: -      char *pp;
        !          6050: -      int sep;
        !          6051: -
        !          6052: -      longline(fd, s, buf);           /* cover \\n guys */
        !          6053: -      lex(fd, buf);
        !          6054: -      if(p = strchr(buf, '#'))        /* comment ? */
        !          6055: -              *p = 0;
        !          6056: -      for(p = buf; *p; p++)
        !          6057: -              if((*p == ':') || (*p == '=') || (*p == '<')) break;
        !          6058: -      if(*p == 0){
        !          6059: -              return('?');
        !          6060: -      }
        !          6061: -      sep = *p;
        !          6062: -      *p++ = 0;
        !          6063: -      *attr = 0;
        !          6064: -      *prog = 0;
        !          6065: -      if(sep == '='){
        !          6066: -              char *le, *e;
        !          6067: -
        !          6068: -              le = strchr(p, ' ');
        !          6069: -              if(e = strchr(p, '\t'))
        !          6070: -                      if((le == 0) || (e < le))
        !          6071: -                              le = e;
        !          6072: -              if((e = strchr(p, '=')) && ((le == 0) || (e < le))){
        !          6073: -                      while(*p != '='){
        !          6074: -                              switch(*p++)
        !          6075: -                              {
        !          6076: -                              case 0:
        !          6077: -                                      SYNERR(-1);
        !          6078: -                                      Fprint(2, "missing trailing =\n");
        !          6079: -                                      Exit();
        !          6080: -                              default:
        !          6081: -                                      SYNERR(-1);
        !          6082: -                                      Fprint(2, "unknown attribute '%c'\n", p[-1]);
        !          6083: -                                      Exit();
        !          6084: -                              case 'U':
        !          6085: -                                      *attr = 1;
        !          6086: -                                      break;
        !          6087: -                              }
        !          6088: -                      }
        !          6089: -                      p++;
        !          6090: -              }
        !          6091: -      }
        !          6092: -      if((sep == ':') && *p && (*p != ' ') && (*p != '\t')){
        !          6093: -              while(*p != ':')
        !          6094: -                      switch(*p++)
        !          6095: -                      {
        !          6096: -                      case 0:
        !          6097: -              eos:
        !          6098: -                              SYNERR(-1);
        !          6099: -                              Fprint(2, "missing trailing :\n");
        !          6100: -                              Exit();
        !          6101: -                      default:
        !          6102: -                              SYNERR(-1);
        !          6103: -                              Fprint(2, "unknown attribute '%c'\n", p[-1]);
        !          6104: -                              Exit();
        !          6105: -                      case '<':
        !          6106: -                              *attr |= RED;
        !          6107: -                              break;
        !          6108: -                      case 'D':
        !          6109: -                              *attr |= DEL;
        !          6110: -                              break;
        !          6111: -                      case 'N':
        !          6112: -                              *attr |= NOREC;
        !          6113: -                              break;
        !          6114: -                      case 'P':
        !          6115: -                              pp = p;
        !          6116: -                              while(*p && (*p != ':'))
        !          6117: -                                      p++;
        !          6118: -                              if(*p == 0)
        !          6119: -                                      goto eos;
        !          6120: -                              *p = 0;
        !          6121: -                              *prog = strdup(pp);
        !          6122: -                              *p = ':';
        !          6123: -                              break;
        !          6124: -                      case 'Q':
        !          6125: -                              *attr |= QUIET;
        !          6126: -                              break;
        !          6127: -                      case 'R':
        !          6128: -                              *attr |= REGEXP;
        !          6129: -                              break;
        !          6130: -                      case 'U':
        !          6131: -                              *attr |= UPD;
        !          6132: -                              break;
        !          6133: -                      case 'V':
        !          6134: -                              *attr |= VIR;
        !          6135: -                              break;
        !          6136: -                      }
        !          6137: -              p++;
        !          6138: -      }
        !          6139: -      *h = expand(buf);
        !          6140: -      if((*h == 0) && (sep != '<')){
        !          6141: -              SYNERR(inline-1);
        !          6142: -              Fprint(2, "no var on left side of assignment/rule\n");
        !          6143: -              Exit();
        !          6144: -      }
        !          6145: -      while((*p == ' ') || (*p == '\t'))
        !          6146: -              p++;
        !          6147: -      *t = expand(p);
        !          6148: -      return(sep);
        !          6149: -}
        !          6150: -
        !          6151: -rbody(fd, b)
        !          6152: -      char **b;
        !          6153: -{
        !          6154: -      char buf[BIGBLOCK];
        !          6155: -      char *cp, *s;
        !          6156: -      register n;
        !          6157: -
        !          6158: -      cp = buf;
        !          6159: -      while(s = Frdline(fd)){
        !          6160: -              inline++;
        !          6161: -              if((*s != '\t') && (*s != ' ')){
        !          6162: -                      inline--;
        !          6163: -                      Fundo(fd);
        !          6164: -                      break;
        !          6165: -              }
        !          6166: -              memcpy(cp, s+1, n = FIOLINELEN(fd)-1);
        !          6167: -              cp += n;
        !          6168: -              *cp++ = '\n';
        !          6169: -      }
        !          6170: -      *cp++ = 0;
        !          6171: -      assert("rbody overflow", cp <= &buf[BIGBLOCK]);
        !          6172: -      *b = (buf[0])? strndup(buf, (int)(cp-buf)) : strdup("");
        !          6173: -}
        !          6174: -
        !          6175: -static
        !          6176: -longline(fd, line, dest)
        !          6177: -      register char *line, *dest;
        !          6178: -{
        !          6179: -      for(;;){
        !          6180: -              inline++;
        !          6181: -              while(*dest++ = *line++);
        !          6182: -              dest -= 2;
        !          6183: -              if(*dest == '\\'){
        !          6184: -                      *dest = 0;
        !          6185: -                      if((line = Frdline(fd)) == 0){
        !          6186: -                              Fundo(fd);
        !          6187: -                              break;
        !          6188: -                      }
        !          6189: -              } else
        !          6190: -                      break;
        !          6191: -      }
        !          6192: -}
        !          6193: -
        !          6194: -struct input
        !          6195: -{
        !          6196: -      char *file;
        !          6197: -      int line;
        !          6198: -      struct input *next;
        !          6199: -};
        !          6200: -static struct input *inputs = 0;
        !          6201: -
        !          6202: -ipush()
        !          6203: -{
        !          6204: -      register struct input *in, *me;
        !          6205: -
        !          6206: -      me = (struct input *)Malloc(sizeof(*me));
        !          6207: -      me->file = infile;
        !          6208: -      me->line = inline;
        !          6209: -      me->next = 0;
        !          6210: -      if(inputs == 0)
        !          6211: -              inputs = me;
        !          6212: -      else {
        !          6213: -              for(in = inputs; in->next; )
        !          6214: -                      in = in->next;
        !          6215: -              in->next = me;
        !          6216: -      }
        !          6217: -}
        !          6218: -
        !          6219: -ipop()
        !          6220: -{
        !          6221: -      register struct input *in, *me;
        !          6222: -
        !          6223: -      assert("pop input list", inputs != 0);
        !          6224: -      if(inputs->next == 0){
        !          6225: -              me = inputs;
        !          6226: -              inputs = 0;
        !          6227: -      } else {
        !          6228: -              for(in = inputs; in->next->next; )
        !          6229: -                      in = in->next;
        !          6230: -              me = in->next;
        !          6231: -              in->next = 0;
        !          6232: -      }
        !          6233: -      infile = me->file;
        !          6234: -      inline = me->line;
        !          6235: -      free((char *)me);
        !          6236: -}
        !          6237: //GO.SYSIN DD ./parse.c
        !          6238: echo ./quote.c 1>&2
        !          6239: sed 's/.//' >./quote.c <<'//GO.SYSIN DD ./quote.c'
        !          6240: -#include      "mk.h"
        !          6241: -
        !          6242: -/*
        !          6243: -      quoted stuff gets EBIT
        !          6244: -*/
        !          6245: -
        !          6246: -static
        !          6247: -squote(fd, srcp, destp)
        !          6248: -      char **srcp, **destp;
        !          6249: -{
        !          6250: -      register char *src = *srcp, *dest = *destp;
        !          6251: -
        !          6252: -      while(*src != '\''){
        !          6253: -              if(*src == 0){
        !          6254: -                      char *s;
        !          6255: -
        !          6256: -                      if(s = Frdline(fd)){
        !          6257: -                              inline++;
        !          6258: -                              *dest++ = '\n'|EBIT;
        !          6259: -                              strcpy(src, s);
        !          6260: -                              continue;
        !          6261: -                      } else {
        !          6262: -                              SYNERR(-1); Fprint(2, "missing closing '\n");
        !          6263: -                              break;
        !          6264: -                      }
        !          6265: -              }
        !          6266: -              *dest++ = *src++|EBIT;
        !          6267: -      }
        !          6268: -      *dest = 0;
        !          6269: -      if(*src)
        !          6270: -              src++;
        !          6271: -      *srcp = src;
        !          6272: -      *destp = dest;
        !          6273: -}
        !          6274: -
        !          6275: -static
        !          6276: -dquote(fd, src, dest)
        !          6277: -      char **src, **dest;
        !          6278: -{
        !          6279: -      char *p = *src, *s = *dest;
        !          6280: -      char *t, carry;
        !          6281: -      Symtab *sym;
        !          6282: -
        !          6283: -      while(*p != '"'){
        !          6284: -              switch(*p)
        !          6285: -              {
        !          6286: -              case 0:
        !          6287: -                      if(t = Frdline(fd)){
        !          6288: -                              inline++;
        !          6289: -                              *s++ = '\n'|EBIT;
        !          6290: -                              strcpy(p, t);
        !          6291: -                              continue;
        !          6292: -                      } else {
        !          6293: -                              SYNERR(-1); Fprint(2, "missing closing \"\n");
        !          6294: -                              break;
        !          6295: -                      }
        !          6296: -                      break;
        !          6297: -              case '\\':
        !          6298: -                      switch(*++p)
        !          6299: -                      {
        !          6300: -                      default:
        !          6301: -                              *s++ = '\\'|EBIT;
        !          6302: -                      case '\\': case '"':
        !          6303: -                      case '\'': case '$':
        !          6304: -                              *s++ = *p|EBIT;
        !          6305: -                      }
        !          6306: -                      p++;
        !          6307: -                      break;
        !          6308: -              case '$':
        !          6309: -                      varsub(&p, &s, EBIT);
        !          6310: -                      break;
        !          6311: -              default:
        !          6312: -                      *s++ = *p++|EBIT;
        !          6313: -              }
        !          6314: -      }
        !          6315: -      *s = 0;
        !          6316: -      if(*p)
        !          6317: -              p++;
        !          6318: -      *src = p;
        !          6319: -      *dest = s;
        !          6320: -}
        !          6321: -
        !          6322: -quote1(fd, src, dest)
        !          6323: -      char *src, *dest;
        !          6324: -{
        !          6325: -      char *t;
        !          6326: -
        !          6327: -      while(*src){
        !          6328: -              switch(*src)
        !          6329: -              {
        !          6330: -              case '\'':
        !          6331: -                      src++;
        !          6332: -                      squote(fd, &src, &dest);
        !          6333: -                      break;
        !          6334: -              case '\\':
        !          6335: -                      if(src[1]){
        !          6336: -                              *dest++ = *++src | EBIT;
        !          6337: -                              src++;
        !          6338: -                      } else if(t = Frdline(fd)){
        !          6339: -                              inline++;
        !          6340: -                              strcpy(src, t);
        !          6341: -                      }
        !          6342: -                      break;
        !          6343: -              default:
        !          6344: -                      *dest++ = *src++;
        !          6345: -              }
        !          6346: -      }
        !          6347: -      *dest = 0;
        !          6348: -}
        !          6349: -
        !          6350: -quote2(fd, src, dest)
        !          6351: -      char *src, *dest;
        !          6352: -{
        !          6353: -      char *t;
        !          6354: -
        !          6355: -      while(*src){
        !          6356: -              switch(*src)
        !          6357: -              {
        !          6358: -              case '"':
        !          6359: -                      src++;
        !          6360: -                      dquote(fd, &src, &dest);
        !          6361: -                      break;
        !          6362: -              case '\\':
        !          6363: -                      if(src[1]){
        !          6364: -                              *dest++ = *++src;
        !          6365: -                              src++;
        !          6366: -                      } else if(t = Frdline(fd)){
        !          6367: -                              inline++;
        !          6368: -                              strcpy(src, t);
        !          6369: -                      }
        !          6370: -                      break;
        !          6371: -              case '$':
        !          6372: -                      varsub(&src, &dest, 0);
        !          6373: -                      break;
        !          6374: -              default:
        !          6375: -                      *dest++ = *src++;
        !          6376: -              }
        !          6377: -      }
        !          6378: -      *dest = 0;
        !          6379: -}
        !          6380: -
        !          6381: -static char *
        !          6382: -subsub(val, ext, dest, bit)
        !          6383: -      char *val, *ext, *dest;
        !          6384: -{
        !          6385: -      register char *s;
        !          6386: -      char *a, *b, *c, *d;
        !          6387: -      int na, nb, nc, nd, n;
        !          6388: -      int destsub = 0;
        !          6389: -
        !          6390: -      /* prepare literals */
        !          6391: -      a = s = ext;
        !          6392: -      for(; *s && (*s != '=') && !PERCENT(*s); s++)
        !          6393: -              ;
        !          6394: -      na = s-a;
        !          6395: -      if(PERCENT(*s)) s++;
        !          6396: -      b = s;
        !          6397: -      for(; *s && (*s != '='); s++)
        !          6398: -              ;
        !          6399: -      nb = s-b;
        !          6400: -      if(*s == '=') s++;
        !          6401: -      c = s;
        !          6402: -      for(; *s && !PERCENT(*s); s++)
        !          6403: -              ;
        !          6404: -      nc = s-c;
        !          6405: -      if(PERCENT(*s)) s++, destsub = 1;
        !          6406: -      d = s;
        !          6407: -      for(; *s; s++)
        !          6408: -              ;
        !          6409: -      nd = s-d;
        !          6410: -      /* break into words, do sub */
        !          6411: -      while(*val){
        !          6412: -              for(s = val; *s && !SEP(*s); s++)
        !          6413: -                      ;
        !          6414: -              /* substitute in val..s */
        !          6415: -              if((memcmp(val, a, na) == 0) && (memcmp(s-nb, b, nb) == 0)){
        !          6416: -#define       DEST(s,n)       if(n) memcpy(dest,s,n), dest += n
        !          6417: -                      DEST(c, nc);
        !          6418: -                      n = (s-nb) - (val+na);
        !          6419: -                      if(destsub)
        !          6420: -                              DEST(val+na, n);
        !          6421: -                      DEST(d, nd);
        !          6422: -              } else
        !          6423: -                      while(val < s)
        !          6424: -                              *dest++ = (*val++&~EBIT)|bit;
        !          6425: -              /* clean up */
        !          6426: -              while(*s && SEP(*s))
        !          6427: -                      *dest++ = (*s++&~EBIT)|bit;
        !          6428: -              val = s;
        !          6429: -      }
        !          6430: -      return(dest);
        !          6431: -}
        !          6432: -
        !          6433: -varsub(psrc, pdest, bit)
        !          6434: -      char **psrc, **pdest;
        !          6435: -{
        !          6436: -      char *t, carry;
        !          6437: -      Symtab *sym;
        !          6438: -      char *src = *psrc, *dest = *pdest;
        !          6439: -      char *v = 0, vc;
        !          6440: -
        !          6441: -      if(*++src == '{'){
        !          6442: -              for(t = ++src; *src != '}'; src++)
        !          6443: -                      if(*src == 0){
        !          6444: -                              SYNERR(-1);
        !          6445: -                              Fprint(2, "missing '}'\n");
        !          6446: -                              Exit();
        !          6447: -                      }
        !          6448: -              v = shname(t);
        !          6449: -              if(src == v)
        !          6450: -                      v = 0;
        !          6451: -              else {
        !          6452: -                      if(*v != ':'){
        !          6453: -                              SYNERR(-1);
        !          6454: -                              Fprint(2, "bad variable name\n");
        !          6455: -                              Exit();
        !          6456: -                      }
        !          6457: -                      vc = *v;
        !          6458: -                      *v = 0;
        !          6459: -              }
        !          6460: -              *src++ = carry = 0;
        !          6461: -      } else {
        !          6462: -              src = shname(t = src);
        !          6463: -              carry = *src;
        !          6464: -              *src = 0;
        !          6465: -      }
        !          6466: -      if(sym = symlook(t, S_VAR, (char *)0)){
        !          6467: -              if(v){
        !          6468: -char buf[BIGBLOCK]; strcpy(buf, v+1); lex(-1, buf);
        !          6469: -                      dest = subsub(sym->value, buf, dest, bit);
        !          6470: -                      *v = vc;
        !          6471: -              } else
        !          6472: -                      for(t = sym->value; *t; )
        !          6473: -                              *dest++ = *t++|bit;
        !          6474: -      }
        !          6475: -      if(carry)
        !          6476: -              *src = carry;
        !          6477: -      *psrc = src;
        !          6478: -      *pdest = dest;
        !          6479: -}
        !          6480: //GO.SYSIN DD ./quote.c
        !          6481: echo ./recipe.c 1>&2
        !          6482: sed 's/.//' >./recipe.c <<'//GO.SYSIN DD ./recipe.c'
        !          6483: -#include      "mk.h"
        !          6484: -
        !          6485: -dorecipe(node)
        !          6486: -      Node *node;
        !          6487: -{
        !          6488: -      char buf[BIGBLOCK];
        !          6489: -      register Node *n;
        !          6490: -      Rule *r = 0;
        !          6491: -      Arc *a, *aa;
        !          6492: -      Word head, ahead, lp, ln, *w, *ww, *aw;
        !          6493: -      Symtab *s;
        !          6494: -      int did = 0;
        !          6495: -      regexp rmatch[NREGEXP];
        !          6496: -
        !          6497: -      /*
        !          6498: -              pick up the rule
        !          6499: -      */
        !          6500: -      for(a = node->prereqs; a; a = a->next)
        !          6501: -              if(*a->r->recipe)
        !          6502: -                      r = (aa = a)->r;
        !          6503: -      /*
        !          6504: -              no recipe? go to buggery!
        !          6505: -      */
        !          6506: -      if(r == 0){
        !          6507: -              if(!(node->flags&VIRTUAL) && !(node->flags&NORECIPE)){
        !          6508: -                      Fprint(2, "mk: no recipe to make '%s'\n", node->name);
        !          6509: -                      Exit();
        !          6510: -              }
        !          6511: -              update(0, node);
        !          6512: -              if(tflag){
        !          6513: -                      if(!(node->flags&VIRTUAL))
        !          6514: -                              touch(node->name);
        !          6515: -                      else if(explain)
        !          6516: -                              Fprint(1, "no touch of virtual '%s'\n", node->name);
        !          6517: -              }
        !          6518: -              return(did);
        !          6519: -      }
        !          6520: -      /*
        !          6521: -              build the node list
        !          6522: -      */
        !          6523: -      node->next = 0;
        !          6524: -      head.next = 0;
        !          6525: -      ww = &head;
        !          6526: -      ahead.next = 0;
        !          6527: -      aw = &ahead;
        !          6528: -      if(r->attr&REGEXP){
        !          6529: -              ww->next = newword(node->name);
        !          6530: -              aw->next = newword(node->name);
        !          6531: -      } else {
        !          6532: -              for(w = r->alltargets; w; w = w->next){
        !          6533: -                      if(r->attr&META)
        !          6534: -                              subst(aa->stem, w->s, buf);
        !          6535: -                      else
        !          6536: -                              strcpy(buf, w->s);
        !          6537: -                      aw->next = newword(buf);
        !          6538: -                      aw = aw->next;
        !          6539: -                      if((s = symlook(buf, S_NODE, (char *)0)) == 0)
        !          6540: -                              continue;       /* not a node we are interested in */
        !          6541: -                      n = (Node *)s->value;
        !          6542: -                      ww->next = newword(buf);
        !          6543: -                      ww = ww->next;
        !          6544: -                      if(n == node) continue;
        !          6545: -                      n->next = node->next;
        !          6546: -                      node->next = n;
        !          6547: -              }
        !          6548: -      }
        !          6549: -      for(n = node; n; n = n->next)
        !          6550: -              if((n->flags&READY) == 0)
        !          6551: -                      return(did);
        !          6552: -      /*
        !          6553: -              gather the params for the job
        !          6554: -      */
        !          6555: -      lp.next = ln.next = 0;
        !          6556: -      for(n = node; n; n = n->next){
        !          6557: -              for(a = n->prereqs; a; a = a->next){
        !          6558: -                      if(a->n){
        !          6559: -                              addw(&lp, a->n->name);
        !          6560: -                              if(outofdate(n, a, 0)){
        !          6561: -                                      addw(&ln, a->n->name);
        !          6562: -                                      if(explain)
        !          6563: -                                              fprint(1, "%s(%ld) < %s(%ld)\n",
        !          6564: -                                                      n->name, n->time, a->n->name, a->n->time);
        !          6565: -                              }
        !          6566: -                      } else {
        !          6567: -                              if(explain)
        !          6568: -                                      fprint(1, "%s has no prerequisites\n",
        !          6569: -                                                      n->name);
        !          6570: -                      }
        !          6571: -              }
        !          6572: -              MADESET(n, BEINGMADE);
        !          6573: -      }
        !          6574: -/*    print("lt=%s ln=%s lp=%s\n",wtos(head.next),wtos(ln.next),wtos(lp.next));/**/
        !          6575: -      run(newjob(r, node, aa->stem, aa->match, lp.next, ln.next, head.next, ahead.next));
        !          6576: -      return(1);
        !          6577: -}
        !          6578: -
        !          6579: -addw(w, s)
        !          6580: -      register Word *w;
        !          6581: -      char *s;
        !          6582: -{
        !          6583: -      register Word *lw;
        !          6584: -
        !          6585: -      for(lw = w; w = w->next; lw = w){
        !          6586: -              if(strcmp(s, w->s) == 0)
        !          6587: -                      return;
        !          6588: -      }
        !          6589: -      lw->next = newword(s);
        !          6590: -}
        !          6591: //GO.SYSIN DD ./recipe.c
        !          6592: echo ./regexp.c 1>&2
        !          6593: sed 's/.//' >./regexp.c <<'//GO.SYSIN DD ./regexp.c'
        !          6594: -#include      "mk.h"
        !          6595: -
        !          6596: -Rule *patrule;
        !          6597: -
        !          6598: -regerror(s)
        !          6599: -      char *s;
        !          6600: -{
        !          6601: -      if(patrule)
        !          6602: -              Fprint(2, "mk: %s:%d: regular expression error; %s\n",
        !          6603: -                      patrule->file, patrule->line, s);
        !          6604: -      else
        !          6605: -              Fprint(2, "mk: %s:%d: regular expression error; %s\n",
        !          6606: -                      infile, inline, s);
        !          6607: -      Exit();
        !          6608: -}
        !          6609: -
        !          6610: -rsub(src, r, a, proto, dest)
        !          6611: -      char *src, *dest, *proto;
        !          6612: -      Rule *r;
        !          6613: -      Arc *a;
        !          6614: -{
        !          6615: -      rdump("rsub", a->match);
        !          6616: -      print("rsub(src=%d '%s' proto=%d '%s')\n", src, src, proto, proto);
        !          6617: -      *dest = 0;
        !          6618: -}
        !          6619: -
        !          6620: -rdump(s, m)
        !          6621: -      char *s;
        !          6622: -      register regsubexp *m;
        !          6623: -{
        !          6624: -      register i;
        !          6625: -
        !          6626: -      print("rdump: %s\n", s);
        !          6627: -      for(i = 0; i < NREGEXP; i++, m++)
        !          6628: -              print("\t%d: %d - %d '%s'\n", i, m->sp, m->ep, m->sp);
        !          6629: -}
        !          6630: //GO.SYSIN DD ./regexp.c
        !          6631: echo ./rule.c 1>&2
        !          6632: sed 's/.//' >./rule.c <<'//GO.SYSIN DD ./rule.c'
        !          6633: -#include      "mk.h"
        !          6634: -
        !          6635: -static Rule *lr, *lmr;
        !          6636: -static rcmp();
        !          6637: -static int nrules = 0;
        !          6638: -
        !          6639: -addrule(head, tail, body, ahead, attr, hline, override, prog)
        !          6640: -      Word *tail, *ahead;
        !          6641: -      char *head, *body, *prog;
        !          6642: -{
        !          6643: -      register Rule *r;
        !          6644: -      Rule *rr;
        !          6645: -      Symtab *sym;
        !          6646: -      int reuse;
        !          6647: -
        !          6648: -      if(sym = symlook(head, S_TARGET, (char *)0)){
        !          6649: -              for(r = (Rule *)sym->value; r; r = r->chain)
        !          6650: -                      if(rcmp(r, head, tail) == 0) break;
        !          6651: -              if(r && !override)
        !          6652: -                      return;
        !          6653: -      } else
        !          6654: -              r = 0;
        !          6655: -      reuse = r != 0;
        !          6656: -      if(r == 0)
        !          6657: -              r = (Rule *)Malloc(sizeof(Rule));
        !          6658: -      r->target = head;
        !          6659: -      r->tail = tail;
        !          6660: -      r->recipe = body;
        !          6661: -      r->line = hline;
        !          6662: -      r->file = infile;
        !          6663: -      r->attr = attr;
        !          6664: -      r->alltargets = ahead;
        !          6665: -      r->prog = prog;
        !          6666: -      r->rule = nrules++;
        !          6667: -      if(!reuse){
        !          6668: -              rr = (Rule *)symlook(head, S_TARGET, (char *)r)->value;
        !          6669: -              if(rr != r){
        !          6670: -                      r->chain = rr->chain;
        !          6671: -                      rr->chain = r;
        !          6672: -              } else
        !          6673: -                      r->chain = 0;
        !          6674: -      }
        !          6675: -      if(strchr(head, '%') || strchr(head, '&') || (attr&REGEXP))
        !          6676: -              goto meta;
        !          6677: -      if(reuse)
        !          6678: -              return;
        !          6679: -      r->next = 0;
        !          6680: -      r->pat = 0;
        !          6681: -      if(rules == 0)
        !          6682: -              rules = lr = r;
        !          6683: -      else {
        !          6684: -              lr->next = r;
        !          6685: -              lr = r;
        !          6686: -      }
        !          6687: -      return;
        !          6688: -meta:
        !          6689: -      r->attr |= META;
        !          6690: -      if(reuse)
        !          6691: -              return;
        !          6692: -      r->next = 0;
        !          6693: -      if(r->attr&REGEXP){
        !          6694: -              patrule = r;
        !          6695: -              r->pat = regcomp(head);
        !          6696: -      }
        !          6697: -      if(metarules == 0)
        !          6698: -              metarules = lmr = r;
        !          6699: -      else {
        !          6700: -              lmr->next = r;
        !          6701: -              lmr = r;
        !          6702: -      }
        !          6703: -}
        !          6704: -
        !          6705: -dumpr(s, r)
        !          6706: -      char *s;
        !          6707: -      register Rule *r;
        !          6708: -{
        !          6709: -      Fprint(1, "%s: start=%ld\n", s, r);
        !          6710: -      for(; r; r = r->next){
        !          6711: -              Fprint(1, "\tRule %ld: %s[%d] attr=%x next=%ld chain=%ld alltarget='%s'",
        !          6712: -                      r, r->file, r->line, r->attr, r->next, r->chain, wtos(r->alltargets));
        !          6713: -              if(r->prog)
        !          6714: -                      Fprint(1, " prog='%s'", r->prog);
        !          6715: -              Fprint(1, "\n\ttarget=%s: %s\n", r->target, wtos(r->tail));
        !          6716: -              Fprint(1, "\trecipe@%ld='%s'\n", r->recipe, r->recipe);
        !          6717: -      }
        !          6718: -}
        !          6719: -
        !          6720: -frule(w)
        !          6721: -      Word *w;
        !          6722: -{
        !          6723: -      extern Word *target1;
        !          6724: -      register Word *ww;
        !          6725: -      register char *s;
        !          6726: -
        !          6727: -#define       ADD(s)  {if(target1==0)target1=ww=newword(s);else ww=ww->next=newword(s);}
        !          6728: -
        !          6729: -      for(ww = w; ww; ww = ww->next)
        !          6730: -              if(strchr(w->s, '%') || strchr(w->s, '&'))
        !          6731: -                      return; /* no metarule targets */
        !          6732: -      while(w){
        !          6733: -              if(s = strchr(w->s, '+')){
        !          6734: -                      *s++ = 0;
        !          6735: -                      if(*w->s)
        !          6736: -                              ADD(w->s);
        !          6737: -                      if(*s)
        !          6738: -                              ADD(s);
        !          6739: -                      s[-1] = '+';
        !          6740: -              } else
        !          6741: -                      ADD(w->s);
        !          6742: -              w = w->next;
        !          6743: -      }
        !          6744: -}
        !          6745: -
        !          6746: -static
        !          6747: -rcmp(r, target, tail)
        !          6748: -      register Rule *r;
        !          6749: -      char *target;
        !          6750: -      register Word *tail;
        !          6751: -{
        !          6752: -      register Word *w;
        !          6753: -
        !          6754: -      if(strcmp(r->target, target))
        !          6755: -              return(1);
        !          6756: -      for(w = r->tail; w && tail; w = w->next, tail = tail->next)
        !          6757: -              if(strcmp(w->s, tail->s))
        !          6758: -                      return(1);
        !          6759: -      return(w || tail);
        !          6760: -}
        !          6761: -
        !          6762: -char *
        !          6763: -rulecnt()
        !          6764: -{
        !          6765: -      register char *s;
        !          6766: -
        !          6767: -      s = Malloc(nrules);
        !          6768: -      memset(s, 0, nrules);
        !          6769: -      return(s);
        !          6770: -}
        !          6771: -
        !          6772: -ismeta(s)
        !          6773: -      register char *s;
        !          6774: -{
        !          6775: -      for(; *s; s++)
        !          6776: -              switch(*s)
        !          6777: -              {
        !          6778: -              case '\\':
        !          6779: -                      if(s[1])
        !          6780: -                              s++;
        !          6781: -                      break;
        !          6782: -              case '[':
        !          6783: -              case '*':
        !          6784: -              case '?':
        !          6785: -                      return(1);
        !          6786: -                      break;
        !          6787: -              }
        !          6788: -      return(0);
        !          6789: -}
        !          6790: //GO.SYSIN DD ./rule.c
        !          6791: echo ./run.c 1>&2
        !          6792: sed 's/.//' >./run.c <<'//GO.SYSIN DD ./run.c'
        !          6793: -#include      "mk.h"
        !          6794: -
        !          6795: -typedef struct Event
        !          6796: -{
        !          6797: -      int pid;
        !          6798: -      Job *job;
        !          6799: -} Event;
        !          6800: -static Event *events;
        !          6801: -static int nevents, nrunning;
        !          6802: -typedef struct Process
        !          6803: -{
        !          6804: -      int pid;
        !          6805: -      int status;
        !          6806: -      struct Process *b, *f;
        !          6807: -} Process;
        !          6808: -static Process *phead, *pfree;
        !          6809: -static void pnew(), pdelete();
        !          6810: -static char *envy[1024];
        !          6811: -static char **special;
        !          6812: -static pidslot();
        !          6813: -
        !          6814: -run(j)
        !          6815: -      Job *j;
        !          6816: -{
        !          6817: -      register Job *jj;
        !          6818: -
        !          6819: -      if(jobs){
        !          6820: -              for(jj = jobs; jj->next; jj = jj->next)
        !          6821: -                      ;
        !          6822: -              jj->next = j;
        !          6823: -      } else 
        !          6824: -              jobs = j;
        !          6825: -      j->next = 0;
        !          6826: -      /* this code also in waitup after parse redirect */
        !          6827: -      if(nrunning < nproclimit)
        !          6828: -              sched();
        !          6829: -}
        !          6830: -
        !          6831: -sched()
        !          6832: -{
        !          6833: -      register Job *j;
        !          6834: -      char buf[BIGBLOCK];
        !          6835: -      int slot, pip[2], pid;
        !          6836: -      Node *n;
        !          6837: -
        !          6838: -      if(jobs == 0){
        !          6839: -              account();
        !          6840: -              return;
        !          6841: -      }
        !          6842: -      j = jobs;
        !          6843: -      jobs = j->next;
        !          6844: -      if(DEBUG(D_EXEC))
        !          6845: -              fprint(1, "firing up job for target %s\n", wtos(j->t));
        !          6846: -      slot = nextslot();
        !          6847: -      events[slot].job = j;
        !          6848: -      dovars(j, slot);
        !          6849: -      shprint(j->r->recipe, envy, buf);
        !          6850: -      if(!tflag && !mflag && (nflag || !(j->r->attr&QUIET)))
        !          6851: -              Fwrite(1, buf, (long)strlen(buf));
        !          6852: -      if(mflag){
        !          6853: -              for(n = j->n; n; n = n->next)
        !          6854: -                      symlook(n->name, S_MAKEFILE, (char *)j);
        !          6855: -      }
        !          6856: -      if(nflag||tflag){
        !          6857: -              for(n = j->n; n; n = n->next){
        !          6858: -                      if(tflag){
        !          6859: -                              if(!(n->flags&VIRTUAL))
        !          6860: -                                      touch(n->name);
        !          6861: -                              else if(explain)
        !          6862: -                                      Fprint(1, "no touch of virtual '%s'\n", n->name);
        !          6863: -                      }
        !          6864: -                      n->time = time((long *)0);
        !          6865: -                      MADESET(n, MADE);
        !          6866: -              }
        !          6867: -      } else {
        !          6868: -              Fexit(0);
        !          6869: -              if(j->r->attr&RED){
        !          6870: -                      if(pipe(pip) < 0){
        !          6871: -                              perror("pipe");
        !          6872: -                              Exit();
        !          6873: -                      }
        !          6874: -              }
        !          6875: -              if((pid = fork()) < 0){
        !          6876: -                      perror("mk fork");
        !          6877: -                      Exit();
        !          6878: -              }
        !          6879: -              if(pid == 0){
        !          6880: -                      if(j->r->attr&RED){
        !          6881: -                              close(pip[0]);
        !          6882: -                              dup2(pip[1], 1);
        !          6883: -                              close(pip[1]);
        !          6884: -                      }
        !          6885: -                      if(pipe(pip) < 0){
        !          6886: -                              perror("pipe-i");
        !          6887: -                              Exit();
        !          6888: -                      }
        !          6889: -                      if((pid = fork()) < 0){
        !          6890: -                              perror("mk fork");
        !          6891: -                              Exit();
        !          6892: -                      }
        !          6893: -                      if(pid != 0){
        !          6894: -                              close(pip[1]);
        !          6895: -                              dup2(pip[0], 0);
        !          6896: -                              close(pip[0]);
        !          6897: -                              execle(SHELL, "sh", "-e", (char *)0, envy);
        !          6898: -                              perror(SHELL);
        !          6899: -                              _exit(1);
        !          6900: -                      } else {
        !          6901: -                              int k;
        !          6902: -                              char *s, *send;
        !          6903: -
        !          6904: -                              close(pip[0]);
        !          6905: -                              s = j->r->recipe;
        !          6906: -                              send = s+strlen(s);
        !          6907: -                              while(s < send){
        !          6908: -                                      if((k = write(pip[1], s, send-s)) < 0)
        !          6909: -                                              break;
        !          6910: -                                      s += k;
        !          6911: -                              }
        !          6912: -                              _exit(0);
        !          6913: -                      }
        !          6914: -              }
        !          6915: -              account();
        !          6916: -              nrunning++;
        !          6917: -              if(j->r->attr&RED)
        !          6918: -                      close(pip[1]), j->fd = pip[0];
        !          6919: -              else
        !          6920: -                      j->fd = -1;
        !          6921: -              if(DEBUG(D_EXEC))
        !          6922: -                      fprint(1, "pid for target %s = %d\n", wtos(j->t), pid);
        !          6923: -              events[slot].pid = pid;
        !          6924: -      }
        !          6925: -}
        !          6926: -
        !          6927: -waitup(echildok, retstatus)
        !          6928: -      int *retstatus;
        !          6929: -{
        !          6930: -      int status, pid;
        !          6931: -      int slot;
        !          6932: -      Symtab *s;
        !          6933: -      Word *w;
        !          6934: -      Job *j;
        !          6935: -      char buf[64];
        !          6936: -      char buf1[BIGBLOCK];
        !          6937: -      int uarg = 0;
        !          6938: -      int done;
        !          6939: -      Node *n;
        !          6940: -      Process *p;
        !          6941: -      extern int errno, runerrs;
        !          6942: -
        !          6943: -      /* first check against the proces slist */
        !          6944: -      if(retstatus)
        !          6945: -              for(p = phead; p; p = p->f)
        !          6946: -                      if(p->pid == *retstatus){
        !          6947: -                              *retstatus = p->status;
        !          6948: -                              pdelete(p);
        !          6949: -                              return(-1);
        !          6950: -                      }
        !          6951: -again:                /* rogue processes */
        !          6952: -      if((pid = wait(&status)) < 0){
        !          6953: -              if(echildok > 0){
        !          6954: -                      return(1);
        !          6955: -              } else {
        !          6956: -                      fprint(2, "mk: (waitup %d) ", echildok);
        !          6957: -                      perror("mk wait");
        !          6958: -                      Exit();
        !          6959: -              }
        !          6960: -      }
        !          6961: -      if(DEBUG(D_EXEC))
        !          6962: -              fprint(1, "waitup got pid=%d, status=0x%ux\n", pid, status);
        !          6963: -      if(retstatus && (pid == *retstatus)){
        !          6964: -              *retstatus = status;
        !          6965: -              return(-1);
        !          6966: -      }
        !          6967: -      slot = pidslot(pid);
        !          6968: -      if(slot < 0){
        !          6969: -              if(DEBUG(D_EXEC))
        !          6970: -                      fprint(2, "mk: wait returned unexpected process %d\n", pid);
        !          6971: -              pnew(pid, status);
        !          6972: -              goto again;
        !          6973: -      }
        !          6974: -      j = events[slot].job;
        !          6975: -      account();
        !          6976: -      nrunning--;
        !          6977: -      events[slot].pid = -1;
        !          6978: -      if(status){
        !          6979: -              dovars(j, slot);
        !          6980: -              shprint(j->r->recipe, envy, buf1);
        !          6981: -              front(buf1);
        !          6982: -              Fprint(2, "mk: %s: exit status=%d", buf1, 0xFF&(status>>8));
        !          6983: -              status &= 0xFF;
        !          6984: -              if(status&0x7F)
        !          6985: -                      Fprint(2, " signal=%d", status&0x7F);
        !          6986: -              if(status&0x80)
        !          6987: -                      Fprint(2, ", core dumped");
        !          6988: -              for(n = j->n, done = 0; n; n = n->next)
        !          6989: -                      if(n->flags&DELETE){
        !          6990: -                              if(done++ == 0)
        !          6991: -                                      Fprint(2, ", deleting");
        !          6992: -                              Fprint(2, " '%s'", n->name);
        !          6993: -                      }
        !          6994: -              Fputc(2, '\n');
        !          6995: -              for(n = j->n, done = 0; n; n = n->next)
        !          6996: -                      if(n->flags&DELETE){
        !          6997: -                              if(done++ == 0)
        !          6998: -                                      Fflush(2);
        !          6999: -                              delete(n->name);
        !          7000: -                      }
        !          7001: -              if(kflag){
        !          7002: -                      runerrs++;
        !          7003: -                      uarg = 1;
        !          7004: -                      Fflush(2);
        !          7005: -              } else {
        !          7006: -                      jobs = 0;
        !          7007: -                      Exit();
        !          7008: -              }
        !          7009: -      }
        !          7010: -      if(j->fd >= 0){
        !          7011: -              sprint(buf, "process %d", pid);
        !          7012: -              parse(buf, j->fd, 0, 0);
        !          7013: -              execinit();     /* reread environ */
        !          7014: -              nproc();
        !          7015: -              while(jobs && (nrunning < nproclimit))
        !          7016: -                      sched();
        !          7017: -      }
        !          7018: -      for(w = j->t; w; w = w->next){
        !          7019: -              if((s = symlook(w->s, S_NODE, (char *)0)) == 0)
        !          7020: -                      continue;       /* not interested in this node */
        !          7021: -              update(uarg, (Node *)s->value);
        !          7022: -      }
        !          7023: -      if(nrunning < nproclimit)
        !          7024: -              sched();
        !          7025: -      return(0);
        !          7026: -}
        !          7027: -
        !          7028: -execinit()
        !          7029: -{
        !          7030: -      extern char **environ;
        !          7031: -      extern char **vardump();
        !          7032: -      register char *s, *ss, c;
        !          7033: -      Symtab *st;
        !          7034: -
        !          7035: -      environ = envy;
        !          7036: -      special = vardump(envy);
        !          7037: -      if(st = symlook("ENVIRON", S_VAR, (char *)0))
        !          7038: -              for(s = st->value; *s;){
        !          7039: -                      for(ss = s; *ss && (*ss != 1); ss++);
        !          7040: -                      c = *ss;
        !          7041: -                      *ss = 0;
        !          7042: -                      *special++ = strdup(s);
        !          7043: -                      s = ss;
        !          7044: -                      if(*ss = c)
        !          7045: -                              s++;
        !          7046: -              }
        !          7047: -      *special = 0;
        !          7048: -}
        !          7049: -
        !          7050: -char *myenv[] =
        !          7051: -{
        !          7052: -      "target", "stem", "prereq", "pid", "nproc", "newprereq",
        !          7053: -      "alltarget",
        !          7054: -      "stem1", "stem2", "stem3", "stem4", "stem5", "stem6",
        !          7055: -      "stem7", "stem8", "stem9", "stem0", 0
        !          7056: -};
        !          7057: -
        !          7058: -dovars(j, slot)
        !          7059: -      register Job *j;
        !          7060: -{
        !          7061: -      char buf[BIGBLOCK];
        !          7062: -      char *s, *t;
        !          7063: -      int i, n = 0;
        !          7064: -
        !          7065: -#define       SPECIAL ((sizeof myenv)/(sizeof myenv[0])-1)
        !          7066: -#define       VSET(name, exp) {strcpy(buf, "name="); strcpy(strchr(buf, 0), exp);}
        !          7067: -
        !          7068: -      for(i = 0; i < SPECIAL; i++)
        !          7069: -              if(special[i])
        !          7070: -                      free(special[i]);
        !          7071: -      VSET(target, s = wtos(j->t));
        !          7072: -      special[n++] = strdup(buf);
        !          7073: -      free(s);
        !          7074: -      /* WATCH OUT; stem set below if reg exp!! */
        !          7075: -      VSET(stem, j->stem);
        !          7076: -      special[n++] = strdup(buf);
        !          7077: -      VSET(prereq, s = wtos(j->p));
        !          7078: -      special[n++] = strdup(buf);
        !          7079: -      free(s);
        !          7080: -      sprint(buf, "pid=%d", getpid());
        !          7081: -      special[n++] = strdup(buf);
        !          7082: -      sprint(buf, "nproc=%d", slot);
        !          7083: -      special[n++] = strdup(buf);
        !          7084: -      VSET(newprereq, s = wtos(j->np));
        !          7085: -      special[n++] = strdup(buf);
        !          7086: -      free(s);
        !          7087: -      VSET(alltarget, s = wtos(j->at));
        !          7088: -      special[n++] = strdup(buf);
        !          7089: -      free(s);
        !          7090: -      for(i = 0; i <= 9; i++){
        !          7091: -              sprint(buf, "stem%d=", i);
        !          7092: -              if(j->r->attr&REGEXP){
        !          7093: -                      for(s = buf; *s; s++);
        !          7094: -                      for(t = j->match[i].sp; t < j->match[i].ep; *s++ = *t++);
        !          7095: -                      *s = 0;
        !          7096: -              }
        !          7097: -              special[n+i] = strdup(buf);
        !          7098: -              if((i == 1) && (j->r->attr&REGEXP)){
        !          7099: -                      buf[1] = 's'; buf[2] = 't'; buf[3] = 'e'; buf[4] = 'm';
        !          7100: -                      special[1] = strdup(buf+1);
        !          7101: -              }
        !          7102: -      }
        !          7103: -      special[SPECIAL] = 0;
        !          7104: -}
        !          7105: -
        !          7106: -nproc()
        !          7107: -{
        !          7108: -      register Symtab *sym;
        !          7109: -
        !          7110: -      if(sym = symlook("NPROC", S_VAR, (char *)0))
        !          7111: -              nproclimit = atoi(sym->value);
        !          7112: -      if(nproclimit < 1)
        !          7113: -              nproclimit = 1;
        !          7114: -      if(DEBUG(D_EXEC))
        !          7115: -              fprint(1, "nprocs = %d\n", nproclimit);
        !          7116: -      if(nproclimit > nevents){
        !          7117: -              if(nevents)
        !          7118: -                      events = (Event *)realloc((char *)events, nproclimit*sizeof(Event));
        !          7119: -              else
        !          7120: -                      events = (Event *)malloc(nproclimit*sizeof(Event));
        !          7121: -              while(nevents < nproclimit)
        !          7122: -                      events[nevents++].pid = 0;
        !          7123: -      }
        !          7124: -}
        !          7125: -
        !          7126: -nextslot()
        !          7127: -{
        !          7128: -      register i;
        !          7129: -
        !          7130: -      for(i = 0; i < nproclimit; i++)
        !          7131: -              if(events[i].pid <= 0) return(i);
        !          7132: -      assert("out of slots!!", 0);
        !          7133: -      return(0);      /* cyntax */
        !          7134: -}
        !          7135: -
        !          7136: -static
        !          7137: -pidslot(pid)
        !          7138: -{
        !          7139: -      register i;
        !          7140: -
        !          7141: -      for(i = 0; i < nevents; i++)
        !          7142: -              if(events[i].pid == pid) return(i);
        !          7143: -      return(-1);
        !          7144: -}
        !          7145: -
        !          7146: -static void
        !          7147: -pnew(pid, status)
        !          7148: -{
        !          7149: -      register Process *p;
        !          7150: -
        !          7151: -      if(pfree){
        !          7152: -              p = pfree;
        !          7153: -              pfree = p->f;
        !          7154: -      } else
        !          7155: -              p = (Process *)Malloc(sizeof(Process));
        !          7156: -      p->pid = pid;
        !          7157: -      p->status = status;
        !          7158: -      p->f = phead;
        !          7159: -      phead = p;
        !          7160: -      if(p->f)
        !          7161: -              p->f->b = p;
        !          7162: -      p->b = 0;
        !          7163: -}
        !          7164: -
        !          7165: -static void
        !          7166: -pdelete(p)
        !          7167: -      Process *p;
        !          7168: -{
        !          7169: -      if(p->f)
        !          7170: -              p->f->b = p->b;
        !          7171: -      if(p->b)
        !          7172: -              p->b->f = p->f;
        !          7173: -      else
        !          7174: -              phead = p->f;
        !          7175: -      p->f = pfree;
        !          7176: -      pfree = p;
        !          7177: -}
        !          7178: -
        !          7179: -static long tslot[1000];
        !          7180: -static long tick;
        !          7181: -
        !          7182: -account()
        !          7183: -{
        !          7184: -      long t;
        !          7185: -
        !          7186: -      time(&t);
        !          7187: -      if(tick)
        !          7188: -              tslot[nrunning] += (t-tick);
        !          7189: -      tick = t;
        !          7190: -}
        !          7191: -
        !          7192: -praccount()
        !          7193: -{
        !          7194: -      int i;
        !          7195: -
        !          7196: -      account();
        !          7197: -      for(i = 0; i <= nevents; i++)
        !          7198: -              Fprint(1, "%d: %ld\n", i, tslot[i]);
        !          7199: -}
        !          7200: //GO.SYSIN DD ./run.c
        !          7201: echo ./shprint.c 1>&2
        !          7202: sed 's/.//' >./shprint.c <<'//GO.SYSIN DD ./shprint.c'
        !          7203: -#include      "mk.h"
        !          7204: -
        !          7205: -shprint(s, env, dest)
        !          7206: -      char *s, **env, *dest;
        !          7207: -{
        !          7208: -      register char *q = dest;
        !          7209: -
        !          7210: -      while(*s)
        !          7211: -              switch(*s)
        !          7212: -              {
        !          7213: -              case '\\':
        !          7214: -                      *q++ = *s++;
        !          7215: -                      *q++ = *s++;
        !          7216: -                      break;
        !          7217: -              case '$':
        !          7218: -                      q = vexpand(&s, q, env);
        !          7219: -                      break;
        !          7220: -              default:
        !          7221: -                      *q++ = *s++;
        !          7222: -                      break;
        !          7223: -              }
        !          7224: -      *q = 0;
        !          7225: -}
        !          7226: -
        !          7227: -char *
        !          7228: -mygetenv(name, env)
        !          7229: -      char *name, **env;
        !          7230: -{
        !          7231: -      register char *p, *q;
        !          7232: -
        !          7233: -      for(; *env; env++){
        !          7234: -              for(p = name, q = *env; *p == *q; p++, q++)
        !          7235: -                      if(*p == 0) break;
        !          7236: -              if((*p == 0) && (*q == '='))
        !          7237: -                      return(q+1);
        !          7238: -      }
        !          7239: -      return((char *)0);
        !          7240: -}
        !          7241: -
        !          7242: -char *
        !          7243: -vexpand(ww, dest, env)
        !          7244: -      char **ww, *dest, **env;
        !          7245: -{
        !          7246: -      register char *s, *w = *ww;
        !          7247: -      char carry, *q;
        !          7248: -
        !          7249: -      assert("vexpand no $", *w == '$');
        !          7250: -      if(*++w == '{'){
        !          7251: -              for(s = ++w; *s != '}'; s++)
        !          7252: -                      if(*s == 0) break;
        !          7253: -      } else
        !          7254: -              s = shname(w);
        !          7255: -      carry = *s;
        !          7256: -      *s = 0;
        !          7257: -      if(q = mygetenv(w, env)){
        !          7258: -              while(*q)
        !          7259: -                      *dest++ = *q++;
        !          7260: -      } else {        /* copy name */
        !          7261: -              for(q = *ww; q != s;)
        !          7262: -                      *dest++ = *q++;
        !          7263: -              if(carry == '}')
        !          7264: -                      *dest++ = carry;
        !          7265: -      }
        !          7266: -      *s = carry;
        !          7267: -      if(carry == '}')
        !          7268: -              s++;
        !          7269: -      *ww = s;
        !          7270: -      return(dest);
        !          7271: -}
        !          7272: -
        !          7273: -front(s)
        !          7274: -      char *s;
        !          7275: -{
        !          7276: -      register char *t;
        !          7277: -      register i, j;
        !          7278: -      char *flds[512];
        !          7279: -      char buf[BIGBLOCK];
        !          7280: -
        !          7281: -      setfields(" \t\n");
        !          7282: -      strcpy(buf, s);
        !          7283: -      i = getfields(buf, flds, 512);
        !          7284: -      if(i > 5){
        !          7285: -              flds[4] = flds[i-1];
        !          7286: -              flds[3] = "...";
        !          7287: -              i = 5;
        !          7288: -      }
        !          7289: -      t = s;
        !          7290: -      for(j = 0; j < i; j++){
        !          7291: -              for(s = flds[j]; *s; *t++ = *s++);
        !          7292: -              *t++ = ' ';
        !          7293: -      }
        !          7294: -      *t = 0;
        !          7295: -}
        !          7296: //GO.SYSIN DD ./shprint.c
        !          7297: echo ./sig.c 1>&2
        !          7298: sed 's/.//' >./sig.c <<'//GO.SYSIN DD ./sig.c'
        !          7299: -#include      "mk.h"
        !          7300: -#include      <signal.h>
        !          7301: -
        !          7302: -static
        !          7303: -sigint()
        !          7304: -{
        !          7305: -      extern errno;
        !          7306: -
        !          7307: -      signal(SIGINT, SIG_IGN);
        !          7308: -      kflag = 1;      /* to make sure waitup doesn't exit */
        !          7309: -      jobs = 0;       /* make sure no more get scheduled */
        !          7310: -      while(waitup(1, (int *)0) == 0)
        !          7311: -              ;
        !          7312: -      Fprint(1, "mk: interrupted!\n");
        !          7313: -      Exit();
        !          7314: -}
        !          7315: -
        !          7316: -sigcatch()
        !          7317: -{
        !          7318: -      if(signal(SIGINT, SIG_IGN) != SIG_IGN)
        !          7319: -              signal(SIGINT, sigint);
        !          7320: -}
        !          7321: //GO.SYSIN DD ./sig.c
        !          7322: echo ./symtab.c 1>&2
        !          7323: sed 's/.//' >./symtab.c <<'//GO.SYSIN DD ./symtab.c'
        !          7324: -#include      "mk.h"
        !          7325: -
        !          7326: -#define       NHASH   4099
        !          7327: -#define       HASHMUL 79L     /* this is a good value */
        !          7328: -static Symtab *hash[NHASH];
        !          7329: -
        !          7330: -syminit()
        !          7331: -{
        !          7332: -      register Symtab **s, *ss;
        !          7333: -
        !          7334: -      for(s = hash; s < &hash[NHASH]; s++){
        !          7335: -              for(ss = *s; ss; ss = ss->next)
        !          7336: -                      free((char *)ss);
        !          7337: -              *s = 0;
        !          7338: -      }
        !          7339: -}
        !          7340: -
        !          7341: -Symtab *
        !          7342: -symlook(sym, space, install)
        !          7343: -      char *sym;
        !          7344: -      char *install;
        !          7345: -{
        !          7346: -      register long h;
        !          7347: -      register char *p;
        !          7348: -      register Symtab *s;
        !          7349: -
        !          7350: -      for(p = sym, h = space; *p; h += *p++)
        !          7351: -              h *= HASHMUL;
        !          7352: -      if(h < 0)
        !          7353: -              h = ~h;
        !          7354: -      h %= NHASH;
        !          7355: -      for(s = hash[h]; s; s = s->next)
        !          7356: -              if((s->space == space) && (strcmp(s->name, sym) == 0))
        !          7357: -                      return(s);
        !          7358: -      if(install == 0)
        !          7359: -              return((Symtab *)0);
        !          7360: -      s = (Symtab *)Malloc(sizeof(Symtab));
        !          7361: -      s->space = space;
        !          7362: -      s->name = sym;
        !          7363: -      s->value = install;
        !          7364: -      s->next = hash[h];
        !          7365: -      hash[h] = s;
        !          7366: -      return(s);
        !          7367: -}
        !          7368: -
        !          7369: -symdel(sym, space)
        !          7370: -      char *sym;
        !          7371: -{
        !          7372: -      register long h;
        !          7373: -      register char *p;
        !          7374: -      register Symtab *s, *ls;
        !          7375: -
        !          7376: -      for(p = sym, h = space; *p; h += *p++)
        !          7377: -              h *= HASHMUL;
        !          7378: -      if(h < 0)
        !          7379: -              h = ~h;
        !          7380: -      h %= NHASH;
        !          7381: -      for(s = hash[h], ls = 0; s; ls = s, s = s->next)
        !          7382: -              if((s->space == space) && (strcmp(s->name, sym) == 0)){
        !          7383: -                      if(ls)
        !          7384: -                              ls->next = s->next;
        !          7385: -                      else
        !          7386: -                              hash[h] = s->next;
        !          7387: -                      free((char *)s);
        !          7388: -              }
        !          7389: -}
        !          7390: -
        !          7391: -symtraverse(space, fn)
        !          7392: -      void (*fn)();
        !          7393: -{
        !          7394: -      register Symtab **s, *ss;
        !          7395: -
        !          7396: -      for(s = hash; s < &hash[NHASH]; s++)
        !          7397: -              for(ss = *s; ss; ss = ss->next)
        !          7398: -                      if(ss->space == space)
        !          7399: -                              (*fn)(ss);
        !          7400: -}
        !          7401: -
        !          7402: -symstat()
        !          7403: -{
        !          7404: -      register Symtab **s, *ss;
        !          7405: -      register n;
        !          7406: -      int l[1000];
        !          7407: -
        !          7408: -      memset((char *)l, 0, sizeof(l));
        !          7409: -      for(s = hash; s < &hash[NHASH]; s++){
        !          7410: -              for(ss = *s, n = 0; ss; ss = ss->next)
        !          7411: -                      n++;
        !          7412: -              l[n]++;
        !          7413: -      }
        !          7414: -      for(n = 0; n < 1000; n++)
        !          7415: -              if(l[n]) Fprint(1, "%ld of length %d\n", l[n], n);
        !          7416: -}
        !          7417: //GO.SYSIN DD ./symtab.c
        !          7418: echo ./t_ar.c 1>&2
        !          7419: sed 's/.//' >./t_ar.c <<'//GO.SYSIN DD ./t_ar.c'
        !          7420: -#include      "mk.h"
        !          7421: -#include      <sys/types.h>
        !          7422: -#include      <sys/stat.h>
        !          7423: -#include      <ar.h>
        !          7424: -
        !          7425: -static atimes();
        !          7426: -
        !          7427: -long
        !          7428: -atimeof(force, name, ar, mem)
        !          7429: -      char *name, *ar, *mem;
        !          7430: -{
        !          7431: -      struct stat sbuf;
        !          7432: -      Symtab *sym;
        !          7433: -
        !          7434: -      if(stat(ar, &sbuf) < 0)
        !          7435: -              sbuf.st_mtime = 0;
        !          7436: -      if(sym = symlook(ar, S_AGG, (char *)0)){
        !          7437: -              if(force || (sbuf.st_mtime > (long)sym->value)){
        !          7438: -                      atimes(ar);
        !          7439: -                      symlook(ar, S_AGG, ar)->value = (char *)sbuf.st_mtime;
        !          7440: -              }
        !          7441: -      } else {
        !          7442: -              atimes(ar);
        !          7443: -              symlook(strdup(ar), S_AGG, ar)->value = (char *)sbuf.st_mtime;
        !          7444: -      }
        !          7445: -      if(sym = symlook(name, S_TIME, (char *)0))
        !          7446: -              sbuf.st_mtime = (long)sym->value;
        !          7447: -      else
        !          7448: -              sbuf.st_mtime = 0;
        !          7449: -      return((long)sbuf.st_mtime);
        !          7450: -}
        !          7451: -
        !          7452: -void
        !          7453: -atouch(name, ar, mem)
        !          7454: -      char *name, *ar, *mem;
        !          7455: -{
        !          7456: -      int fd;
        !          7457: -      struct ar_hdr hdr;
        !          7458: -      char *s;
        !          7459: -      long t;
        !          7460: -      char buf[NAMEBLOCK];
        !          7461: -
        !          7462: -      strcpy(buf, mem);
        !          7463: -#ifdef        SYSV
        !          7464: -      strcat(buf, "/");
        !          7465: -#endif
        !          7466: -      if((fd = open(ar, 2)) < 0){
        !          7467: -              if((fd = creat(ar, 0666)) < 0){
        !          7468: -                      perror(ar);
        !          7469: -                      Exit();
        !          7470: -              }
        !          7471: -              write(fd, ARMAG, SARMAG);
        !          7472: -      }
        !          7473: -      if(symlook(name, S_TIME, (char *)0)){
        !          7474: -              /* hoon off and change it in situ */
        !          7475: -              lseek(fd, (long)SARMAG, 0);
        !          7476: -              while(read(fd, (char *)&hdr, sizeof(hdr)) == sizeof(hdr)){
        !          7477: -                      for(s = &hdr.ar_name[sizeof(hdr.ar_name)]; *--s == ' ';);
        !          7478: -                      s[1] = 0;
        !          7479: -                      if(strcmp(buf, hdr.ar_name) == 0){
        !          7480: -                              t = sizeof(hdr.ar_name)-sizeof(hdr);
        !          7481: -                              lseek(fd, t, 1);
        !          7482: -                              fprint(fd, "%-12ld", time((long *)0));
        !          7483: -                              break;
        !          7484: -                      }
        !          7485: -                      t = atol(hdr.ar_size);
        !          7486: -#ifdef        CRAY
        !          7487: -                      t = (t+7)&~7;
        !          7488: -                      t -= sizeof(hdr)-60;
        !          7489: -#else
        !          7490: -                      if(t&01) t++;
        !          7491: -#endif
        !          7492: -                      lseek(fd, t, 1);
        !          7493: -              }
        !          7494: -      } else {
        !          7495: -              lseek(fd, 0L, 2);
        !          7496: -              fprint(fd, "%-16s%-12ld%-6d%-6d%-8lo%-10ld%2s", buf, time((long *)0),
        !          7497: -                      getuid(), getgid(), 0100666L, 0L, ARFMAG);
        !          7498: -      }
        !          7499: -      close(fd);
        !          7500: -}
        !          7501: -
        !          7502: -
        !          7503: -void
        !          7504: -adelete(name, ar, mem)
        !          7505: -      char *name, *ar, *mem;
        !          7506: -{
        !          7507: -      Fprint(2, "sorry; mk doesn't know how to delete archive members yet\n");
        !          7508: -}
        !          7509: -
        !          7510: -static
        !          7511: -atimes(ar)
        !          7512: -      char *ar;
        !          7513: -{
        !          7514: -      struct ar_hdr hdr;
        !          7515: -      long t;
        !          7516: -      int fd;
        !          7517: -      char buf[BIGBLOCK];
        !          7518: -      register char *s;
        !          7519: -
        !          7520: -      if((fd = open(ar, 0)) < 0)
        !          7521: -              return;
        !          7522: -      if(read(fd, buf, SARMAG) != SARMAG){
        !          7523: -              close(fd);
        !          7524: -              return;
        !          7525: -      }
        !          7526: -      while(read(fd, (char *)&hdr, sizeof(hdr)) == sizeof(hdr)){
        !          7527: -              for(s = &hdr.ar_name[sizeof(hdr.ar_name)]; *--s == ' ';);
        !          7528: -#ifdef        SYSV
        !          7529: -              if(*s == '/')   /* Damn you Sytem V */
        !          7530: -                      s--;
        !          7531: -#endif
        !          7532: -              s[1] = 0;
        !          7533: -              t = atol(hdr.ar_date);
        !          7534: -              sprint(buf, "%s(%s)", ar, hdr.ar_name);
        !          7535: -              symlook(strdup(buf), S_TIME, (char *)t)->value = (char *)t;
        !          7536: -              t = atol(hdr.ar_size);
        !          7537: -              if(t&01) t++;
        !          7538: -              lseek(fd, t, 1);
        !          7539: -      }
        !          7540: -      close(fd);
        !          7541: -}
        !          7542: //GO.SYSIN DD ./t_ar.c
        !          7543: echo ./t_driver.c 1>&2
        !          7544: sed 's/.//' >./t_driver.c <<'//GO.SYSIN DD ./t_driver.c'
        !          7545: -#include      "mk.h"
        !          7546: -#include      <ar.h>
        !          7547: -
        !          7548: -#define       AR      123456L
        !          7549: -
        !          7550: -extern long ftimeof(), atimeof();
        !          7551: -extern void ftouch(), atouch();
        !          7552: -extern void fdelete(), adelete();
        !          7553: -static long split();
        !          7554: -
        !          7555: -struct ftype
        !          7556: -{
        !          7557: -      long magic;
        !          7558: -      long (*time)();
        !          7559: -      void (*touch)();
        !          7560: -      void (*delete)();
        !          7561: -} ftab[] =
        !          7562: -{
        !          7563: -      { 0L,   ftimeof,        ftouch,         fdelete },
        !          7564: -      { AR,   atimeof,        atouch,         adelete },
        !          7565: -      { 0L,   (long (*)())0 }
        !          7566: -};
        !          7567: -
        !          7568: -long
        !          7569: -timeof(name, force)
        !          7570: -      char *name;
        !          7571: -{
        !          7572: -      char buf[BIGBLOCK], *part2;
        !          7573: -      register struct ftype *f;
        !          7574: -      long magic;
        !          7575: -
        !          7576: -      magic = split(name, buf, &part2);
        !          7577: -      for(f = ftab; f->time; f++)
        !          7578: -              if(f->magic == magic)
        !          7579: -                      return((*f->time)(force, name, buf, part2));
        !          7580: -      Fprint(2, "mk: '%s' appears to have an unknown magic number (%ld)\n", name, magic);
        !          7581: -      Exit();
        !          7582: -      return(0L);     /* shut cyntax up */
        !          7583: -}
        !          7584: -
        !          7585: -void
        !          7586: -touch(name)
        !          7587: -      char *name;
        !          7588: -{
        !          7589: -      char buf[BIGBLOCK], *part2;
        !          7590: -      register struct ftype *f;
        !          7591: -      long magic;
        !          7592: -
        !          7593: -      magic = split(name, buf, &part2);
        !          7594: -      Fprint(1, "touch(%s)\n", name);
        !          7595: -      if(nflag)
        !          7596: -              return;
        !          7597: -      for(f = ftab; f->time; f++)
        !          7598: -              if(f->magic == magic){
        !          7599: -                      (*f->touch)(name, buf, part2);
        !          7600: -                      return;
        !          7601: -              }
        !          7602: -      Fprint(2, "mk: give me a break! I never heard of magic=%ld\n", magic);
        !          7603: -      Exit();
        !          7604: -}
        !          7605: -
        !          7606: -void
        !          7607: -delete(name)
        !          7608: -      char *name;
        !          7609: -{
        !          7610: -      char buf[BIGBLOCK], *part2;
        !          7611: -      register struct ftype *f;
        !          7612: -      long magic;
        !          7613: -
        !          7614: -      magic = split(name, buf, &part2);
        !          7615: -      for(f = ftab; f->time; f++)
        !          7616: -              if(f->magic == magic){
        !          7617: -                      (*f->delete)(name, buf, part2);
        !          7618: -                      return;
        !          7619: -              }
        !          7620: -      Fprint(2, "mk: give me a break! I never heard of magic=%ld\n", magic);
        !          7621: -      Exit();
        !          7622: -}
        !          7623: -
        !          7624: -static long
        !          7625: -type(file)
        !          7626: -      char *file;
        !          7627: -{
        !          7628: -      int fd;
        !          7629: -      char buf[SARMAG];
        !          7630: -      short m;
        !          7631: -      long goo;
        !          7632: -
        !          7633: -      if(access(file, 0) < 0){
        !          7634: -              if(symlook(file, S_BITCH, (char *)0) == 0){
        !          7635: -                      Fprint(1, "%s doesn't exist: assuming it will be an archive\n", file);
        !          7636: -                      (void)symlook(file, S_BITCH, file);
        !          7637: -              }
        !          7638: -              return(AR);
        !          7639: -      }
        !          7640: -      if((fd = open(file, 0)) < 0){
        !          7641: -              perror(file);
        !          7642: -              Exit();
        !          7643: -      }
        !          7644: -      if(read(fd, buf, SARMAG) != SARMAG){
        !          7645: -              close(fd);
        !          7646: -              return(-1L);
        !          7647: -      }
        !          7648: -      if(strncmp(ARMAG, buf, SARMAG) == 0)
        !          7649: -              goo = AR;
        !          7650: -      else {
        !          7651: -              lseek(fd, 0L, 0);
        !          7652: -              if(read(fd, (char *)&m, sizeof m) == sizeof m)
        !          7653: -                      goo = m;
        !          7654: -              else
        !          7655: -                      goo = -1;
        !          7656: -      }
        !          7657: -      close(fd);
        !          7658: -      return(goo);
        !          7659: -}
        !          7660: -
        !          7661: -static long
        !          7662: -split(name, buf, p2)
        !          7663: -      char *name, *buf, **p2;
        !          7664: -{
        !          7665: -      register char *s;
        !          7666: -
        !          7667: -      strcpy(buf, name);
        !          7668: -      if(s = strchr(buf, '(')){
        !          7669: -              *s++ = 0;
        !          7670: -              *p2 = s;
        !          7671: -              while(*s && (*s != ')'))
        !          7672: -                      s++;
        !          7673: -              *s = 0;
        !          7674: -              return(type(buf));
        !          7675: -      } else
        !          7676: -              return(0L);
        !          7677: -}
        !          7678: //GO.SYSIN DD ./t_driver.c
        !          7679: echo ./t_file.c 1>&2
        !          7680: sed 's/.//' >./t_file.c <<'//GO.SYSIN DD ./t_file.c'
        !          7681: -#include      "mk.h"
        !          7682: -#include      <sys/types.h>
        !          7683: -#include      <sys/stat.h>
        !          7684: -#include      <errno.h>
        !          7685: -
        !          7686: -#define       MYSEP(s)        ((*s == ' ') || (*s == ',') || (*s == '\n'))
        !          7687: -
        !          7688: -timeinit(s)
        !          7689: -      register char *s;
        !          7690: -{
        !          7691: -      register long t;
        !          7692: -      register char *os;
        !          7693: -
        !          7694: -      for(t = time((long *)0); *s; s = os){
        !          7695: -              for(os = s; !MYSEP(os); os++)
        !          7696: -                      if(*os == 0){
        !          7697: -                              symlook(strdup(s), S_TIME, (char *)t)->value = (char *)t;
        !          7698: -                              return;
        !          7699: -                      }
        !          7700: -              *os++ = 0;
        !          7701: -              symlook(strdup(s), S_TIME, (char *)t)->value = (char *)t;
        !          7702: -              while(MYSEP(os))
        !          7703: -                      os++;
        !          7704: -      }
        !          7705: -}
        !          7706: -
        !          7707: -long
        !          7708: -ftimeof(force, name)
        !          7709: -      char *name;
        !          7710: -{
        !          7711: -      struct stat sbuf;
        !          7712: -      Symtab *sym;
        !          7713: -
        !          7714: -      if(!force && (sym = symlook(name, S_TIME, (char *)0))){
        !          7715: -              return((long)sym->value);
        !          7716: -      }
        !          7717: -      if(stat(name, &sbuf) < 0)
        !          7718: -              sbuf.st_mtime = 0;
        !          7719: -      symlook(name, S_TIME, (char *)sbuf.st_mtime);
        !          7720: -      return((long)sbuf.st_mtime);
        !          7721: -}
        !          7722: -
        !          7723: -void
        !          7724: -ftouch(name)
        !          7725: -      char *name;
        !          7726: -{
        !          7727: -      int fd;
        !          7728: -      char buf[1];
        !          7729: -      struct stat sbuf;
        !          7730: -
        !          7731: -      if(stat(name, &sbuf) < 0)       /* not there and zero length are same case */
        !          7732: -              sbuf.st_size = 0;
        !          7733: -      if(sbuf.st_size == 0){
        !          7734: -              if((fd = creat(name, 0666)) < 0){
        !          7735: -      bad:
        !          7736: -                      perror(name);
        !          7737: -                      Exit();
        !          7738: -              }
        !          7739: -              close(fd);
        !          7740: -              return;
        !          7741: -      }
        !          7742: -      if((fd = open(name, 2)) < 0)
        !          7743: -              goto bad;
        !          7744: -      if(read(fd, buf, 1) != 1)
        !          7745: -              goto bad;
        !          7746: -      if(lseek(fd, 0L, 0) < 0)
        !          7747: -              goto bad;
        !          7748: -      if(write(fd, buf, 1) != 1)
        !          7749: -              goto bad;
        !          7750: -      close(fd);
        !          7751: -}
        !          7752: -
        !          7753: -void
        !          7754: -fdelete(s)
        !          7755: -      char *s;
        !          7756: -{
        !          7757: -      if(unlink(s) < 0)
        !          7758: -              perror(s);
        !          7759: -}
        !          7760: //GO.SYSIN DD ./t_file.c
        !          7761: echo ./var.c 1>&2
        !          7762: sed 's/.//' >./var.c <<'//GO.SYSIN DD ./var.c'
        !          7763: -#include      "mk.h"
        !          7764: -
        !          7765: -setvar(name, value)
        !          7766: -      char *name;
        !          7767: -      char *value;
        !          7768: -{
        !          7769: -      symlook(name, S_VAR, value)->value = value;
        !          7770: -      symlook(name, S_MAKEVAR, "");
        !          7771: -}
        !          7772: -
        !          7773: -static char **nextv;
        !          7774: -
        !          7775: -static void
        !          7776: -vcopy(s)
        !          7777: -      register Symtab *s;
        !          7778: -{
        !          7779: -      register char **p;
        !          7780: -      extern char *myenv[];
        !          7781: -
        !          7782: -      if(symlook(s->name, S_NOEXPORT, (char *)0))
        !          7783: -              return;
        !          7784: -      for(p = myenv; *p; p++)
        !          7785: -              if(strcmp(*p, s->name) == 0) return;
        !          7786: -      if(*nextv)
        !          7787: -              free(*nextv);
        !          7788: -      *nextv++ = envpr(s->name, s->value);
        !          7789: -}
        !          7790: -
        !          7791: -char **
        !          7792: -vardump(p)
        !          7793: -      char **p;
        !          7794: -{
        !          7795: -      nextv = p;
        !          7796: -      symtraverse(S_VAR, vcopy);
        !          7797: -      *nextv = 0;
        !          7798: -      return(nextv);
        !          7799: -}
        !          7800: -
        !          7801: -static void
        !          7802: -print1(s)
        !          7803: -      register Symtab *s;
        !          7804: -{
        !          7805: -      Fprint(1, "\t%s='%s'\n", s->name, s->value);
        !          7806: -}
        !          7807: -
        !          7808: -dumpv(s)
        !          7809: -      char *s;
        !          7810: -{
        !          7811: -      Fprint(1, "%s:\n", s);
        !          7812: -      symtraverse(S_VAR, print1);
        !          7813: -}
        !          7814: -
        !          7815: -char *
        !          7816: -envpr(name, value)
        !          7817: -      register char *name;
        !          7818: -      register char *value;
        !          7819: -{
        !          7820: -      char buf[BIGBLOCK];
        !          7821: -
        !          7822: -      sprint(buf, "%s=", name);
        !          7823: -      strcpy(strchr(buf, 0), value);
        !          7824: -      return(strdup(buf));
        !          7825: -}
        !          7826: -
        !          7827: -#include      <ctype.h>
        !          7828: -
        !          7829: -char *
        !          7830: -shname(s)
        !          7831: -      char *s;
        !          7832: -{
        !          7833: -      register unsigned char *a = (unsigned char *)s;
        !          7834: -
        !          7835: -      /* always go one !! */
        !          7836: -      a++;
        !          7837: -      while(isalnum(*a) || (*a == '_')) a++;
        !          7838: -      return((char *)a);
        !          7839: -}
        !          7840: //GO.SYSIN DD ./var.c
        !          7841: echo ./word.c 1>&2
        !          7842: sed 's/.//' >./word.c <<'//GO.SYSIN DD ./word.c'
        !          7843: -#include      "mk.h"
        !          7844: -
        !          7845: -Word *
        !          7846: -newword(s)
        !          7847: -      char *s;
        !          7848: -{
        !          7849: -      register Word *w = (Word *)Malloc(sizeof(Word));
        !          7850: -
        !          7851: -      w->s = strdup(s);
        !          7852: -      w->next = 0;
        !          7853: -      return(w);
        !          7854: -}
        !          7855: -
        !          7856: -Word *
        !          7857: -stow(s)
        !          7858: -      char *s;
        !          7859: -{
        !          7860: -      char save;
        !          7861: -      register char *t;
        !          7862: -      Word *head, *w;
        !          7863: -
        !          7864: -      w = head = newword("");
        !          7865: -      while(*s){
        !          7866: -              while(SEP(*s))
        !          7867: -                      s++;
        !          7868: -              if(*s == 0) break;
        !          7869: -              for(t = s; *t && !SEP(*t); t++)
        !          7870: -                      ;
        !          7871: -              save = *t;
        !          7872: -              *t = 0;
        !          7873: -              w->next = newword(s);
        !          7874: -              w = w->next;
        !          7875: -              *t = save;
        !          7876: -              s = t;
        !          7877: -      }
        !          7878: -      w = head->next;
        !          7879: -      delword(head);
        !          7880: -      return(w);
        !          7881: -}
        !          7882: -
        !          7883: -char *
        !          7884: -wtos(w)
        !          7885: -      register Word *w;
        !          7886: -{
        !          7887: -      static char buf[BIGBLOCK];
        !          7888: -      register char *s = buf;
        !          7889: -      register char *t;
        !          7890: -
        !          7891: -      for(; w; w = w->next){
        !          7892: -              for(t = w->s; *t;)
        !          7893: -                      *s++ = *t++;
        !          7894: -              if(w->next)
        !          7895: -                      *s++ = ' ';
        !          7896: -      }
        !          7897: -      *s = 0;
        !          7898: -      return(strdup(buf));
        !          7899: -}
        !          7900: -
        !          7901: -delword(w)
        !          7902: -      Word *w;
        !          7903: -{
        !          7904: -      free(w->s);
        !          7905: -      free((char *)w);
        !          7906: -}
        !          7907: -
        !          7908: -dumpw(s, w)
        !          7909: -      char *s;
        !          7910: -      Word *w;
        !          7911: -{
        !          7912: -      Fprint(1, "%s", s);
        !          7913: -      for(; w; w = w->next)
        !          7914: -              Fprint(1, " '%s'", w->s);
        !          7915: -      Fputc(1, '\n');
        !          7916: -}
        !          7917: //GO.SYSIN DD ./word.c
        !          7918: echo ./ndir.h 1>&2
        !          7919: sed 's/.//' >./ndir.h <<'//GO.SYSIN DD ./ndir.h'
        !          7920: -/* Copyright (c) 1982 Regents of the University of California */
        !          7921: -/* and modified by pjw in 1986 */
        !          7922: -
        !          7923: -/*
        !          7924: - * this must be a power of 2 and a multiple of all the ones in the system
        !          7925: - */
        !          7926: -#define DIRBLKSIZ 512
        !          7927: -
        !          7928: -/*
        !          7929: - * This limits the directory name length. Its main constraint
        !          7930: - * is that it appears twice in the user structure. (u. area) in bsd systems
        !          7931: - */
        !          7932: -#define MAXNAMLEN 255
        !          7933: -
        !          7934: -struct        direct {
        !          7935: -      unsigned long   d_ino;
        !          7936: -      short   d_reclen;
        !          7937: -      short   d_namlen;
        !          7938: -      char    d_name[MAXNAMLEN + 1];
        !          7939: -      /* typically shorter */
        !          7940: -};
        !          7941: -
        !          7942: -struct _dirdesc {
        !          7943: -      int     dd_fd;
        !          7944: -      long    dd_loc;         /* where we left off in dd_buf */
        !          7945: -      long    dd_size;        /* bytes back from system */
        !          7946: -      long    dd_offset;      /* lseek at beginning of dd_buf */
        !          7947: -      char    dd_buf[DIRBLKSIZ];
        !          7948: -};
        !          7949: -
        !          7950: -/*
        !          7951: - * useful macros.
        !          7952: - */
        !          7953: -#define NDIRSIZ(dp) \
        !          7954: -    ((sizeof(struct direct) - MAXNAMLEN + (dp)->d_namlen + sizeof(ino_t) - 1) &\
        !          7955: -    ~(sizeof(ino_t) - 1))
        !          7956: -typedef       struct _dirdesc DIR;
        !          7957: -#ifndef       NULL
        !          7958: -#define       NULL    0
        !          7959: -#endif
        !          7960: -
        !          7961: -/*
        !          7962: - * functions defined on directories
        !          7963: - */
        !          7964: -extern DIR *opendir();
        !          7965: -extern struct direct *readdir();
        !          7966: -extern long telldir();
        !          7967: -extern void seekdir();
        !          7968: -#define rewinddir(dirp)       seekdir((dirp), 0)
        !          7969: -extern void closedir();
        !          7970: //GO.SYSIN DD ./ndir.h
        !          7971: echo ./tmac.an 1>&2
        !          7972: sed 's/.//' >./tmac.an <<'//GO.SYSIN DD ./tmac.an'
        !          7973: -'''\" PWB Manual Entry Macros - 1.36 of 11/11/80
        !          7974: -'''\" Nroff/Troff Version     @(#)1.36
        !          7975: -'''\"  Option -rs1 short (9") pages
        !          7976: -'''\"  Option -rp# set no. of first page, put no. of pgs. on stderr
        !          7977: -'''\"  Option -rd1 give modified date instead of printed date
        !          7978: -.deth
        !          7979: -.tmwrong version of man entry macros - use -man6
        !          7980: -.ab
        !          7981: -..
        !          7982: -.ifn .ds Tm \uTM\d
        !          7983: -.ift .ds Tm \v'-0.5m'\s-4TM\s+4\v'0.5m'
        !          7984: -.de}E
        !          7985: -.}f
        !          7986: -.in\\n()Ru+\\n(INu
        !          7987: -.ll\\n(LLu
        !          7988: -.lt\\n(LLu
        !          7989: -.pl\\n()Lu
        !          7990: -..
        !          7991: -.deDT
        !          7992: -.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
        !          7993: -.ifn .ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n
        !          7994: -..
        !          7995: -.de HY
        !          7996: -.hy14
        !          7997: -..
        !          7998: -.de}f
        !          7999: -.ift .vs \\n()Vp
        !          8000: -.ps\\n()S
        !          8001: -.ft1
        !          8002: -..
        !          8003: -.de}H
        !          8004: -.ev1
        !          8005: -.}C
        !          8006: -.}E
        !          8007: -.ie\\n()s 'sp |2v
        !          8008: -.el'sp |3v
        !          8009: -.".ps\\n()S-1
        !          8010: -.".iet .bd1 3
        !          8011: -.".el.bd1 0
        !          8012: -.tl \\*(]H\\*(]L\\*(]H
        !          8013: -.bd1
        !          8014: -.ps\\n()S
        !          8015: -.ie\\n()s 'sp 1.5v
        !          8016: -.el'sp 3v
        !          8017: -.ev
        !          8018: -.ns
        !          8019: -.if \\n(CL .2C
        !          8020: -..
        !          8021: -.de}F
        !          8022: -.ev1
        !          8023: -.}E
        !          8024: -.if\\n()s 'sp |\\n(.pu-1v-1p
        !          8025: -.if\\n()t 'sp |\\n(.pu-3v
        !          8026: -.ifn 'sp |\\n(.pu-4v
        !          8027: -.ifn .tl Page %\\*(]D\\*(]W
        !          8028: -.if\\n()s .tl - % -
        !          8029: -.if\\n()t \{.if o .tl Page %\\*(]D\\*(]W
        !          8030: -.ife .tl \\*(]W\\*(]DPage % \}
        !          8031: -.ev
        !          8032: -'bp
        !          8033: -..
        !          8034: -.ifn .ig
        !          8035: -.de}C
        !          8036: -.if "\\*(.T"aps"\{\
        !          8037: -.     po0i
        !          8038: -.     lt7.5i
        !          8039: -.     if\\n()s .tl \l0.25i\l0.25i\h1i\l0.25i
        !          8040: -.     if\\n()t .tl \l0.25i\l0.25i
        !          8041: -.     lt
        !          8042: -.     po\}
        !          8043: -..
        !          8044: -.de}M
        !          8045: -.}N
        !          8046: -.wh-.5p }C
        !          8047: -.ll\\n(LLu
        !          8048: -.}P
        !          8049: -..
        !          8050: -.de}K
        !          8051: -.}N
        !          8052: -.pl1
        !          8053: -.ll\\n(LLu
        !          8054: -..
        !          8055: -.de}P
        !          8056: -.nr )P \\n%+1-\\np
        !          8057: -.if \\nq .tm \\n(.F \\n()P \\np
        !          8058: -.bp
        !          8059: -.if \\nq .nr p \\n%
        !          8060: -..
        !          8061: -.deTH
        !          8062: -.PD
        !          8063: -.nrIN \\n()Mu
        !          8064: -.ift .ds ]H \\$1\^(\^\\$2\^)
        !          8065: -.ifn .ds ]H \\$1(\\$2)
        !          8066: -.if\\n()s .ds ]D
        !          8067: -.if\\n()t .ds ]D Tenth Edition
        !          8068: -.ifn .ds ]D Tenth Edition
        !          8069: -.ds]L
        !          8070: -.if!\\$3 .ds ]L (\^\\$3\^)
        !          8071: -.if!\\$4 .ds ]D \\$4
        !          8072: -.wh0 }H
        !          8073: -.wh-\\n(:mu }F
        !          8074: -.em}M
        !          8075: -.if\\n(nl .}P
        !          8076: -.nr)I \\n()Mu
        !          8077: -.nr)R 0
        !          8078: -.}E
        !          8079: -.DT
        !          8080: -.ifn \{.na
        !          8081: -.nh\}
        !          8082: -.ift \{.bd S 3 3
        !          8083: -.HY \}
        !          8084: -..
        !          8085: -.deSH
        !          8086: -.PD
        !          8087: -.}X 0 "\\$1" smaller
        !          8088: -.nr)E 2
        !          8089: -\&\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6
        !          8090: -..
        !          8091: -.deSS
        !          8092: -.}X 3n "" ""
        !          8093: -.nr)E 2
        !          8094: -\&\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6
        !          8095: -..
        !          8096: -.de}X
        !          8097: -.}E
        !          8098: -.ti\\$1
        !          8099: -.sp\\n(PDu
        !          8100: -.ne1.1v
        !          8101: -.nr)R 0
        !          8102: -.fi
        !          8103: -'''ss12
        !          8104: -'''if\\$2SYNOPSIS .ss 18
        !          8105: -.it1 }N
        !          8106: -.if!\\$3 .SM
        !          8107: -.iet .bd1 3
        !          8108: -.el.bd1 0
        !          8109: -..
        !          8110: -.de}2
        !          8111: -.nr)E 0
        !          8112: -.}E
        !          8113: -.nr)I \\n()Mu
        !          8114: -.ns
        !          8115: -.bd1
        !          8116: -..
        !          8117: -.deSM
        !          8118: -.nh
        !          8119: -.ps\\n()S-1
        !          8120: -.if!\\$1 \&\\$1
        !          8121: -.if!\\$2 \&\\$2
        !          8122: -.if!\\$3 \&\\$3
        !          8123: -.if!\\$4 \&\\$4
        !          8124: -.if!\\$5 \&\\$5
        !          8125: -.if!\\$6 \&\\$6
        !          8126: -.if!\\$1 .ps \\n()S
        !          8127: -.if\\$1 .it 1 }N
        !          8128: -.HY
        !          8129: -..
        !          8130: -.deI
        !          8131: -.nh
        !          8132: -.ft2
        !          8133: -.it1 }N
        !          8134: -.if!\\$1 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
        !          8135: -.HY
        !          8136: -..
        !          8137: -.deB
        !          8138: -.nh
        !          8139: -.it1 }N
        !          8140: -.ie!\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
        !          8141: -.el .ft5
        !          8142: -.HY
        !          8143: -..
        !          8144: -.deL
        !          8145: -.nh
        !          8146: -.it1 }N
        !          8147: -.ift \{.ie!\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
        !          8148: -.el .ft5 \}
        !          8149: -.ifn \{.ft5
        !          8150: -.if!\\$1 \{.ie\\$2 `\\$1'
        !          8151: -.el .ie\\$3 `\\$1 \\$2'
        !          8152: -.el .ie\\$4 `\\$1 \\$2 \\$3'
        !          8153: -.el .ie\\$5 `\\$1 \\$2 \\$3 \\$4'
        !          8154: -.el .ie\\$6 `\\$1 \\$2 \\$3 \\$4 \\$5'
        !          8155: -.el `\\$1 \\$2 \\$3 \\$4 \\$5 \\$6'\}\}
        !          8156: -.HY
        !          8157: -..
        !          8158: -.deF
        !          8159: -.nh
        !          8160: -.it1 }N
        !          8161: -.ie!\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
        !          8162: -.el .ft5
        !          8163: -.HY
        !          8164: -..
        !          8165: -.deRI
        !          8166: -.nh
        !          8167: -.}S 1 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
        !          8168: -.HY
        !          8169: -.}f
        !          8170: -..
        !          8171: -.deIR
        !          8172: -.nh
        !          8173: -.}S 2 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
        !          8174: -.HY
        !          8175: -.}f
        !          8176: -..
        !          8177: -.deIB
        !          8178: -.nh
        !          8179: -.ift .}S 2 5 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
        !          8180: -.ifn .}S 2 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
        !          8181: -.HY
        !          8182: -.}f
        !          8183: -..
        !          8184: -.deRB
        !          8185: -.nh
        !          8186: -.ift .}S 1 5 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
        !          8187: -.ifn .}S 1 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
        !          8188: -.HY
        !          8189: -.}f
        !          8190: -..
        !          8191: -.deBR
        !          8192: -.nh
        !          8193: -.ift .}S 5 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
        !          8194: -.ifn .}S 1 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
        !          8195: -.HY
        !          8196: -.}f
        !          8197: -..
        !          8198: -.deBI
        !          8199: -.nh
        !          8200: -.ift .}S 5 2 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
        !          8201: -.ifn .}S 1 2 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
        !          8202: -.HY
        !          8203: -.}f
        !          8204: -..
        !          8205: -.de LR
        !          8206: -.nh
        !          8207: -.ift \%\&\f5\\$1\f1\\$2
        !          8208: -.ifn \%`\\$1'\\$2
        !          8209: -.HY
        !          8210: -..
        !          8211: -.de RL
        !          8212: -.nh
        !          8213: -.ift \%\&\f1\\$1\\f5\\$2\\f1\\$3
        !          8214: -.ifn \%\\$1`\\$2'\\$3
        !          8215: -.HY
        !          8216: -..
        !          8217: -.de}S
        !          8218: -.ds]F
        !          8219: -.if\\$12 .if !\\$5 .ds ]F \^
        !          8220: -.if\\$22 .if !\\$5 .ds ]F \^
        !          8221: -.ie!\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(]F" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9"
        !          8222: -.el\\$3
        !          8223: -.}f
        !          8224: -..
        !          8225: -.deFR
        !          8226: -\%\&\f5\\$1\f1\\$2 \\$3 \\$4 \\$5 \\$6
        !          8227: -..
        !          8228: -.deRF
        !          8229: -\%\&\f1\\$1\f5\\$2\f1\\$3
        !          8230: -..
        !          8231: -.deEX
        !          8232: -.ift .ft5
        !          8233: -.nf
        !          8234: -..
        !          8235: -.deEE
        !          8236: -.ft1
        !          8237: -.fi
        !          8238: -..
        !          8239: -.dePP
        !          8240: -.sp\\n(PDu
        !          8241: -.ne1.1v
        !          8242: -.}E
        !          8243: -.nr)I \\n()Mu
        !          8244: -.ns
        !          8245: -..
        !          8246: -.deP
        !          8247: -.PP
        !          8248: -..
        !          8249: -.deLP
        !          8250: -.PP
        !          8251: -..
        !          8252: -.dePD
        !          8253: -.ift .nr PD .4v
        !          8254: -.ifn .nr PD 1v
        !          8255: -.if!\\$1 .nr PD \\$1v
        !          8256: -..
        !          8257: -.deHP
        !          8258: -.sp\\n(PDu
        !          8259: -.ne1.1v
        !          8260: -.if!\\$1 .nr )I \\$1n
        !          8261: -.ll\\n(LLu
        !          8262: -.in\\n()Ru+\\n(INu+\\n()Iu
        !          8263: -.ti\\n()Ru+\\n(INu
        !          8264: -.}f
        !          8265: -..
        !          8266: -.deIP
        !          8267: -.ie!\\$1 \{.TP "\\$2"
        !          8268: -\&\\$1\}
        !          8269: -.el\{.sp\\n(PDu
        !          8270: -.ne1.1v
        !          8271: -.if!\\$2 .nr )I \\$2n
        !          8272: -.}f
        !          8273: -.ll\\n(LLu
        !          8274: -.in\\n()Ru+\\n(INu+\\n()Iu
        !          8275: -.lg\}
        !          8276: -..
        !          8277: -.deTP
        !          8278: -.if!\\$1 \{.nr )I \\$1n
        !          8279: -.if\\$10 .nr )I \\n()M\}
        !          8280: -.sp\\n(PDu
        !          8281: -.ne1.1v
        !          8282: -.in\\n()Ru
        !          8283: -.lg0
        !          8284: -.ns
        !          8285: -.it1 }N
        !          8286: -.nr)E 1
        !          8287: -.di]B
        !          8288: -..
        !          8289: -.deTF
        !          8290: -.IP "" \w'\f5\\$1\ \ \fP'u
        !          8291: -.PD0
        !          8292: -..
        !          8293: -.de}1
        !          8294: -.ds]X \&\\*(]B\\
        !          8295: -.rm]B
        !          8296: -.nr)E 0
        !          8297: -.if!\\$1 .nr )I \\$1n
        !          8298: -.}f
        !          8299: -.ll\\n(LLu
        !          8300: -.in\\n()Ru+\\n(INu+\\n()Iu
        !          8301: -.ti\\n(INu
        !          8302: -.ie!\\n()Iu+\\n()Ru-\w\\*(]Xu-3p \{\\*(]X
        !          8303: -.br\}
        !          8304: -.el\\*(]X\h|\\n()Iu+\\n()Ru\c
        !          8305: -.}f
        !          8306: -.lg
        !          8307: -..
        !          8308: -.de}N
        !          8309: -.if\\n()E .br
        !          8310: -.if\\n()E1 .di
        !          8311: -.if\\n()E0 .}f
        !          8312: -.if\\n()E1 .}1
        !          8313: -.if\\n()E2 .}2
        !          8314: -..
        !          8315: -.deRS
        !          8316: -.nr]\\n+()p \\n()I
        !          8317: -.nr)\\n()p \\n()R
        !          8318: -.ie!\\$1 .nr )R +\\$1n
        !          8319: -.el.nr )R +\\n()I
        !          8320: -.nr)I \\n()Mu
        !          8321: -.}E
        !          8322: -..
        !          8323: -.deRE
        !          8324: -.if!\\$1 \{.ie \\$10 .nr )p 1 1
        !          8325: -.el.nr )p \\$1 1 \}
        !          8326: -.ds]i \\*(]I\\n()p
        !          8327: -.ds]r \\*(]R\\n()p
        !          8328: -.nr)I \\*(]i
        !          8329: -.nr)R \\*(]r
        !          8330: -.if\\n()p .nr )p -1
        !          8331: -.}E
        !          8332: -..
        !          8333: -'''\" .2C begin 2-column display, by diversion
        !          8334: -'''\"   CC=amount of text that will fit on page
        !          8335: -'''\" CL=1 multicolumn in effect, else 0
        !          8336: -'''\" CI saved indent
        !          8337: -'''\" CB contains diverted text
        !          8338: -.de 2C
        !          8339: -.ne 2
        !          8340: -.nf
        !          8341: -.nr CC \\n(.t/1v*2v
        !          8342: -.nr CI \\n(IN
        !          8343: -.nr IN 0
        !          8344: -.di CB
        !          8345: -.nr CL 1
        !          8346: -.}E
        !          8347: -.dt \\n(CCu C1
        !          8348: -..
        !          8349: -'''\" .1C return to 1-column
        !          8350: -.de 1C
        !          8351: -.nr CL 0
        !          8352: -.C1
        !          8353: -.fi
        !          8354: -..
        !          8355: -'''\" end of diversion, at end of page or return to 1-column
        !          8356: -'''\" CC=pos of nominal column end
        !          8357: -.de C1
        !          8358: -.dt
        !          8359: -\!.C3
        !          8360: -.di
        !          8361: -.if \\n(dn \{.nr CC \\n(dnu/2u+\\n(nlu
        !          8362: -.wh \\n(CCu C2
        !          8363: -.mk
        !          8364: -.nf
        !          8365: -.nr IN \\n(CIu
        !          8366: -.}E
        !          8367: -.CB \}
        !          8368: -..
        !          8369: -'''\" end of first column retrieved from diversion
        !          8370: -'''\" CC=pos of actual column end
        !          8371: -.de C2
        !          8372: -.wh \\n(CCu
        !          8373: -.mk CC
        !          8374: -.po +(\\n(LLu/2u)u
        !          8375: -.rt
        !          8376: -.if \\n(dn>1v .ns
        !          8377: -..
        !          8378: -'''\" end of second column
        !          8379: -.de C3
        !          8380: -.br
        !          8381: -.po -(\\n(LLu/2u)u
        !          8382: -.if \\n(CC>\\n(nl .sp |\\n(CCu
        !          8383: -.ne 2
        !          8384: -..
        !          8385: -.dePM
        !          8386: -.if\\$1 .nr !K 0
        !          8387: -.if\w\\$1 \{\
        !          8388: -.ie\\$1P .nr !K 1
        !          8389: -.el.ie \\$1BP .nr !K 3
        !          8390: -.el.ie \\$1BR .nr !K 4
        !          8391: -.el.nr !K 2 \}
        !          8392: -.if\\n(!K .wh -(\\n(:mu+5v) )G
        !          8393: -..
        !          8394: -.de)G
        !          8395: -.if\\n(!K 'sp 2v
        !          8396: -.ie\\n(!K=1 \{\
        !          8397: -.iet .bd1 3
        !          8398: -.el.bd1 0
        !          8399: -.tlPRIVATE
        !          8400: -.bd1
        !          8401: -.tlThis information should not be disclosed to unauthorized persons.
        !          8402: -.tlIt is meant solely for use by authorized Bell System employees. \}
        !          8403: -.el.ie \\n(!K=3 \{\
        !          8404: -.iet .bd1 3
        !          8405: -.el.bd1 0
        !          8406: -.tlBELL LABORATORIES PROPRIETARY
        !          8407: -.bd1
        !          8408: -.tlNot for use or disclosure outside Bell Laboratories except by
        !          8409: -.tlwritten approval of the director of the distributing organization. \}
        !          8410: -.el.ie \\n(!K=4 \{\
        !          8411: -.iet .bd1 3
        !          8412: -.el.bd1 0
        !          8413: -.tlBELL LABORATORIES RESTRICTED
        !          8414: -.bd1
        !          8415: -.tlThe information herein is meant solely for use by authorized
        !          8416: -.tlBell Laboratories employees and is not to be disclosed to others. \}
        !          8417: -.el.if \\n(!K=2 \{\
        !          8418: -.iet .bd1 3
        !          8419: -.el.bd1 0
        !          8420: -.tlNOTICE
        !          8421: -.bd1
        !          8422: -.tlNot for use or disclosure outside the
        !          8423: -.tlBell System except under written agreement. \}
        !          8424: -..
        !          8425: -.nr)s 0
        !          8426: -.ift .if \ns .nr )s 1
        !          8427: -.nr)t 0
        !          8428: -.ift .if !\ns .nr )t 1
        !          8429: -.if\n()s \{.nr )L 9i
        !          8430: -.nrLL 4.75i
        !          8431: -.nr)O .75i
        !          8432: -.nr)S 9
        !          8433: -.nr)V 10 \}
        !          8434: -.if\n()t \{.nr )L 11i
        !          8435: -.nrLL 6.5i
        !          8436: -.nr)O 1i
        !          8437: -.nr)S 10
        !          8438: -.nr)V 12 \}
        !          8439: -.ift \{.ds R \(rg
        !          8440: -.dsS \s\n()S
        !          8441: -..\}
        !          8442: -.ifn \{.nr )L 11i
        !          8443: -.nrLL 6.5i
        !          8444: -.nr)O .463i
        !          8445: -.if '\*(.T'think' \{.nrLL 80n
        !          8446: -.nr)O 0\}
        !          8447: -.if '\*(.T'thinksmall' \{.nrLL 142n
        !          8448: -.vs 9p
        !          8449: -.nr)O 0\}
        !          8450: -.dsR (Reg.)
        !          8451: -.dsS
        !          8452: -..\}
        !          8453: -.if\nT .nr LL 80n
        !          8454: -.if\nV>1 \{
        !          8455: -.nrLL 82n
        !          8456: -.nr)L 84v
        !          8457: -.rmul \}
        !          8458: -.nr)p 0 1
        !          8459: -.ds]I \\\\n(]
        !          8460: -.ds]R \\\\n()
        !          8461: -.if\nd0 .nr m \n(mo-1
        !          8462: -.if\nm0 .ds ]m January
        !          8463: -.if\nm1 .ds ]m February
        !          8464: -.if\nm2 .ds ]m March
        !          8465: -.if\nm3 .ds ]m April
        !          8466: -.if\nm4 .ds ]m May
        !          8467: -.if\nm5 .ds ]m June
        !          8468: -.if\nm6 .ds ]m July
        !          8469: -.if\nm7 .ds ]m August
        !          8470: -.if\nm8 .ds ]m September
        !          8471: -.if\nm9 .ds ]m October
        !          8472: -.if\nm10 .ds ]m November
        !          8473: -.if\nm11 .ds ]m December
        !          8474: -.ifn \{.nr m \nm+1
        !          8475: -.ie\nd .ds ]W (last mod. \nm/\nd/\ny)
        !          8476: -.el.ds ]W (printed \n(mo/\n(dy/\n(yr)
        !          8477: -..\}
        !          8478: -.if\n()s .ds ]W
        !          8479: -.if\n()t \{.ie \nd .ds ]W \*(]m \nd, 19\ny
        !          8480: -.el.ds ]W \*(]m \n(dy, 19\n(yr
        !          8481: -..\}
        !          8482: -.pl\n()Lu
        !          8483: -.ll\n(LLu
        !          8484: -.lt\n(LLu
        !          8485: -.po\n()Ou
        !          8486: -.fp 5 L CW
        !          8487: -.ift .tr \``\''
        !          8488: -.}f
        !          8489: -.if\n()s .nr :m 3.5v
        !          8490: -.if\n()t .nr :m 6v
        !          8491: -.ifn .nr :m 7v
        !          8492: -.ift .nr )M 3.6m
        !          8493: -.ifn .nr )M 5n
        !          8494: -.em}K
        !          8495: -.nr q \np
        !          8496: -.if!\np .nr p 1
        !          8497: -.pn \np
        !          8498: //GO.SYSIN DD ./tmac.an
        !          8499: echo ./mkfile 1>&2
        !          8500: sed 's/.//' >./mkfile <<'//GO.SYSIN DD ./mkfile'
        !          8501: -NAMES=alloc arc bquote builtins dir expand gen glob graph job\
        !          8502: -      lex main makefile match mk parse quote\
        !          8503: -      recipe regexp rule run shprint sig symtab t_ar t_driver t_file var word
        !          8504: -OBJ=${NAMES:%=%.o}
        !          8505: -NPROC=2
        !          8506: -BUILTINS=
        !          8507: -# for profiling, use -p -DPROF
        !          8508: -CFLAGS=-I.. -DSYSV
        !          8509: -
        !          8510: -nmk:  $OBJ
        !          8511: -      $CC $CFLAGS -o nmk $OBJ fio/fio.a libc/libc.a math/math.a
        !          8512: -
        !          8513: -goo:V:        nmk
        !          8514: -      nmk
        !          8515: -
        !          8516: -clean:V:
        !          8517: -      rm -f cyntax nmk *.o O/*
        !          8518: -
        !          8519: -install:V:    nmk
        !          8520: -      cp nmk /usr/bin/mk
        !          8521: -      strip /usr/bin/mk
        !          8522: -
        !          8523: -pp:V:
        !          8524: -      pr *.h *.c | lp -dpsu -n2
        !          8525: -
        !          8526: -%.o:  mk.h
        !          8527: -
        !          8528: -%.o:  %.c
        !          8529: -      $CC $CFLAGS -c $stem.c
        !          8530: -
        !          8531: -tut.out:      tut.ms
        !          8532: -      pic tut.ms | tbl | troff -Tpost -ms > tut.out
        !          8533: -
        !          8534: -sane:V:       nmk
        !          8535: -      cp nmk goo
        !          8536: -      rm arc.o; goo -e
        !          8537: -      goo -e -wjob.o
        !          8538: -
        !          8539: -poot:V:       nmk
        !          8540: -      echo 'pooter Any Dk,g nj/fart/whistle.uucp' >> /n/research/usr/lib/uucp/Systems.dk
        !          8541: -      ./nmk -k -i -f /usr/lib/upas/mkfile NPROC=1 systems
        !          8542: //GO.SYSIN DD ./mkfile

unix.superglobalmegacorp.com

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