|
|
1.1 ! root 1: ! 2: ! 3: ! 4: ! 5: #include "stdio.h" ! 6: #include <sgtty.h> ! 7: ! 8: /* ! 9: * tunables ! 10: */ ! 11: #define NAV 20 ! 12: #define NINVOKE 5 ! 13: #define LBSIZE 256 ! 14: #define HOTZONE 10 ! 15: /* ! 16: */ ! 17: ! 18: #define SCAT 0 ! 19: #define NOSCAT (!SCAT) ! 20: #define not_a_tty (!is_a_tty) ! 21: ! 22: #define NUL '\0' ! 23: #define EOT '\4' ! 24: #define BS '\b' ! 25: #define HT '\t' ! 26: #define NL '\n' ! 27: #define FF '\f' ! 28: #define CR '\r' ! 29: #define ESC '\33' ! 30: #define SP ' ' ! 31: #define DEL '\177' ! 32: #define ASC 0177 ! 33: ! 34: /* ! 35: * Kludge around a bug in ! 36: * sgtty.h file ! 37: */ ! 38: #define CR2 0 ! 39: #define FF1 0 ! 40: ! 41: ! 42: typedef char *arg_t; /* argument string */ ! 43: typedef char **argp_t; /* pointer to the above */ ! 44: ! 45: ! 46: /* ! 47: * The flags structure that stores the command options. ! 48: */ ! 49: struct flags { ! 50: int f_modes; /* mode bits */ ! 51: long f_seekoff; /* seek into file before scatting */ ! 52: unsigned f_length, /* page length */ ! 53: f_width; /* page width */ ! 54: int f_lineoff, /* starting scatting at this line */ ! 55: f_inset; /* shift display window right */ ! 56: }; ! 57: ! 58: /* f_modes ! 59: */ ! 60: #define M_TRUNC 01 /* truncate lines */ ! 61: #define M_CTL 02 /* display unambiguously: */ ! 62: #define M_CTLSP 04 /* map spaces to '_' */ ! 63: #define M_CTLHT 010 /* print literal tabs, not ^I */ ! 64: #define M_SQUASH 020 /* squash empty lines */ ! 65: #define M_XPAND 040 /* expand tabs */ ! 66: #define M_REMOTE 0100 /* don't hold pages */ ! 67: #define M_NUMBER 0200 /* number input lines */ ! 68: #define M_ONEFILE 0400 /* If one file, don't stop at EOF */ ! 69: ! 70: ! 71: extern struct flags flags; ! 72: ! 73: /* ! 74: * The invoke structure defines what filenames invoke what options. ! 75: */ ! 76: struct invoke { ! 77: char *i_suffix; ! 78: argp_t i_arglist; ! 79: }; ! 80: /* Fix me */ ! 81: extern struct invoke invoke[NINVOKE]; ! 82: extern struct invoke *pinvoke; ! 83: ! 84: argp_t process( ); ! 85: char *getenv( ); ! 86: long atol( ); ! 87: ! 88: extern struct sgttyb tty; /* saved state of tty */ ! 89: extern struct sgttyb tty2; ! 90: extern struct sgttyb ttytek; ! 91: extern unsigned line; /* input line in current file */ ! 92: extern unsigned column; ! 93: extern unsigned xcolumn; ! 94: extern int is_a_tty; /* 1 if output is_a_tty, else 0 */ ! 95: extern int ttyzapped; /* !0 if tty modes were changed */ ! 96: #include <signal.h> ! 97: ! 98: ! 99: extern char *getenv( ); ! 100: ! 101: struct invoke *pinvoke = invoke; ! 102: struct invoke invoke[NINVOKE]; ! 103: struct flags flags; ! 104: struct sgttyb tty; ! 105: struct sgttyb tty2; ! 106: struct sgttyb ttytek; ! 107: unsigned line; ! 108: unsigned column; ! 109: unsigned xcolumn; ! 110: int is_a_tty; ! 111: int ttyzapped; ! 112: ! 113: int filecount = 0; ! 114: ! 115: char *firstfile = NULL; ! 116: struct flags firstflags; ! 117: ! 118: main( argc, argv) ! 119: argp_t argv; ! 120: { ! 121: static struct flags flgs; ! 122: arg_t av[NAV]; ! 123: char ibuf[BUFSIZ], ! 124: obuf[BUFSIZ]; ! 125: ! 126: setbuf( stdin, ibuf); ! 127: setbuf( stdout, obuf); ! 128: init( &flgs); ! 129: envargs( av); ! 130: ! 131: process( av, &flgs, SCAT); ! 132: process( &argv[1], &flgs, SCAT); ! 133: if (filecount <= 1) ! 134: scat( NULL, &flgs); ! 135: fflush( stdout); ! 136: finis( 0); ! 137: } ! 138: ! 139: ! 140: init( fp) ! 141: register struct flags *fp; ! 142: { ! 143: int finis( ); ! 144: register char *p; ! 145: ! 146: fp->f_length = 24; ! 147: fp->f_width = 80; ! 148: if (ioctl( 1, TIOCGETP, &tty) == 0) { ! 149: ++is_a_tty; ! 150: tty2 = tty; ! 151: tty2.sg_flags |= CBREAK; ! 152: tty2.sg_flags &= ~ECHO; ! 153: p = getenv("TERM"); ! 154: if (p!=NULL && strcmp("4012", p)==0) { ! 155: ttytek = tty; ! 156: ttytek.sg_flags |= CR2; ! 157: ttytek.sg_flags &= ~FF1; ! 158: fp->f_length = 34; ! 159: fp->f_width = 72; ! 160: } ! 161: } ! 162: if (signal( SIGINT, SIG_IGN) == SIG_DFL) ! 163: signal( SIGINT, finis); ! 164: } ! 165: ! 166: ! 167: envargs( av) ! 168: argp_t av; ! 169: { ! 170: register fl; ! 171: register char *p; ! 172: register argp_t ap; ! 173: ! 174: ap = av; ! 175: *ap = NULL; ! 176: if ((p=getenv( "SCAT")) == NULL) ! 177: return; ! 178: ! 179: fl = 0; ! 180: while (*p) ! 181: switch (*p++) { ! 182: case HT: ! 183: case NL: ! 184: case SP: ! 185: fl = 0; ! 186: p[-1] = NUL; ! 187: break; ! 188: default: ! 189: if (fl) ! 190: break; ! 191: if (ap >= &av[NAV-1]) ! 192: fatal( "too many env args", NULL); ! 193: *ap++ = &p[-1]; ! 194: ++fl; ! 195: break; ! 196: } ! 197: ! 198: *ap = NULL; ! 199: } ! 200: ! 201: ! 202: argp_t ! 203: process( av, fp, fl) ! 204: register argp_t av; ! 205: register struct flags *fp; ! 206: { ! 207: register char *p; ! 208: struct flags junkflags; ! 209: ! 210: while (av[0]) { ! 211: if (av[0][0] != '-') { ! 212: if (fl != SCAT) ! 213: return (av); ! 214: scat( av++[0], fp); ! 215: ++filecount; ! 216: continue; ! 217: } ! 218: switch (av[0][1]) { ! 219: case 't': ! 220: fp->f_modes |= M_TRUNC; ! 221: break; ! 222: case 'c': ! 223: p = av[0]+2; ! 224: for (; ; ) { ! 225: switch (*p++) { ! 226: case NUL: ! 227: fp->f_modes |= M_CTL; ! 228: break; ! 229: case 't': ! 230: fp->f_modes |= M_CTLHT; ! 231: continue; ! 232: case 's': ! 233: fp->f_modes |= M_CTLSP; ! 234: continue; ! 235: default: ! 236: fatal( "no such sub-options ", av[0]); ! 237: } ! 238: break; ! 239: } ! 240: break; ! 241: case 's': ! 242: fp->f_modes |= M_SQUASH; ! 243: break; ! 244: case 'x': ! 245: fp->f_modes |= M_XPAND; ! 246: break; ! 247: case 'n': ! 248: fp->f_modes |= M_NUMBER; ! 249: break; ! 250: case '1': ! 251: fp->f_modes |= M_ONEFILE; ! 252: break; ! 253: case 'l': ! 254: fp->f_length = atol( &av[0][2]); ! 255: break; ! 256: case 'w': ! 257: fp->f_width = atol( &av[0][2]); ! 258: break; ! 259: case 'S': ! 260: fp->f_seekoff = atol( &av[0][2]); ! 261: break; ! 262: case 'b': ! 263: fp->f_lineoff = atol( &av[0][2]); ! 264: break; ! 265: case 'i': ! 266: fp->f_inset = atol( &av[0][2]); ! 267: break; ! 268: case 'r': ! 269: fp->f_modes |= M_REMOTE; ! 270: break; ! 271: case '.': ! 272: if (fl != SCAT) ! 273: return (av); ! 274: if (pinvoke == &invoke[NINVOKE]) ! 275: fatal( "too many invokes", NULL); ! 276: pinvoke->i_suffix = &av[0][1]; ! 277: pinvoke->i_arglist = &av[1]; ! 278: ++pinvoke; ! 279: av = process( &av[1], &junkflags, NOSCAT); ! 280: continue; ! 281: case '-': ! 282: return (&av[1]); ! 283: default: ! 284: fatal( "no such switch ", av[0]); ! 285: } ! 286: ++av; ! 287: } ! 288: return (av); ! 289: } ! 290: ! 291: ! 292: fatal( arg1, arg2) ! 293: char *arg1, ! 294: *arg2; ! 295: { ! 296: ! 297: fflush( stdout); ! 298: prs( "scat: "); ! 299: prs( arg1); ! 300: prs( arg2); ! 301: prs( "\n"); ! 302: finis( 1); ! 303: } ! 304: ! 305: ! 306: finis( status) ! 307: { ! 308: ! 309: signal( SIGINT, SIG_IGN); ! 310: if (ttyzapped) ! 311: ioctl( 1, TIOCSETP, &tty); ! 312: _exit( status); ! 313: } ! 314: ! 315: ! 316: #include <errno.h> ! 317: ! 318: ! 319: char newline[] = "\n"; ! 320: ! 321: int (*getline)( ), ! 322: getl1( ), getl2( ), getl3( ); ! 323: puts1( ), puts2( ); ! 324: ! 325: scat( file, fp) ! 326: register char *file; ! 327: struct flags *fp; ! 328: { ! 329: register i; ! 330: register char *p; ! 331: struct invoke *ip; ! 332: FILE *creopen( ); ! 333: char *nconv( ); ! 334: extern errno; ! 335: int (*puts)( ); ! 336: char c; ! 337: int len; ! 338: static int norecurs = 0; ! 339: ! 340: if ( (filecount == 0) && (file != NULL) ) { ! 341: firstfile = file; ! 342: firstflags = *fp; ! 343: return; ! 344: } else if ( (filecount == 1) && (norecurs == 0) ) { ! 345: norecurs = 1; ! 346: if ( file != NULL ) { ! 347: firstflags.f_modes &= ~M_ONEFILE; ! 348: fp->f_modes &= ~M_ONEFILE; ! 349: } ! 350: scat( firstfile, &firstflags); ! 351: if ( file == NULL ) ! 352: return; ! 353: } ! 354: ! 355: flags = *fp; ! 356: ! 357: if (file != NULL) { ! 358: if (creopen( file) == NULL) { ! 359: p = "can't find "; ! 360: if (errno == EACCES) ! 361: p = "no permission on "; ! 362: fatal( p, file); ! 363: } ! 364: } ! 365: else ! 366: file = "[stdin]."; ! 367: ! 368: for (p=file; *p++; ) ! 369: ; ! 370: do { ! 371: if (*--p == '.') { ! 372: for (ip=invoke; ip<pinvoke; ++ip) ! 373: if (strcmp( p, ip->i_suffix) == 0) ! 374: process( ip->i_arglist, &flags, NOSCAT); ! 375: break; ! 376: } ! 377: } while (p > file); ! 378: ! 379: if (flags.f_modes & M_NUMBER) ! 380: flags.f_width -= 8; ! 381: flags.f_width += flags.f_inset; ! 382: if (flags.f_width-8 >= LBSIZE) ! 383: fatal( "page width don't jive", NULL); ! 384: getline = getl1; ! 385: if (flags.f_modes & M_TRUNC) ! 386: getline = getl2; ! 387: if (flags.f_modes & M_CTL) ! 388: getline = getl3; ! 389: puts = puts1; ! 390: if (flags.f_modes & M_XPAND) ! 391: puts = puts2; ! 392: ! 393: if (flags.f_seekoff) ! 394: lseek( 0, flags.f_seekoff, 0); ! 395: for (line=1; line<flags.f_lineoff; ++line) ! 396: while ((i=getchar( )) != NL) ! 397: if (i < 0) ! 398: return; ! 399: ! 400: i = flags.f_length; ! 401: while (len=page( i, puts)) { ! 402: if ( (len < i) && (flags.f_modes&M_ONEFILE) ) { ! 403: putchar( NL); ! 404: break; ! 405: } ! 406: if (is_a_tty && (flags.f_modes&M_REMOTE)==0) { ! 407: fflush( stdout); ! 408: if (ttyzapped == 0) { ! 409: ++ttyzapped; ! 410: ioctl( 1, TIOCSETN, &tty2); ! 411: } ! 412: for (; ; ) { ! 413: if (read( 2, &c, 1) <= 0) ! 414: finis( 0); ! 415: switch (c) { ! 416: case EOT: ! 417: case 'q': ! 418: prs( newline); ! 419: finis( 0); ! 420: case NL: ! 421: i = flags.f_length; ! 422: break; ! 423: case '/': ! 424: if (ttytek.sg_flags) ! 425: goto dfault; ! 426: i = flags.f_length/2 + 1; ! 427: break; ! 428: case SP: ! 429: if (ttytek.sg_flags) ! 430: goto dfault; ! 431: i = 1; ! 432: break; ! 433: case 'n': ! 434: prs( newline); ! 435: return; ! 436: case 'f': ! 437: prs( newline); ! 438: prs( file); ! 439: prs( nconv( line-1)); ! 440: continue; ! 441: default: ! 442: dfault: ! 443: prs( "\7"); ! 444: continue; ! 445: } ! 446: break; ! 447: } ! 448: } ! 449: putchar( NL); ! 450: } ! 451: } ! 452: ! 453: ! 454: page( length, puts) ! 455: int (*puts)( ); ! 456: { ! 457: register char *p; ! 458: register i, ! 459: nflg; ! 460: int l; ! 461: static char lbuf[LBSIZE]; ! 462: char *nconv( ); ! 463: ! 464: nflg = 0; ! 465: l = length; ! 466: do { ! 467: p = lbuf; ! 468: i = (*getline)( p); ! 469: if (i < 0) ! 470: break; ! 471: ! 472: p += flags.f_inset; ! 473: if (p >= &lbuf[i] && flags.f_modes&M_SQUASH) { ! 474: ++l; ! 475: if (lbuf[i] == NL) ! 476: ++line; ! 477: continue; ! 478: } ! 479: ! 480: if (l != length) ! 481: putchar( NL); ! 482: else if (ttytek.sg_flags) ! 483: erase( ); ! 484: column = xcolumn = 0; ! 485: if (flags.f_modes & M_NUMBER) ! 486: if (nflg) ! 487: (*puts)( " ", 8); ! 488: else { ! 489: (*puts)( nconv( line), 5); ! 490: (*puts)( ": ", 3); ! 491: ++nflg; ! 492: } ! 493: if (lbuf[i] == NL) { ! 494: ++line; ! 495: nflg = 0; ! 496: } ! 497: if ((*puts)( p, &lbuf[i]-p)) ! 498: continue; ! 499: } while (--l); ! 500: ! 501: return (length - l); ! 502: } ! 503: ! 504: ! 505: ! 506: ! 507: getl1( lbuf) ! 508: register char *lbuf; ! 509: { ! 510: register i, ! 511: c; ! 512: ! 513: i = 0; ! 514: while ((c=cread( )) >= 0) { ! 515: if (c == NL) ! 516: break; ! 517: if (c == HT) ! 518: if ((i|7)+1 <= flags.f_width) { ! 519: do ! 520: lbuf[i++] = SP; ! 521: while (i & 7); ! 522: continue; ! 523: } ! 524: else ! 525: ; /* overflow */ ! 526: else if (c == FF) ! 527: continue; ! 528: else if (i < flags.f_width) { ! 529: lbuf[i++] = c; ! 530: continue; ! 531: } ! 532: ! 533: /* line overflow condition */ ! 534: i = overflow( lbuf, i, c); ! 535: c = NUL; ! 536: break; ! 537: } ! 538: ! 539: lbuf[i] = c; ! 540: if (i==0 && c<0) ! 541: return (-1); ! 542: return (i); ! 543: } ! 544: ! 545: ! 546: getl2( lbuf) ! 547: register char *lbuf; ! 548: { ! 549: register i, ! 550: c; ! 551: ! 552: i = 0; ! 553: while ((c=cread( )) >= 0) { ! 554: if (c == NL) ! 555: break; ! 556: if (c == HT) ! 557: do { ! 558: if (i < flags.f_width) ! 559: lbuf[i] = SP; ! 560: } while (++i & 7); ! 561: else if (c == FF) ! 562: continue; ! 563: else if (i < flags.f_width) ! 564: lbuf[i++] = c; ! 565: else ! 566: i += 2; ! 567: if (i > flags.f_width) { ! 568: while ((c=cread( )) >= 0) ! 569: if (c == NL) ! 570: break; ! 571: i = flags.f_width; ! 572: break; ! 573: } ! 574: } ! 575: ! 576: lbuf[i] = c; ! 577: if (i==0 && c<0) ! 578: return (-1); ! 579: return (i); ! 580: } ! 581: ! 582: ! 583: getl3( lbuf) ! 584: register char *lbuf; ! 585: { ! 586: register i, ! 587: c; ! 588: ! 589: i = 0; ! 590: while ((c=getchar( )) >= 0) { ! 591: if (c == NL) ! 592: break; ! 593: if (c & ~ASC) { ! 594: lbuf[i++] = '~'; ! 595: c &= ASC; ! 596: } ! 597: if (c==HT && flags.f_modes&M_CTLHT) ! 598: do { ! 599: if (i < flags.f_width) ! 600: lbuf[i] = SP; ! 601: } while (++i & 7); ! 602: else if (c<SP || c==DEL) { ! 603: lbuf[i++] = '^'; ! 604: lbuf[i++] = c + '@'; ! 605: } else { ! 606: switch (c) { ! 607: case SP: ! 608: if (flags.f_modes & M_CTLSP) ! 609: c = '_'; ! 610: break; ! 611: case '_': ! 612: if ((flags.f_modes&M_CTLSP) == 0) ! 613: break; ! 614: case '~': ! 615: case '^': ! 616: case '\\': ! 617: lbuf[i++] = '\\'; ! 618: break; ! 619: } ! 620: lbuf[i++] = c; ! 621: } ! 622: if (i+3 >= flags.f_width) { ! 623: lbuf[i++] = '\\'; ! 624: c = NUL; ! 625: break; ! 626: } ! 627: } ! 628: ! 629: lbuf[i] = c; ! 630: if (i==0 && c<0) ! 631: return (-1); ! 632: return (i); ! 633: } ! 634: ! 635: ! 636: #define alphanumeric( c) (alphnum[c>>3&017] & bitmask[c&7]) ! 637: char alphnum[] = { ! 638: 0000, 0000, 0000, 0000, 0000, 0000, 0377, 0300, ! 639: 0177, 0377, 0377, 0351, 0177, 0377, 0377, 0340 ! 640: }; ! 641: char bitmask[] = { ! 642: 0200, 0100, 0040, 0020, 0010, 0004, 0002, 0001 ! 643: }; ! 644: ! 645: ! 646: overflow( lbuf, pos, c) ! 647: register char *lbuf; ! 648: register pos; ! 649: { ! 650: register i; ! 651: ! 652: uncread( c); ! 653: if (pos == flags.f_width) /* ***THINK ABOUT THOSE LIMITS*** */ ! 654: c = uncread( lbuf[--pos]); ! 655: ! 656: for (i=pos; i>HOTZONE && i>pos-HOTZONE; ) { ! 657: --i; ! 658: if (!alphanumeric( lbuf[i])) { ! 659: for (++i; pos>i; ) ! 660: uncread( lbuf[--pos]); ! 661: break; ! 662: } ! 663: } ! 664: ! 665: lbuf[pos++] = '\\'; ! 666: return (pos); ! 667: } ! 668: ! 669: ! 670: puts1( p, n) ! 671: register char *p; ! 672: register n; ! 673: { ! 674: register i; ! 675: ! 676: while (--n >= 0) ! 677: if (*p++ == SP) ! 678: ++xcolumn; ! 679: else { ! 680: if (xcolumn > column) { ! 681: while (i=(column|7)+1, i<=xcolumn) { ! 682: putchar( HT); ! 683: column = i; ! 684: } ! 685: while (column < xcolumn) { ! 686: putchar( SP); ! 687: ++column; ! 688: } ! 689: } ! 690: putchar( p[-1]); ! 691: xcolumn = ++column; ! 692: } ! 693: ! 694: return (0); ! 695: } ! 696: ! 697: ! 698: puts2( p, n) ! 699: register char *p; ! 700: register n; ! 701: { ! 702: ! 703: while (--n >= 0) ! 704: putchar( *p++); ! 705: ! 706: return (0); ! 707: } ! 708: ! 709: ! 710: ! 711: ! 712: #define CQSIZE 256 ! 713: #define CQMASK (CQSIZE-1) ! 714: ! 715: #define chr( i) (cbuf[i&CQMASK]) ! 716: ! 717: ! 718: unsigned get, ! 719: cnt, ! 720: cntmax, ! 721: eof; ! 722: char cbuf[CQSIZE]; ! 723: ! 724: ! 725: FILE * ! 726: creopen( file) ! 727: char *file; ! 728: { ! 729: register char *p; ! 730: FILE *freopen( ); ! 731: ! 732: cnt = 0; ! 733: cntmax = 0; ! 734: eof = 0; ! 735: for (p=cbuf; p<cbuf+CQSIZE; ) ! 736: *p++ = NUL; ! 737: return (freopen( file, "r", stdin)); ! 738: } ! 739: ! 740: ! 741: uncread( c) ! 742: { ! 743: ! 744: chr( --get) = c; ! 745: ++cnt, ++cntmax; ! 746: return (c); ! 747: } ! 748: ! 749: ! 750: ! 751: ! 752: #define CQSIZE 256 ! 753: #define CQMASK (CQSIZE-1) ! 754: ! 755: ! 756: ! 757: ! 758: cread( ) ! 759: { ! 760: register c; ! 761: ! 762: if ( ! eof) ! 763: while (cntmax < CQSIZE-HOTZONE) { ! 764: if ((c=getchar( )) < 0) { ! 765: ++eof; ! 766: break; ! 767: } ! 768: switch (c &= ASC) { ! 769: case BS: ! 770: if (cnt && cbuf[get+cnt-1&CQMASK] != NL) ! 771: --cnt; ! 772: continue; ! 773: case ESC: ! 774: c = '$'; ! 775: goto dfault; ! 776: case CR: ! 777: while (cnt && cbuf[get+cnt-1&CQMASK] != NL) ! 778: --cnt; ! 779: continue; ! 780: case NL: ! 781: cnt = cntmax; ! 782: goto dfault; ! 783: case '_': ! 784: switch (cbuf[get+cnt&CQMASK]) { ! 785: case NUL: ! 786: case SP: ! 787: goto dfault; ! 788: } ! 789: break; ! 790: case SP: ! 791: if (cbuf[get+cnt&CQMASK]) ! 792: break; ! 793: default: ! 794: dfault: ! 795: cbuf[get+cnt&CQMASK] = c; ! 796: break; ! 797: } ! 798: if (++cnt > cntmax) ! 799: ++cntmax; ! 800: } ! 801: ! 802: if (eof) { ! 803: if (cntmax == 0) ! 804: return (-1); ! 805: } ! 806: --cnt; ! 807: --cntmax; ! 808: c = cbuf[get&CQMASK]; ! 809: cbuf[get++&CQMASK] = 0; ! 810: return (c); ! 811: } ! 812: ! 813: ! 814: ! 815: ! 816: prs( s) ! 817: register char *s; ! 818: { ! 819: register char *p; ! 820: ! 821: if ((p=s) == NULL) ! 822: return; ! 823: while (*p++) ! 824: ; ! 825: write( 2, s, p-s-1); ! 826: } ! 827: ! 828: ! 829: long ! 830: atol( p) ! 831: char *p; ! 832: { ! 833: register c, ! 834: radix, ! 835: pow; ! 836: long l; ! 837: ! 838: radix = 10; ! 839: if (*p == '0') ! 840: radix = 8; ! 841: pow = 0; ! 842: l = 0; ! 843: ! 844: for (; ; ) { ! 845: c = *p++; ! 846: if (c == 'b') { ! 847: pow = 9; ! 848: break; ! 849: } ! 850: if (c == 'k') { ! 851: pow = 10; ! 852: break; ! 853: } ! 854: c -= '0'; ! 855: if ((unsigned)c > 9) ! 856: break; ! 857: l = l*radix + c; ! 858: } ! 859: ! 860: return (l << pow); ! 861: } ! 862: ! 863: ! 864: char * ! 865: nconv( u) ! 866: register unsigned u; ! 867: { ! 868: register char *p; ! 869: static char nbuf[] = "12345 "; ! 870: ! 871: for (p=nbuf+5; ! 872: p>nbuf; ! 873: u=u/10) ! 874: if (u) ! 875: *--p = u%10 + '0'; ! 876: else ! 877: *--p = ' '; ! 878: ! 879: return (p); ! 880: } ! 881: ! 882: ! 883: erase( ) ! 884: { ! 885: register char *p; ! 886: ! 887: fflush( stdout); ! 888: ++ttyzapped; ! 889: ioctl( 1, TIOCSETP, &ttytek); ! 890: for (p="\33\f\r\r\r"; *p; ) ! 891: putchar( *p++); ! 892: fflush( stdout); ! 893: ioctl( 1, TIOCSETP, &tty); ! 894: ttyzapped = 0; ! 895: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.