|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.