Annotation of researchv10no/cmd/mk/agh4, revision 1.1

1.1     ! root        1: From utstat.toronto.edu!geoff Sun May 13 03:36:46 EDT 1990
        !             2: Received: by pyxis; Sun May 13 03:37 EDT 1990
        !             3: Received: by inet.att.com; Sun May 13 03:36 EDT 1990
        !             4: From: [email protected]
        !             5: Date: Sun, 13 May 90 03:36:46 EDT
        !             6: To: [email protected]
        !             7: 
        !             8: Here are the files I changed in mk to make it use varargs
        !             9: (fio/fioprint.c, libc/doprint.c, libc/print.c).  The new version of mk
        !            10: seems to work fine on our Suns and SGI (for the first time on the SGI)
        !            11: and lints more cleanly than before.  I didn't make it use stdarg.h,
        !            12: but that should be fairly mechanical.
        !            13: 
        !            14: The functions called from within doprint now get a va_list* as first
        !            15: argument instead of a char* and the size they return isn't used to
        !            16: advance along the stack (va_arg does that now).  This will mean some
        !            17: changes to manual pages (sorry).
        !            18: 
        !            19: 
        !            20: # To unbundle, sh this file
        !            21: mkdir fio libc
        !            22: echo fio/fioprint.c 1>&2
        !            23: sed 's/^-//' >fio/fioprint.c <<'!'
        !            24: -#define       FIO_IMP
        !            25: -#include      <varargs.h>
        !            26: -#include      <fio.h>
        !            27: 
        !            28: -/* VARARGS 2 */
        !            29: -Fprint(f, fmt, va_alist)
        !            30: int f;
        !            31: char *fmt;
        !            32: va_dcl
        !            33: -{
        !            34: -      char buf[FIOBSIZE], *out;
        !            35: -      register long n;
        !            36: -      va_list ap;
        !            37: -      extern char *doprint();
        !            38: 
        !            39: -      va_start(ap);
        !            40: -      out = doprint(buf, fmt, &ap);
        !            41: -      va_end(ap);
        !            42: -      n = out-buf;
        !            43: -      if(Fwrite(f, buf, n) != n)
        !            44: -              return(-1);
        !            45: -      else
        !            46: -              return((int)n);
        !            47: -}
        !            48: !
        !            49: echo libc/doprint.c 1>&2
        !            50: sed 's/^-//' >libc/doprint.c <<'!'
        !            51: -#include <varargs.h>
        !            52: 
        !            53: -#define       SIZE    1024
        !            54: -#define       FUNSIGN 4
        !            55: -#define       FSHORT  2
        !            56: -#define       FLONG   1
        !            57: -#define       PTR     sizeof (char *)
        !            58: -#define       SHORT   sizeof (int)
        !            59: -#define       INT     sizeof (int)
        !            60: -#define       LONG    sizeof (long)
        !            61: -#define       FLOAT   sizeof (double)
        !            62: -#define       FDIGIT  30
        !            63: -#define       FDEFLT  8
        !            64: -#define       IDIGIT  40
        !            65: -#define       MAXCONV 30
        !            66: 
        !            67: static char    *out, *eout;
        !            68: static         convcount  = { 13 };
        !            69: 
        !            70: static noconv();
        !            71: static cconv(), dconv(), hconv(), lconv();
        !            72: static oconv(), sconv(), uconv(), xconv();
        !            73: 
        !            74: static econv(), fconv(), gconv(), percent();
        !            75: int    printcol;
        !            76: static
        !            77: int    (*fmtconv[MAXCONV])() =
        !            78: -{
        !            79: -      noconv,
        !            80: -      cconv, dconv, hconv, lconv,
        !            81: -      oconv, sconv, uconv, xconv,
        !            82: -      econv, fconv, gconv, percent,
        !            83: -};
        !            84: static
        !            85: char   fmtindex[128] =
        !            86: -{
        !            87: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !            88: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !            89: -      0, 0, 0, 0, 0,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !            90: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !            91: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !            92: -      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        !            93: -      0, 0, 0, 1, 2, 9,10,11, 3, 0, 0, 0, 4, 0, 0, 5,
        !            94: -      0, 0, 0, 6, 0, 7, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
        !            95: -};
        !            96: 
        !            97: fmtinstall(c, f)
        !            98: char c;
        !            99: int (*f)();
        !           100: -{
        !           101: 
        !           102: -      c &= 0177;
        !           103: -      if(fmtindex[c] == 0) {
        !           104: -              if(convcount >= MAXCONV)
        !           105: -                      return 1;
        !           106: -              fmtindex[c] = convcount++;
        !           107: -      }
        !           108: -      fmtconv[fmtindex[c]] = f;
        !           109: -      return 0;
        !           110: -}
        !           111: 
        !           112: char*
        !           113: donprint(s, es, fmt, argpp)
        !           114: char *s, *es;
        !           115: register char *fmt;
        !           116: va_list *argpp;
        !           117: -{
        !           118: -      register int f1, f2, f3, sf1, c;
        !           119: -      char *sout, *seout;
        !           120: 
        !           121: -      sout = out;
        !           122: -      seout = eout;
        !           123: -      out = s;
        !           124: -      eout = es-1;
        !           125: loop:
        !           126: -      c = *fmt++;
        !           127: -      if(c != '%') {
        !           128: -              if(c == 0) {
        !           129: -                      *out = 0;
        !           130: -                      s = out;
        !           131: -                      out = sout;
        !           132: -                      eout = seout;
        !           133: -                      return s;
        !           134: -              }
        !           135: -              if(out < eout)
        !           136: -                      *out++ = c;
        !           137: -              printcol++;
        !           138: -              if(c == '\n')
        !           139: -                      printcol = 0; else
        !           140: -              if(c == '\t')
        !           141: -                      printcol = (printcol+7) & ~7;
        !           142: -              goto loop;
        !           143: -      }
        !           144: -      f1 = 0;
        !           145: -      f2 = -1;
        !           146: -      f3 = 0;
        !           147: -      c = *fmt++;
        !           148: -      sf1 = 0;
        !           149: -      if(c == '-') {
        !           150: -              sf1 = 1;
        !           151: -              c = *fmt++;
        !           152: -      }
        !           153: -      while(c >= '0' && c <= '9') {
        !           154: -              f1 = f1*10 + c-'0';
        !           155: -              c = *fmt++;
        !           156: -      }
        !           157: -      if(sf1)
        !           158: -              f1 = -f1;
        !           159: -      if(c != '.')
        !           160: -              goto l1;
        !           161: -      c = *fmt++;
        !           162: -      while(c >= '0' && c <= '9') {
        !           163: -              if(f2 < 0)
        !           164: -                      f2 = 0;
        !           165: -              f2 = f2*10 + c-'0';
        !           166: -              c = *fmt++;
        !           167: -      }
        !           168: l1:
        !           169: -      if(c == 0)
        !           170: -              fmt--;
        !           171: -      /* NB: first arg is now a (va_list *) */
        !           172: -      c = (*fmtconv[fmtindex[c&0177]])(argpp, f1, f2, f3);
        !           173: -      if(c < 0) {
        !           174: -              f3 |= -c;
        !           175: -              c = *fmt++;
        !           176: -              goto l1;
        !           177: -      }
        !           178: -#ifdef notdef
        !           179: -      argp += c;      /* increment is now done in called routine by va_arg() */
        !           180: -#endif
        !           181: -      goto loop;
        !           182: -}
        !           183: 
        !           184: numbconv(o, f1, f2, f3, b)
        !           185: va_list *o;
        !           186: -{
        !           187: -      char s[IDIGIT];
        !           188: -      register long v;
        !           189: -      register int i, f, n, r;
        !           190: 
        !           191: -      switch(f3 & (FLONG|FSHORT|FUNSIGN)) {
        !           192: -      case FLONG:
        !           193: -              v = va_arg(*o, long);
        !           194: -              r = LONG;
        !           195: -              break;
        !           196: 
        !           197: -      case FUNSIGN|FLONG:
        !           198: -              v = va_arg(*o, unsigned long);
        !           199: -              r = LONG;
        !           200: -              break;
        !           201: 
        !           202: -      /* NB: a (unsigned) short argument is promoted to an (unsigned) int arg. */
        !           203: -      case FSHORT:
        !           204: -              v = (short)va_arg(*o, int);
        !           205: -              r = SHORT;
        !           206: -              break;
        !           207: 
        !           208: -      case FUNSIGN|FSHORT:
        !           209: -              v = (unsigned short)va_arg(*o, unsigned);
        !           210: -              r = SHORT;
        !           211: -              break;
        !           212: 
        !           213: -      default:
        !           214: -              v = va_arg(*o, int);
        !           215: -              r = INT;
        !           216: -              break;
        !           217: 
        !           218: -      case FUNSIGN:
        !           219: -              v = va_arg(*o, unsigned);
        !           220: -              r = INT;
        !           221: -              break;
        !           222: -      }
        !           223: -      f = 0;
        !           224: -      if(!(f3 & FUNSIGN) && v < 0) {
        !           225: -              v = -v;
        !           226: -              f = 1;
        !           227: -      }
        !           228: -      s[IDIGIT-1] = 0;
        !           229: -      for(i = IDIGIT-2; i >= 1; i--) {
        !           230: -              n = (unsigned long)v % b;
        !           231: -              n += '0';
        !           232: -              if(n > '9')
        !           233: -                      n += 'a' - ('9'+1);
        !           234: -              s[i] = n;
        !           235: -              v = (unsigned long)v / b;
        !           236: -              if(f2 >= 0 && i >= IDIGIT-f2)
        !           237: -                      continue;
        !           238: -              if(v <= 0)
        !           239: -                      break;
        !           240: -      }
        !           241: -      if(f)
        !           242: -              s[--i] = '-';
        !           243: -      strconv(s+i, f1, -1);
        !           244: -      return r;
        !           245: -}
        !           246: 
        !           247: char*
        !           248: doprint(s, fmt, argp)
        !           249: char *s, *fmt;
        !           250: va_list *argp;
        !           251: -{
        !           252: 
        !           253: -      return donprint(s, s+SIZE, fmt, argp);
        !           254: -}
        !           255: 
        !           256: -/*
        !           257: -      if you change this, change chconv
        !           258: -*/
        !           259: 
        !           260: strconv(o, f1, f2)
        !           261: char *o;
        !           262: -{
        !           263: -      register int n, c;
        !           264: -      register char *s;
        !           265: 
        !           266: -      n = 0;
        !           267: -      for(s = o; *s++;)
        !           268: -              n++;
        !           269: -      if(f1 >= 0)
        !           270: -              while(n < f1) {
        !           271: -                      if(out < eout)
        !           272: -                              *out++ = ' ';
        !           273: -                      printcol++;
        !           274: -                      n++;
        !           275: -              }
        !           276: -      for(s=o; c = *s++;)
        !           277: -              if(f2 != 0) {
        !           278: -                      if(out < eout)
        !           279: -                              *out++ = c;
        !           280: -                      printcol++;
        !           281: -                      if(c == '\n')
        !           282: -                              printcol = 0; else
        !           283: -                      if(c == '\t')
        !           284: -                              printcol = (printcol+7) & ~7;
        !           285: -                      f2--;
        !           286: -              }
        !           287: -      if(f1 < 0) {
        !           288: -              f1 = -f1;
        !           289: -              while(n < f1) {
        !           290: -                      if(out < eout)
        !           291: -                              *out++ = ' ';
        !           292: -                      printcol++;
        !           293: -                      n++;
        !           294: -              }
        !           295: -      }
        !           296: -}
        !           297: 
        !           298: chconv(o, f1)
        !           299: char o;
        !           300: -{
        !           301: -      register int n;
        !           302: 
        !           303: -      n = 1;
        !           304: -      if(f1 >= 0)
        !           305: -              while(n < f1) {
        !           306: -                      if(out < eout)
        !           307: -                              *out++ = ' ';
        !           308: -                      printcol++;
        !           309: -                      n++;
        !           310: -              }
        !           311: -      if(out < eout)
        !           312: -              *out++ = o;
        !           313: -      printcol++;
        !           314: -      if(o == '\n')
        !           315: -              printcol = 0; else
        !           316: -      if(o == '\t')
        !           317: -              printcol = (printcol+7) & ~7;
        !           318: -      if(f1 < 0) {
        !           319: -              f1 = -f1;
        !           320: -              while(n < f1) {
        !           321: -                      if(out < eout)
        !           322: -                              *out++ = ' ';
        !           323: -                      printcol++;
        !           324: -                      n++;
        !           325: -              }
        !           326: -      }
        !           327: -}
        !           328: 
        !           329: -/* ARGSUSED */
        !           330: static
        !           331: noconv(o, f1, f2, f3)
        !           332: char *o;
        !           333: -{
        !           334: 
        !           335: -      strconv("***", 0, -1);
        !           336: -      return 0;
        !           337: -}
        !           338: 
        !           339: -/* ARGSUSED */
        !           340: static
        !           341: cconv(o, f1, f2, f3)
        !           342: va_list *o;
        !           343: -{
        !           344: -      chconv((char)va_arg(*o, int), f1);
        !           345: -      return INT;
        !           346: -}
        !           347: 
        !           348: static
        !           349: dconv(o, f1, f2, f3)
        !           350: va_list *o;
        !           351: -{
        !           352: -      int r;
        !           353: 
        !           354: -      r = numbconv(o, f1, f2, f3, 10);
        !           355: -      return r;
        !           356: -}
        !           357: 
        !           358: -/* ARGSUSED */
        !           359: static
        !           360: hconv(o, f1, f2, f3)
        !           361: -{
        !           362: -      return -FSHORT;
        !           363: -}
        !           364: 
        !           365: -/* ARGSUSED */
        !           366: static
        !           367: lconv(o, f1, f2, f3)
        !           368: -{
        !           369: 
        !           370: -      return -FLONG;
        !           371: -}
        !           372: 
        !           373: static
        !           374: oconv(o, f1, f2, f3)
        !           375: va_list *o;
        !           376: -{
        !           377: -      int r;
        !           378: 
        !           379: -      r = numbconv(o, f1, f2, f3, 8);
        !           380: -      return r;
        !           381: -}
        !           382: 
        !           383: -/* ARGSUSED */
        !           384: static
        !           385: sconv(o, f1, f2, f3)
        !           386: va_list *o;
        !           387: -{
        !           388: 
        !           389: -      strconv(va_arg(*o, char *), f1, f2);
        !           390: -      return PTR;
        !           391: -}
        !           392: 
        !           393: -/* ARGSUSED */
        !           394: static
        !           395: uconv(o, f1, f2, f3)
        !           396: -{
        !           397: -      return -FUNSIGN;
        !           398: -}
        !           399: 
        !           400: static
        !           401: xconv(o, f1, f2, f3)
        !           402: va_list *o;
        !           403: -{
        !           404: -      int r;
        !           405: 
        !           406: -      r = numbconv(o, f1, f2, f3, 16);
        !           407: -      return r;
        !           408: -}
        !           409: 
        !           410: double pow10(), frexp();
        !           411: -/* ARGSUSED */
        !           412: fltconv(f, f1, f2, f3, c)
        !           413: register double f;
        !           414: -{
        !           415: -      char s1[FDIGIT+10], s2[FDIGIT+10];
        !           416: -      register double g;
        !           417: -      register int d, i, n, s;
        !           418: -      double h;
        !           419: -      int e;
        !           420: -      int c1, c2, c3;
        !           421: 
        !           422: -      s = 0;
        !           423: -      if(f < 0) {
        !           424: -              f = -f;
        !           425: -              s++;
        !           426: -      }
        !           427: 
        !           428: loop:
        !           429: -      e = 0;
        !           430: -      g = 0;
        !           431: -      if(f != 0) {
        !           432: -              g = frexp(f, &e);
        !           433: -              e = e * .30103;
        !           434: -              d = e/2;
        !           435: -              h = f * pow10(-d);              /* 10**-e in 2 parts */
        !           436: -              g = h * pow10(d-e);
        !           437: -              while(g < 1) {
        !           438: -                      e--;
        !           439: -                      g = h * pow10(d-e);
        !           440: -              }
        !           441: -              while(g >= 10) {
        !           442: -                      e++;
        !           443: -                      g = h * pow10(d-e);
        !           444: -              }
        !           445: -      }
        !           446: -      if(f2 < 0)
        !           447: -              f2 = FDEFLT;
        !           448: -      if(c == 'g' && f2 > 0)
        !           449: -              f2--;
        !           450: -      if(f2 > FDIGIT)
        !           451: -              f2 = FDIGIT;
        !           452: -      /*
        !           453: -       * n is number of digits to convert
        !           454: -       * 1 before, f2 after, 1 extra for rounding
        !           455: -       */
        !           456: -      n = f2 + 2;
        !           457: -      if(c == 'f') {
        !           458: -              /*
        !           459: -               * e+1 before, f2 after, 1 extra
        !           460: -               */
        !           461: -              n += e;
        !           462: -              if(n <= 0) {
        !           463: -                      n = 1;
        !           464: -                      g = 0;
        !           465: -              }
        !           466: -      }
        !           467: -      if(n >= FDIGIT+2) {
        !           468: -              if(c == 'e')
        !           469: -                      f2 = -1;
        !           470: -              c = 'e';
        !           471: -              goto loop;
        !           472: -      }
        !           473: -      /*
        !           474: -       * convert n digits
        !           475: -       */
        !           476: -      for(i=0; i<n; i++) {
        !           477: -              d = g;
        !           478: -              if(d > g)
        !           479: -                      d--;
        !           480: -              g -= d;
        !           481: -              s1[i+1] = d + '0';
        !           482: -              g *= 10;
        !           483: -      }
        !           484: -      /*
        !           485: -       * round by adding .5 into extra digit
        !           486: -       */
        !           487: -      d = 5;
        !           488: -      for(i=n-1; i>=0; i--) {
        !           489: -              s1[i+1] += d;
        !           490: -              d = 0;
        !           491: -              if(s1[i+1] > '9') {
        !           492: -                      s1[i+1] -= 10;
        !           493: -                      d++;
        !           494: -              }
        !           495: -      }
        !           496: -      i = 1;
        !           497: -      if(d) {
        !           498: -              s1[0] = '1';
        !           499: -              e++;
        !           500: -              i = 0;
        !           501: -      } 
        !           502: -      /*
        !           503: -       * copy into final place
        !           504: -       * c1 digits of leading '0'
        !           505: -       * c2 digits from conversion
        !           506: -       * c3 digits after '.'
        !           507: -       */
        !           508: -      d = 0;
        !           509: -      if(s)
        !           510: -              s2[d++] = '-';
        !           511: -      c1 = 0;
        !           512: -      c2 = f2 + 1;
        !           513: -      c3 = f2;
        !           514: -      if(c == 'g')
        !           515: -      if(e >= -5 && e <= f2) {
        !           516: -              c1 = -e - 1;
        !           517: -              c3 = c1;
        !           518: -              if(c1 < 0)
        !           519: -                      c1 = 0;
        !           520: -              c3 = f2 - e;
        !           521: -              c = 'h';
        !           522: -      }
        !           523: -      if(c == 'f') {
        !           524: -              c1 = -e;
        !           525: -              if(c1 < 0)
        !           526: -                      c1 = 0;
        !           527: -              if(c1 > f2)
        !           528: -                      c1 = c2;
        !           529: -              c2 += e;
        !           530: -              if(c2 < 0)
        !           531: -                      c2 = 0;
        !           532: -      }
        !           533: -      while(c1 > 0) {
        !           534: -              if(c1+c2 == c3)
        !           535: -                      s2[d++] = '.';
        !           536: -              s2[d++] = '0';
        !           537: -              c1--;
        !           538: -      }
        !           539: -      while(c2 > 0) {
        !           540: -              if(c1+c2 == c3)
        !           541: -                      s2[d++] = '.';
        !           542: -              s2[d++] = s1[i++];
        !           543: -              c2--;
        !           544: -      }
        !           545: -      /*
        !           546: -       * strip trailing '0' on g conv
        !           547: -       */
        !           548: -      if(c == 'g' || c == 'h') {
        !           549: -              for(n=d-1; n>=0; n--)
        !           550: -                      if(s2[n] != '0')
        !           551: -                              break;
        !           552: -              for(i=n; i>=0; i--)
        !           553: -                      if(s2[i] == '.') {
        !           554: -                              d = n;
        !           555: -                              if(i != n)
        !           556: -                                      d++;
        !           557: -                              break;
        !           558: -                      }
        !           559: -      }
        !           560: -      if(c == 'e' || c == 'g') {
        !           561: -              s2[d++] = 'e';
        !           562: -              s2[d++] = '+';
        !           563: -              c1 = e;
        !           564: -              if(c1 < 0) {
        !           565: -                      s2[d-1] = '-';
        !           566: -                      c1 = -c1;
        !           567: -              }
        !           568: -              if(c1 >= 100) {
        !           569: -                      s2[d++] = c1/100 + '0';
        !           570: -                      c1 %= 100;
        !           571: -              }
        !           572: -              s2[d++] = c1/10 + '0';
        !           573: -              s2[d++] = c1%10 + '0';
        !           574: -      }
        !           575: -      s2[d] = 0;
        !           576: -      strconv(s2, f1, -1);
        !           577: -      return FLOAT;
        !           578: -}
        !           579: 
        !           580: static
        !           581: econv(o, f1, f2, f3)
        !           582: va_list *o;
        !           583: -{
        !           584: 
        !           585: -      return fltconv(va_arg(*o, double), f1, f2, f3, 'e');
        !           586: -}
        !           587: 
        !           588: static
        !           589: fconv(o, f1, f2, f3)
        !           590: va_list *o;
        !           591: -{
        !           592: 
        !           593: -      return fltconv(va_arg(*o, double), f1, f2, f3, 'f');
        !           594: -}
        !           595: 
        !           596: static
        !           597: gconv(o, f1, f2, f3)
        !           598: va_list *o;
        !           599: -{
        !           600: 
        !           601: -      return fltconv(va_arg(*o, double), f1, f2, f3, 'g');
        !           602: -}
        !           603: 
        !           604: static
        !           605: percent()
        !           606: -{
        !           607: 
        !           608: -      if(out < eout)
        !           609: -              *out++ = '%';
        !           610: -      return 0;
        !           611: -}
        !           612: !
        !           613: echo libc/print.c 1>&2
        !           614: sed 's/^-//' >libc/print.c <<'!'
        !           615: -#include <varargs.h>
        !           616: 
        !           617: -#define       SIZE    1024
        !           618: extern int     printcol;
        !           619: 
        !           620: char   *doprint();
        !           621: 
        !           622: -/* VARARGS 1 */
        !           623: print(fmt, va_alist)
        !           624: char *fmt;
        !           625: va_dcl
        !           626: -{
        !           627: -      char buf[SIZE], *out;
        !           628: -      va_list ap;
        !           629: 
        !           630: -      va_start(ap);
        !           631: -      out = doprint(buf, fmt, &ap);
        !           632: -      va_end(ap);
        !           633: -      return write(1, buf, (int)(out-buf));
        !           634: -}
        !           635: 
        !           636: -/* VARARGS 2 */
        !           637: fprint(fd, fmt, va_alist)
        !           638: char *fmt;
        !           639: va_dcl
        !           640: -{
        !           641: -      char buf[SIZE], *out;
        !           642: -      va_list ap;
        !           643: 
        !           644: -      va_start(ap);
        !           645: -      out = doprint(buf, fmt, &ap);
        !           646: -      va_end(ap);
        !           647: -      return write(fd, buf, (int)(out-buf));
        !           648: -}
        !           649: 
        !           650: -/* VARARGS 2 */
        !           651: sprint(buf, fmt, va_alist)
        !           652: char *buf;
        !           653: char *fmt;
        !           654: va_dcl
        !           655: -{
        !           656: -      char *out;
        !           657: -      int scol;
        !           658: -      va_list ap;
        !           659: 
        !           660: -      scol = printcol;
        !           661: -      va_start(ap);
        !           662: -      out = doprint(buf, fmt, &ap);
        !           663: -      va_end(ap);
        !           664: -      printcol = scol;
        !           665: -      return out-buf;
        !           666: -}
        !           667: !
        !           668: 

unix.superglobalmegacorp.com

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