|
|
1.1 ! root 1: /* Copyright (c) 1979 Regents of the University of California */ ! 2: #include "ex.h" ! 3: #include "ex_tty.h" ! 4: #include "ex_vis.h" ! 5: ! 6: /* ! 7: * Terminal driving and line formatting routines. ! 8: * Basic motion optimizations are done here as well ! 9: * as formatting of lines (printing of control characters, ! 10: * line numbering and the like). ! 11: */ ! 12: ! 13: /* ! 14: * The routines outchar, putchar and pline are actually ! 15: * variables, and these variables point at the current definitions ! 16: * of the routines. See the routine setflav. ! 17: * We sometimes make outchar be routines which catch the characters ! 18: * to be printed, e.g. if we want to see how long a line is. ! 19: * During open/visual, outchar and putchar will be set to ! 20: * routines in the file ex_vput.c (vputchar, vinschar, etc.). ! 21: */ ! 22: int (*Outchar)() = termchar; ! 23: int (*Putchar)() = normchar; ! 24: int (*Pline)() = normline; ! 25: ! 26: int (* ! 27: setlist(t))() ! 28: bool t; ! 29: { ! 30: register int (*P)(); ! 31: ! 32: listf = t; ! 33: P = Putchar; ! 34: Putchar = t ? listchar : normchar; ! 35: return (P); ! 36: } ! 37: ! 38: int (* ! 39: setnumb(t))() ! 40: bool t; ! 41: { ! 42: register int (*P)(); ! 43: ! 44: numberf = t; ! 45: P = Pline; ! 46: Pline = t ? numbline : normline; ! 47: return (P); ! 48: } ! 49: ! 50: /* ! 51: * Format c for list mode; leave things in common ! 52: * with normal print mode to be done by normchar. ! 53: */ ! 54: listchar(c) ! 55: register short c; ! 56: { ! 57: ! 58: c &= (TRIM|QUOTE); ! 59: switch (c) { ! 60: ! 61: case '\t': ! 62: case '\b': ! 63: outchar('^'); ! 64: c = ctlof(c); ! 65: break; ! 66: ! 67: case '\n': ! 68: break; ! 69: ! 70: case '\n' | QUOTE: ! 71: outchar('$'); ! 72: break; ! 73: ! 74: default: ! 75: if (c & QUOTE) ! 76: break; ! 77: if (c < ' ' && c != '\n' || c == DELETE) ! 78: outchar('^'), c = ctlof(c); ! 79: break; ! 80: } ! 81: normchar(c); ! 82: } ! 83: ! 84: /* ! 85: * Format c for printing. Handle funnies of upper case terminals ! 86: * and crocky hazeltines which don't have ~. ! 87: */ ! 88: normchar(c) ! 89: register short c; ! 90: { ! 91: register char *colp; ! 92: ! 93: c &= (TRIM|QUOTE); ! 94: if (c == '~' && HZ) { ! 95: normchar('\\'); ! 96: c = '^'; ! 97: } ! 98: if (c & QUOTE) ! 99: switch (c) { ! 100: ! 101: case ' ' | QUOTE: ! 102: case '\b' | QUOTE: ! 103: break; ! 104: ! 105: case QUOTE: ! 106: return; ! 107: ! 108: default: ! 109: c &= TRIM; ! 110: } ! 111: else if (c < ' ' && (c != '\b' || !OS) && c != '\n' && c != '\t' || c == DELETE) ! 112: putchar('^'), c = ctlof(c); ! 113: else if (UPPERCASE) ! 114: if (isupper(c)) { ! 115: outchar('\\'); ! 116: c = tolower(c); ! 117: } else { ! 118: colp = "({)}!|^~'`"; ! 119: while (*colp++) ! 120: if (c == *colp++) { ! 121: outchar('\\'); ! 122: c = colp[-2]; ! 123: break; ! 124: } ! 125: } ! 126: outchar(c); ! 127: } ! 128: ! 129: /* ! 130: * Print a line with a number. ! 131: */ ! 132: numbline(i) ! 133: int i; ! 134: { ! 135: ! 136: if (shudclob) ! 137: slobber(' '); ! 138: printf("%6d ", i); ! 139: normline(); ! 140: } ! 141: ! 142: /* ! 143: * Normal line output, no numbering. ! 144: */ ! 145: normline() ! 146: { ! 147: register char *cp; ! 148: ! 149: if (shudclob) ! 150: slobber(linebuf[0]); ! 151: /* pdp-11 doprnt is not reentrant so can't use "printf" here ! 152: in case we are tracing */ ! 153: for (cp = linebuf; *cp;) ! 154: putchar(*cp++); ! 155: if (!inopen) ! 156: putchar('\n' | QUOTE); ! 157: } ! 158: ! 159: /* ! 160: * Given c at the beginning of a line, determine whether ! 161: * the printing of the line will erase or otherwise obliterate ! 162: * the prompt which was printed before. If it won't, do it now. ! 163: */ ! 164: slobber(c) ! 165: int c; ! 166: { ! 167: ! 168: shudclob = 0; ! 169: switch (c) { ! 170: ! 171: case '\t': ! 172: if (Putchar == listchar) ! 173: return; ! 174: break; ! 175: ! 176: default: ! 177: return; ! 178: ! 179: case ' ': ! 180: case 0: ! 181: break; ! 182: } ! 183: if (OS) ! 184: return; ! 185: flush(); ! 186: putch(' '); ! 187: if (BC) ! 188: tputs(BC, 0, putch); ! 189: else ! 190: putch('\b'); ! 191: } ! 192: ! 193: /* ! 194: * The output buffer is initialized with a useful error ! 195: * message so we don't have to keep it in data space. ! 196: */ ! 197: static char linb[66] = { ! 198: 'E', 'r', 'r', 'o', 'r', ' ', 'm', 'e', 's', 's', 'a', 'g', 'e', ' ', ! 199: 'f', 'i', 'l', 'e', ' ', 'n', 'o', 't', ' ', ! 200: 'a', 'v', 'a', 'i', 'l', 'a', 'b', 'l', 'e', '\n', 0 ! 201: }; ! 202: static char *linp = linb + 33; ! 203: ! 204: /* ! 205: * Phadnl records when we have already had a complete line ending with \n. ! 206: * If another line starts without a flush, and the terminal suggests it, ! 207: * we switch into -nl mode so that we can send lineffeeds to avoid ! 208: * a lot of spacing. ! 209: */ ! 210: static bool phadnl; ! 211: ! 212: /* ! 213: * Indirect to current definition of putchar. ! 214: */ ! 215: putchar(c) ! 216: int c; ! 217: { ! 218: ! 219: (*Putchar)(c); ! 220: } ! 221: ! 222: /* ! 223: * Termchar routine for command mode. ! 224: * Watch for possible switching to -nl mode. ! 225: * Otherwise flush into next level of buffering when ! 226: * small buffer fills or at a newline. ! 227: */ ! 228: termchar(c) ! 229: int c; ! 230: { ! 231: ! 232: if (pfast == 0 && phadnl) ! 233: pstart(); ! 234: if (c == '\n') ! 235: phadnl = 1; ! 236: else if (linp >= &linb[63]) ! 237: flush1(); ! 238: *linp++ = c; ! 239: if (linp >= &linb[63]) { ! 240: fgoto(); ! 241: flush1(); ! 242: } ! 243: } ! 244: ! 245: flush() ! 246: { ! 247: ! 248: flush1(); ! 249: flush2(); ! 250: } ! 251: ! 252: /* ! 253: * Flush from small line buffer into output buffer. ! 254: * Work here is destroying motion into positions, and then ! 255: * letting fgoto do the optimized motion. ! 256: */ ! 257: flush1() ! 258: { ! 259: register char *lp; ! 260: register short c; ! 261: ! 262: *linp = 0; ! 263: lp = linb; ! 264: while (*lp) ! 265: switch (c = *lp++) { ! 266: ! 267: case '\r': ! 268: destline += destcol / COLUMNS; ! 269: destcol = 0; ! 270: continue; ! 271: ! 272: case '\b': ! 273: if (destcol) ! 274: destcol--; ! 275: continue; ! 276: ! 277: case ' ': ! 278: destcol++; ! 279: continue; ! 280: ! 281: case '\t': ! 282: destcol += value(TABSTOP) - destcol % value(TABSTOP); ! 283: continue; ! 284: ! 285: case '\n': ! 286: destline += destcol / COLUMNS + 1; ! 287: if (destcol != 0 && destcol % COLUMNS == 0) ! 288: destline--; ! 289: destcol = 0; ! 290: continue; ! 291: ! 292: default: ! 293: fgoto(); ! 294: for (;;) { ! 295: if (AM == 0 && outcol == COLUMNS) ! 296: fgoto(); ! 297: c &= TRIM; ! 298: putch(c); ! 299: if (c == '\b') { ! 300: outcol--; ! 301: destcol--; ! 302: } else if (c >= ' ' && c != DELETE) { ! 303: outcol++; ! 304: destcol++; ! 305: if (XN && outcol % COLUMNS == 0) ! 306: putch('\n'); ! 307: } ! 308: c = *lp++; ! 309: if (c <= ' ') ! 310: break; ! 311: } ! 312: --lp; ! 313: continue; ! 314: } ! 315: linp = linb; ! 316: } ! 317: ! 318: flush2() ! 319: { ! 320: ! 321: fgoto(); ! 322: flusho(); ! 323: pstop(); ! 324: } ! 325: ! 326: /* ! 327: * Sync the position of the output cursor. ! 328: * Most work here is rounding for terminal boundaries getting the ! 329: * column position implied by wraparound or the lack thereof and ! 330: * rolling up the screen to get destline on the screen. ! 331: */ ! 332: fgoto() ! 333: { ! 334: register int l, c; ! 335: ! 336: if (destcol > COLUMNS - 1) { ! 337: destline += destcol / COLUMNS; ! 338: destcol %= COLUMNS; ! 339: } ! 340: if (outcol > COLUMNS - 1) { ! 341: l = (outcol + 1) / COLUMNS; ! 342: outline += l; ! 343: outcol %= COLUMNS; ! 344: if (AM == 0) { ! 345: while (l > 0) { ! 346: if (pfast) ! 347: putch('\r'); ! 348: putch('\n'); ! 349: l--; ! 350: } ! 351: outcol = 0; ! 352: } ! 353: if (outline > LINES - 1) { ! 354: destline -= outline - (LINES - 1); ! 355: outline = LINES - 1; ! 356: } ! 357: } ! 358: if (destline > LINES - 1) { ! 359: l = destline; ! 360: destline = LINES - 1; ! 361: if (outline < LINES - 1) { ! 362: c = destcol; ! 363: if (pfast == 0 && (!CA || holdcm)) ! 364: destcol = 0; ! 365: fgoto(); ! 366: destcol = c; ! 367: } ! 368: while (l > LINES - 1) { ! 369: putch('\n'); ! 370: l--; ! 371: if (pfast == 0) ! 372: outcol = 0; ! 373: } ! 374: } ! 375: if (destline < outline && !(CA && !holdcm || UP != NOSTR)) ! 376: destline = outline; ! 377: if (CA && !holdcm) ! 378: if (plod(costCM) > 0) ! 379: plod(0); ! 380: else ! 381: tputs(tgoto(CM, destcol, destline), 0, putch); ! 382: else ! 383: plod(0); ! 384: outline = destline; ! 385: outcol = destcol; ! 386: } ! 387: ! 388: /* ! 389: * Tab to column col by flushing and then setting destcol. ! 390: * Used by "set all". ! 391: */ ! 392: tab(col) ! 393: int col; ! 394: { ! 395: ! 396: flush1(); ! 397: destcol = col; ! 398: } ! 399: ! 400: /* ! 401: * Move (slowly) to destination. ! 402: * Hard thing here is using home cursor on really deficient terminals. ! 403: * Otherwise just use cursor motions, hacking use of tabs and overtabbing ! 404: * and backspace. ! 405: */ ! 406: ! 407: static int plodcnt, plodflg; ! 408: ! 409: plodput(c) ! 410: { ! 411: ! 412: if (plodflg) ! 413: plodcnt--; ! 414: else ! 415: putch(c); ! 416: } ! 417: ! 418: plod(cnt) ! 419: { ! 420: register int i, j, k; ! 421: register int soutcol, soutline; ! 422: ! 423: plodcnt = plodflg = cnt; ! 424: soutcol = outcol; ! 425: soutline = outline; ! 426: if (HO) { ! 427: if (GT) ! 428: i = (destcol / value(HARDTABS)) + (destcol % value(HARDTABS)); ! 429: else ! 430: i = destcol; ! 431: if (destcol >= outcol) { ! 432: j = destcol / value(HARDTABS) - outcol / value(HARDTABS); ! 433: if (GT && j) ! 434: j += destcol % value(HARDTABS); ! 435: else ! 436: j = destcol - outcol; ! 437: } else ! 438: if (outcol - destcol <= i && (BS || BC)) ! 439: i = j = outcol - destcol; ! 440: else ! 441: j = i + 1; ! 442: k = outline - destline; ! 443: if (k < 0) ! 444: k = -k; ! 445: j += k; ! 446: if (i + destline < j) { ! 447: tputs(HO, 0, plodput); ! 448: outcol = outline = 0; ! 449: } else if (LL) { ! 450: k = (LINES - 1) - destline; ! 451: if (i + k + 2 < j) { ! 452: tputs(LL, 0, plodput); ! 453: outcol = 0; ! 454: outline = LINES - 1; ! 455: } ! 456: } ! 457: } ! 458: if (GT) ! 459: i = destcol % value(HARDTABS) + destcol / value(HARDTABS); ! 460: else ! 461: i = destcol; ! 462: /* ! 463: if (BT && outcol > destcol && (j = (((outcol+7) & ~7) - destcol - 1) >> 3)) { ! 464: j *= (k = strlen(BT)); ! 465: if ((k += (destcol&7)) > 4) ! 466: j += 8 - (destcol&7); ! 467: else ! 468: j += k; ! 469: } else ! 470: */ ! 471: j = outcol - destcol; ! 472: /* ! 473: * If we will later need a \n which will turn into a \r\n by ! 474: * the system or the terminal, then don't bother to try to \r. ! 475: */ ! 476: if ((NONL || !pfast) && outline < destline) ! 477: goto dontcr; ! 478: /* ! 479: * If the terminal will do a \r\n and there isn't room for it, ! 480: * then we can't afford a \r. ! 481: */ ! 482: if (NC && outline >= destline) ! 483: goto dontcr; ! 484: /* ! 485: * If it will be cheaper, or if we can't back up, then send ! 486: * a return preliminarily. ! 487: */ ! 488: if (j > i + 1 || outcol > destcol && !BS && !BC) { ! 489: plodput('\r'); ! 490: if (NC) { ! 491: plodput('\n'); ! 492: outline++; ! 493: } ! 494: outcol = 0; ! 495: } ! 496: dontcr: ! 497: while (outline < destline) { ! 498: outline++; ! 499: plodput('\n'); ! 500: if (plodcnt < 0) ! 501: goto out; ! 502: if (NONL || pfast == 0) ! 503: outcol = 0; ! 504: } ! 505: if (BT) ! 506: k = strlen(BT); ! 507: while (outcol > destcol) { ! 508: if (plodcnt < 0) ! 509: goto out; ! 510: /* ! 511: if (BT && !insmode && outcol - destcol > 4+k) { ! 512: tputs(BT, 0, plodput); ! 513: outcol--; ! 514: outcol &= ~7; ! 515: continue; ! 516: } ! 517: */ ! 518: outcol--; ! 519: if (BC) ! 520: tputs(BC, 0, plodput); ! 521: else ! 522: plodput('\b'); ! 523: } ! 524: while (outline > destline) { ! 525: outline--; ! 526: tputs(UP, 0, plodput); ! 527: if (plodcnt < 0) ! 528: goto out; ! 529: } ! 530: if (GT && !insmode && destcol - outcol > 1) { ! 531: for (;;) { ! 532: i = (outcol / value(HARDTABS) + 1) * value(HARDTABS); ! 533: if (i > destcol) ! 534: break; ! 535: if (TA) ! 536: tputs(TA, 0, plodput); ! 537: else ! 538: plodput('\t'); ! 539: outcol = i; ! 540: } ! 541: if (destcol - outcol > 4 && i < COLUMNS && (BC || BS)) { ! 542: if (TA) ! 543: tputs(TA, 0, plodput); ! 544: else ! 545: plodput('\t'); ! 546: outcol = i; ! 547: while (outcol > destcol) { ! 548: outcol--; ! 549: if (BC) ! 550: tputs(BC, 0, plodput); ! 551: else ! 552: plodput('\b'); ! 553: } ! 554: } ! 555: } ! 556: while (outcol < destcol) { ! 557: if (inopen && ND) ! 558: tputs(ND, 0, plodput); ! 559: else ! 560: plodput(' '); ! 561: outcol++; ! 562: if (plodcnt < 0) ! 563: goto out; ! 564: } ! 565: out: ! 566: if (plodflg) { ! 567: outcol = soutcol; ! 568: outline = soutline; ! 569: } ! 570: return(plodcnt); ! 571: } ! 572: ! 573: /* ! 574: * An input line arrived. ! 575: * Calculate new (approximate) screen line position. ! 576: * Approximate because kill character echoes newline with ! 577: * no feedback and also because of long input lines. ! 578: */ ! 579: noteinp() ! 580: { ! 581: ! 582: outline++; ! 583: if (outline > LINES - 1) ! 584: outline = LINES - 1; ! 585: destline = outline; ! 586: destcol = outcol = 0; ! 587: } ! 588: ! 589: /* ! 590: * Something weird just happened and we ! 591: * lost track of whats happening out there. ! 592: * Since we cant, in general, read where we are ! 593: * we just reset to some known state. ! 594: * On cursor addressible terminals setting to unknown ! 595: * will force a cursor address soon. ! 596: */ ! 597: termreset() ! 598: { ! 599: ! 600: endim(); ! 601: if (TI) /* otherwise it flushes anyway, and 'set tty=dumb' vomits */ ! 602: putpad(TI); /*adb change -- emit terminal initial sequence */ ! 603: destcol = 0; ! 604: destline = LINES - 1; ! 605: if (CA) { ! 606: outcol = UKCOL; ! 607: outline = UKCOL; ! 608: } else { ! 609: outcol = destcol; ! 610: outline = destline; ! 611: } ! 612: } ! 613: ! 614: /* ! 615: * Low level buffering, with the ability to drain ! 616: * buffered output without printing it. ! 617: */ ! 618: char *obp = obuf; ! 619: ! 620: draino() ! 621: { ! 622: ! 623: obp = obuf; ! 624: } ! 625: ! 626: flusho() ! 627: { ! 628: ! 629: if (obp != obuf) { ! 630: write(1, obuf, obp - obuf); ! 631: obp = obuf; ! 632: } ! 633: } ! 634: ! 635: putnl() ! 636: { ! 637: ! 638: putchar('\n'); ! 639: } ! 640: ! 641: putS(cp) ! 642: char *cp; ! 643: { ! 644: ! 645: if (cp == NULL) ! 646: return; ! 647: while (*cp) ! 648: putch(*cp++); ! 649: } ! 650: ! 651: ! 652: putch(c) ! 653: int c; ! 654: { ! 655: ! 656: *obp++ = c; ! 657: if (obp >= &obuf[sizeof obuf]) ! 658: flusho(); ! 659: } ! 660: ! 661: /* ! 662: * Miscellaneous routines related to output. ! 663: */ ! 664: ! 665: /* ! 666: * Cursor motion. ! 667: */ ! 668: char * ! 669: cgoto() ! 670: { ! 671: ! 672: return (tgoto(CM, destcol, destline)); ! 673: } ! 674: ! 675: /* ! 676: * Put with padding ! 677: */ ! 678: putpad(cp) ! 679: char *cp; ! 680: { ! 681: ! 682: flush(); ! 683: tputs(cp, 0, putch); ! 684: } ! 685: ! 686: /* ! 687: * Set output through normal command mode routine. ! 688: */ ! 689: setoutt() ! 690: { ! 691: ! 692: Outchar = termchar; ! 693: } ! 694: ! 695: /* ! 696: * Printf (temporarily) in list mode. ! 697: */ ! 698: /*VARARGS2*/ ! 699: lprintf(cp, dp) ! 700: char *cp, *dp; ! 701: { ! 702: register int (*P)(); ! 703: ! 704: P = setlist(1); ! 705: printf(cp, dp); ! 706: Putchar = P; ! 707: } ! 708: ! 709: /* ! 710: * Newline + flush. ! 711: */ ! 712: putNFL() ! 713: { ! 714: ! 715: putnl(); ! 716: flush(); ! 717: } ! 718: ! 719: /* ! 720: * Try to start -nl mode. ! 721: */ ! 722: pstart() ! 723: { ! 724: ! 725: if (NONL) ! 726: return; ! 727: if (!value(OPTIMIZE)) ! 728: return; ! 729: if (ruptible == 0 || pfast) ! 730: return; ! 731: fgoto(); ! 732: flusho(); ! 733: pfast = 1; ! 734: normtty++; ! 735: tty.sg_flags = normf & ~(ECHO|XTABS|CRMOD); ! 736: sTTY(1); ! 737: } ! 738: ! 739: /* ! 740: * Stop -nl mode. ! 741: */ ! 742: pstop() ! 743: { ! 744: ! 745: if (inopen) ! 746: return; ! 747: phadnl = 0; ! 748: linp = linb; ! 749: draino(); ! 750: normal(normf); ! 751: pfast &= ~1; ! 752: } ! 753: ! 754: /* ! 755: * Prep tty for open mode. ! 756: */ ! 757: ostart() ! 758: { ! 759: int f; ! 760: ! 761: if (!intty) ! 762: error("Open and visual must be used interactively"); ! 763: gTTY(1); ! 764: normtty++; ! 765: f = tty.sg_flags; ! 766: #ifdef CBREAK ! 767: tty.sg_flags = (normf &~ (ECHO|XTABS|CRMOD)) | CBREAK; ! 768: #else ! 769: tty.sg_flags = (normf &~ (ECHO|XTABS|CRMOD)) | RAW; ! 770: #endif ! 771: #ifdef TIOCGETC ! 772: nttyc.t_quitc = nttyc.t_startc = nttyc.t_stopc = '\377'; ! 773: #endif ! 774: sTTY(1); ! 775: putpad(VS); ! 776: putpad(KS); ! 777: pfast |= 2; ! 778: return (f); ! 779: } ! 780: ! 781: /* ! 782: * Stop open, restoring tty modes. ! 783: */ ! 784: ostop(f) ! 785: int f; ! 786: { ! 787: ! 788: pfast = (f & CRMOD) == 0; ! 789: termreset(), fgoto(), flusho(); ! 790: normal(f); ! 791: putpad(VE); ! 792: putpad(KE); ! 793: } ! 794: ! 795: #ifndef CBREAK ! 796: /* ! 797: * Into cooked mode for interruptibility. ! 798: */ ! 799: vcook() ! 800: { ! 801: ! 802: tty.sg_flags &= ~RAW; ! 803: sTTY(1); ! 804: } ! 805: ! 806: /* ! 807: * Back into raw mode. ! 808: */ ! 809: vraw() ! 810: { ! 811: ! 812: tty.sg_flags |= RAW; ! 813: sTTY(1); ! 814: } ! 815: #endif ! 816: ! 817: /* ! 818: * Restore flags to normal state f. ! 819: */ ! 820: normal(f) ! 821: int f; ! 822: { ! 823: ! 824: if (normtty > 0) { ! 825: setty(f); ! 826: normtty--; ! 827: } ! 828: } ! 829: ! 830: /* ! 831: * Straight set of flags to state f. ! 832: */ ! 833: setty(f) ! 834: int f; ! 835: { ! 836: register int ot = tty.sg_flags; ! 837: ! 838: #ifdef TIOCGETC ! 839: if (f == normf) ! 840: nttyc = ottyc; ! 841: else ! 842: nttyc.t_quitc = nttyc.t_startc = nttyc.t_stopc = '\377'; ! 843: #endif ! 844: tty.sg_flags = f; ! 845: sTTY(1); ! 846: return (ot); ! 847: } ! 848: ! 849: gTTY(i) ! 850: int i; ! 851: { ! 852: ! 853: ignore(gtty(i, &tty)); ! 854: #ifdef TIOCGETC ! 855: ioctl(i, TIOCGETC, &ottyc); ! 856: nttyc = ottyc; ! 857: #endif ! 858: } ! 859: ! 860: sTTY(i) ! 861: int i; ! 862: { ! 863: ! 864: /* ! 865: * Bug in USG tty driver, put out a null char as a patch. ! 866: */ ! 867: #ifdef USG ! 868: if (tty.sg_ospeed == B1200) ! 869: write(1, "", 1); ! 870: #endif ! 871: #ifdef TIOCSETN ! 872: ioctl(i, TIOCSETN, &tty); ! 873: #else ! 874: stty(i, &tty); ! 875: #endif ! 876: #ifdef TIOCSETC ! 877: ioctl(i, TIOCSETC, &nttyc); ! 878: #endif ! 879: } ! 880: ! 881: /* ! 882: * Print newline, or blank if in open/visual ! 883: */ ! 884: noonl() ! 885: { ! 886: ! 887: putchar(Outchar != termchar ? ' ' : '\n'); ! 888: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.