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