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

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

unix.superglobalmegacorp.com

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