|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char *sccsid = "@(#)ex_subr.c 7.10 (Berkeley) 6/7/85"; ! 9: #endif not lint ! 10: ! 11: #include "ex.h" ! 12: #include "ex_re.h" ! 13: #include "ex_tty.h" ! 14: #include "ex_vis.h" ! 15: ! 16: /* ! 17: * Random routines, in alphabetical order. ! 18: */ ! 19: ! 20: any(c, s) ! 21: int c; ! 22: register char *s; ! 23: { ! 24: register int x; ! 25: ! 26: while (x = *s++) ! 27: if (x == c) ! 28: return (1); ! 29: return (0); ! 30: } ! 31: ! 32: backtab(i) ! 33: register int i; ! 34: { ! 35: register int j; ! 36: ! 37: j = i % value(SHIFTWIDTH); ! 38: if (j == 0) ! 39: j = value(SHIFTWIDTH); ! 40: i -= j; ! 41: if (i < 0) ! 42: i = 0; ! 43: return (i); ! 44: } ! 45: ! 46: change() ! 47: { ! 48: ! 49: tchng++; ! 50: chng = tchng; ! 51: } ! 52: ! 53: /* ! 54: * Column returns the number of ! 55: * columns occupied by printing the ! 56: * characters through position cp of the ! 57: * current line. ! 58: */ ! 59: column(cp) ! 60: register char *cp; ! 61: { ! 62: ! 63: if (cp == 0) ! 64: cp = &linebuf[LBSIZE - 2]; ! 65: return (qcolumn(cp, (char *) 0)); ! 66: } ! 67: ! 68: /* ! 69: * Ignore a comment to the end of the line. ! 70: * This routine eats the trailing newline so don't call newline(). ! 71: */ ! 72: comment() ! 73: { ! 74: register int c; ! 75: ! 76: do { ! 77: c = getchar(); ! 78: } while (c != '\n' && c != EOF); ! 79: if (c == EOF) ! 80: ungetchar(c); ! 81: } ! 82: ! 83: Copy(to, from, size) ! 84: register char *from, *to; ! 85: register int size; ! 86: { ! 87: ! 88: if (size > 0) ! 89: do ! 90: *to++ = *from++; ! 91: while (--size > 0); ! 92: } ! 93: ! 94: copyw(to, from, size) ! 95: register line *from, *to; ! 96: register int size; ! 97: { ! 98: ! 99: if (size > 0) ! 100: do ! 101: *to++ = *from++; ! 102: while (--size > 0); ! 103: } ! 104: ! 105: copywR(to, from, size) ! 106: register line *from, *to; ! 107: register int size; ! 108: { ! 109: ! 110: while (--size >= 0) ! 111: to[size] = from[size]; ! 112: } ! 113: ! 114: ctlof(c) ! 115: int c; ! 116: { ! 117: ! 118: return (c == TRIM ? '?' : c | ('A' - 1)); ! 119: } ! 120: ! 121: dingdong() ! 122: { ! 123: ! 124: if (VB) ! 125: putpad(VB); ! 126: else if (value(ERRORBELLS)) ! 127: putch('\207'); ! 128: } ! 129: ! 130: fixindent(indent) ! 131: int indent; ! 132: { ! 133: register int i; ! 134: register char *cp; ! 135: ! 136: i = whitecnt(genbuf); ! 137: cp = vpastwh(genbuf); ! 138: if (*cp == 0 && i == indent && linebuf[0] == 0) { ! 139: genbuf[0] = 0; ! 140: return (i); ! 141: } ! 142: CP(genindent(i), cp); ! 143: return (i); ! 144: } ! 145: ! 146: filioerr(cp) ! 147: char *cp; ! 148: { ! 149: register int oerrno = errno; ! 150: ! 151: lprintf("\"%s\"", cp); ! 152: errno = oerrno; ! 153: syserror(); ! 154: } ! 155: ! 156: char * ! 157: genindent(indent) ! 158: register int indent; ! 159: { ! 160: register char *cp; ! 161: ! 162: for (cp = genbuf; indent >= value(TABSTOP); indent -= value(TABSTOP)) ! 163: *cp++ = '\t'; ! 164: for (; indent > 0; indent--) ! 165: *cp++ = ' '; ! 166: return (cp); ! 167: } ! 168: ! 169: getDOT() ! 170: { ! 171: ! 172: getline(*dot); ! 173: } ! 174: ! 175: line * ! 176: getmark(c) ! 177: register int c; ! 178: { ! 179: register line *addr; ! 180: ! 181: for (addr = one; addr <= dol; addr++) ! 182: if (names[c - 'a'] == (*addr &~ 01)) { ! 183: return (addr); ! 184: } ! 185: return (0); ! 186: } ! 187: ! 188: getn(cp) ! 189: register char *cp; ! 190: { ! 191: register int i = 0; ! 192: ! 193: while (isdigit(*cp)) ! 194: i = i * 10 + *cp++ - '0'; ! 195: if (*cp) ! 196: return (0); ! 197: return (i); ! 198: } ! 199: ! 200: ignnEOF() ! 201: { ! 202: register int c = getchar(); ! 203: ! 204: if (c == EOF) ! 205: ungetchar(c); ! 206: else if (c=='"') ! 207: comment(); ! 208: } ! 209: ! 210: iswhite(c) ! 211: int c; ! 212: { ! 213: ! 214: return (c == ' ' || c == '\t'); ! 215: } ! 216: ! 217: junk(c) ! 218: register int c; ! 219: { ! 220: ! 221: if (c && !value(BEAUTIFY)) ! 222: return (0); ! 223: if (c >= ' ' && c != TRIM) ! 224: return (0); ! 225: switch (c) { ! 226: ! 227: case '\t': ! 228: case '\n': ! 229: case '\f': ! 230: return (0); ! 231: ! 232: default: ! 233: return (1); ! 234: } ! 235: } ! 236: ! 237: killed() ! 238: { ! 239: ! 240: killcnt(addr2 - addr1 + 1); ! 241: } ! 242: ! 243: killcnt(cnt) ! 244: register int cnt; ! 245: { ! 246: ! 247: if (inopen) { ! 248: notecnt = cnt; ! 249: notenam = notesgn = ""; ! 250: return; ! 251: } ! 252: if (!notable(cnt)) ! 253: return; ! 254: printf("%d lines", cnt); ! 255: if (value(TERSE) == 0) { ! 256: printf(" %c%s", Command[0] | ' ', Command + 1); ! 257: if (Command[strlen(Command) - 1] != 'e') ! 258: putchar('e'); ! 259: putchar('d'); ! 260: } ! 261: putNFL(); ! 262: } ! 263: ! 264: lineno(a) ! 265: line *a; ! 266: { ! 267: ! 268: return (a - zero); ! 269: } ! 270: ! 271: lineDOL() ! 272: { ! 273: ! 274: return (lineno(dol)); ! 275: } ! 276: ! 277: lineDOT() ! 278: { ! 279: ! 280: return (lineno(dot)); ! 281: } ! 282: ! 283: markDOT() ! 284: { ! 285: ! 286: markpr(dot); ! 287: } ! 288: ! 289: markpr(which) ! 290: line *which; ! 291: { ! 292: ! 293: if ((inglobal == 0 || inopen) && which <= endcore) { ! 294: names['z'-'a'+1] = *which & ~01; ! 295: if (inopen) ! 296: ncols['z'-'a'+1] = cursor; ! 297: } ! 298: } ! 299: ! 300: markreg(c) ! 301: register int c; ! 302: { ! 303: ! 304: if (c == '\'' || c == '`') ! 305: return ('z' + 1); ! 306: if (c >= 'a' && c <= 'z') ! 307: return (c); ! 308: return (0); ! 309: } ! 310: ! 311: /* ! 312: * Mesg decodes the terse/verbose strings. Thus ! 313: * 'xxx@yyy' -> 'xxx' if terse, else 'xxx yyy' ! 314: * 'xxx|yyy' -> 'xxx' if terse, else 'yyy' ! 315: * All others map to themselves. ! 316: */ ! 317: char * ! 318: mesg(str) ! 319: register char *str; ! 320: { ! 321: register char *cp; ! 322: ! 323: str = strcpy(genbuf, str); ! 324: for (cp = str; *cp; cp++) ! 325: switch (*cp) { ! 326: ! 327: case '@': ! 328: if (value(TERSE)) ! 329: *cp = 0; ! 330: else ! 331: *cp = ' '; ! 332: break; ! 333: ! 334: case '|': ! 335: if (value(TERSE) == 0) ! 336: return (cp + 1); ! 337: *cp = 0; ! 338: break; ! 339: } ! 340: return (str); ! 341: } ! 342: ! 343: /*VARARGS2*/ ! 344: merror(seekpt, i) ! 345: #ifdef VMUNIX ! 346: char *seekpt; ! 347: #else ! 348: # ifdef lint ! 349: char *seekpt; ! 350: # else ! 351: int seekpt; ! 352: # endif ! 353: #endif ! 354: int i; ! 355: { ! 356: register char *cp = linebuf; ! 357: ! 358: if (seekpt == 0) ! 359: return; ! 360: merror1(seekpt); ! 361: if (*cp == '\n') ! 362: putnl(), cp++; ! 363: if (inopen > 0 && CE) ! 364: vclreol(); ! 365: if (SO && SE) ! 366: putpad(SO); ! 367: printf(mesg(cp), i); ! 368: if (SO && SE) ! 369: putpad(SE); ! 370: } ! 371: ! 372: merror1(seekpt) ! 373: #ifdef VMUNIX ! 374: char *seekpt; ! 375: #else ! 376: # ifdef lint ! 377: char *seekpt; ! 378: # else ! 379: int seekpt; ! 380: # endif ! 381: #endif ! 382: { ! 383: ! 384: #ifdef VMUNIX ! 385: strcpy(linebuf, seekpt); ! 386: #else ! 387: lseek(erfile, (long) seekpt, 0); ! 388: if (read(erfile, linebuf, 128) < 2) ! 389: CP(linebuf, "ERROR"); ! 390: #endif ! 391: } ! 392: ! 393: morelines() ! 394: { ! 395: ! 396: if ((int) sbrk(1024 * sizeof (line)) == -1) ! 397: return (-1); ! 398: endcore += 1024; ! 399: return (0); ! 400: } ! 401: ! 402: nonzero() ! 403: { ! 404: ! 405: if (addr1 == zero) { ! 406: notempty(); ! 407: error("Nonzero address required@on this command"); ! 408: } ! 409: } ! 410: ! 411: notable(i) ! 412: int i; ! 413: { ! 414: ! 415: return (hush == 0 && !inglobal && i > value(REPORT)); ! 416: } ! 417: ! 418: ! 419: notempty() ! 420: { ! 421: ! 422: if (dol == zero) ! 423: error("No lines@in the buffer"); ! 424: } ! 425: ! 426: ! 427: netchHAD(cnt) ! 428: int cnt; ! 429: { ! 430: ! 431: netchange(lineDOL() - cnt); ! 432: } ! 433: ! 434: netchange(i) ! 435: register int i; ! 436: { ! 437: register char *cp; ! 438: ! 439: if (i > 0) ! 440: notesgn = cp = "more "; ! 441: else ! 442: notesgn = cp = "fewer ", i = -i; ! 443: if (inopen) { ! 444: notecnt = i; ! 445: notenam = ""; ! 446: return; ! 447: } ! 448: if (!notable(i)) ! 449: return; ! 450: printf(mesg("%d %slines@in file after %s"), i, cp, Command); ! 451: putNFL(); ! 452: } ! 453: ! 454: putmark(addr) ! 455: line *addr; ! 456: { ! 457: ! 458: putmk1(addr, putline()); ! 459: } ! 460: ! 461: putmk1(addr, n) ! 462: register line *addr; ! 463: int n; ! 464: { ! 465: register line *markp; ! 466: register oldglobmk; ! 467: ! 468: oldglobmk = *addr & 1; ! 469: *addr &= ~1; ! 470: for (markp = (anymarks ? names : &names['z'-'a'+1]); ! 471: markp <= &names['z'-'a'+1]; markp++) ! 472: if (*markp == *addr) ! 473: *markp = n; ! 474: *addr = n | oldglobmk; ! 475: } ! 476: ! 477: char * ! 478: plural(i) ! 479: long i; ! 480: { ! 481: ! 482: return (i == 1 ? "" : "s"); ! 483: } ! 484: ! 485: int qcount(); ! 486: short vcntcol; ! 487: ! 488: qcolumn(lim, gp) ! 489: register char *lim, *gp; ! 490: { ! 491: register int x; ! 492: int (*OO)(); ! 493: ! 494: OO = Outchar; ! 495: Outchar = qcount; ! 496: vcntcol = 0; ! 497: if (lim != NULL) ! 498: x = lim[1], lim[1] = 0; ! 499: pline(0); ! 500: if (lim != NULL) ! 501: lim[1] = x; ! 502: if (gp) ! 503: while (*gp) ! 504: putchar(*gp++); ! 505: Outchar = OO; ! 506: return (vcntcol); ! 507: } ! 508: ! 509: int ! 510: qcount(c) ! 511: int c; ! 512: { ! 513: ! 514: if (c == '\t') { ! 515: vcntcol += value(TABSTOP) - vcntcol % value(TABSTOP); ! 516: return; ! 517: } ! 518: vcntcol++; ! 519: } ! 520: ! 521: reverse(a1, a2) ! 522: register line *a1, *a2; ! 523: { ! 524: register line t; ! 525: ! 526: for (;;) { ! 527: t = *--a2; ! 528: if (a2 <= a1) ! 529: return; ! 530: *a2 = *a1; ! 531: *a1++ = t; ! 532: } ! 533: } ! 534: ! 535: save(a1, a2) ! 536: line *a1; ! 537: register line *a2; ! 538: { ! 539: register int more; ! 540: ! 541: if (!FIXUNDO) ! 542: return; ! 543: #ifdef TRACE ! 544: if (trace) ! 545: vudump("before save"); ! 546: #endif ! 547: undkind = UNDNONE; ! 548: undadot = dot; ! 549: more = (a2 - a1 + 1) - (unddol - dol); ! 550: while (more > (endcore - truedol)) ! 551: if (morelines() < 0) ! 552: error("Out of memory@saving lines for undo - try using ed"); ! 553: if (more) ! 554: (*(more > 0 ? copywR : copyw))(unddol + more + 1, unddol + 1, ! 555: (truedol - unddol)); ! 556: unddol += more; ! 557: truedol += more; ! 558: copyw(dol + 1, a1, a2 - a1 + 1); ! 559: undkind = UNDALL; ! 560: unddel = a1 - 1; ! 561: undap1 = a1; ! 562: undap2 = a2 + 1; ! 563: #ifdef TRACE ! 564: if (trace) ! 565: vudump("after save"); ! 566: #endif ! 567: } ! 568: ! 569: save12() ! 570: { ! 571: ! 572: save(addr1, addr2); ! 573: } ! 574: ! 575: saveall() ! 576: { ! 577: ! 578: save(one, dol); ! 579: } ! 580: ! 581: span() ! 582: { ! 583: ! 584: return (addr2 - addr1 + 1); ! 585: } ! 586: ! 587: sync() ! 588: { ! 589: ! 590: chng = 0; ! 591: tchng = 0; ! 592: xchng = 0; ! 593: } ! 594: ! 595: ! 596: skipwh() ! 597: { ! 598: register int wh; ! 599: ! 600: wh = 0; ! 601: while (iswhite(peekchar())) { ! 602: wh++; ! 603: ignchar(); ! 604: } ! 605: return (wh); ! 606: } ! 607: ! 608: /*VARARGS2*/ ! 609: smerror(seekpt, cp) ! 610: #ifdef lint ! 611: char *seekpt; ! 612: #else ! 613: int seekpt; ! 614: #endif ! 615: char *cp; ! 616: { ! 617: ! 618: if (seekpt == 0) ! 619: return; ! 620: merror1(seekpt); ! 621: if (inopen && CE) ! 622: vclreol(); ! 623: if (SO && SE) ! 624: putpad(SO); ! 625: lprintf(mesg(linebuf), cp); ! 626: if (SO && SE) ! 627: putpad(SE); ! 628: } ! 629: ! 630: char * ! 631: strend(cp) ! 632: register char *cp; ! 633: { ! 634: ! 635: while (*cp) ! 636: cp++; ! 637: return (cp); ! 638: } ! 639: ! 640: strcLIN(dp) ! 641: char *dp; ! 642: { ! 643: ! 644: CP(linebuf, dp); ! 645: } ! 646: ! 647: syserror() ! 648: { ! 649: register int e = errno; ! 650: extern int sys_nerr; ! 651: extern char *sys_errlist[]; ! 652: ! 653: dirtcnt = 0; ! 654: putchar(' '); ! 655: if (e >= 0 && e <= sys_nerr) ! 656: error(sys_errlist[e]); ! 657: else ! 658: error("System error %d", e); ! 659: } ! 660: ! 661: /* ! 662: * Return the column number that results from being in column col and ! 663: * hitting a tab, where tabs are set every ts columns. Work right for ! 664: * the case where col > COLUMNS, even if ts does not divide COLUMNS. ! 665: */ ! 666: tabcol(col, ts) ! 667: int col, ts; ! 668: { ! 669: int offset, result; ! 670: ! 671: if (col >= COLUMNS) { ! 672: offset = COLUMNS * (col/COLUMNS); ! 673: col -= offset; ! 674: } else ! 675: offset = 0; ! 676: result = col + ts - (col % ts) + offset; ! 677: return (result); ! 678: } ! 679: ! 680: char * ! 681: vfindcol(i) ! 682: int i; ! 683: { ! 684: register char *cp; ! 685: register int (*OO)() = Outchar; ! 686: ! 687: Outchar = qcount; ! 688: ignore(qcolumn(linebuf - 1, NOSTR)); ! 689: for (cp = linebuf; *cp && vcntcol < i; cp++) ! 690: putchar(*cp); ! 691: if (cp != linebuf) ! 692: cp--; ! 693: Outchar = OO; ! 694: return (cp); ! 695: } ! 696: ! 697: char * ! 698: vskipwh(cp) ! 699: register char *cp; ! 700: { ! 701: ! 702: while (iswhite(*cp) && cp[1]) ! 703: cp++; ! 704: return (cp); ! 705: } ! 706: ! 707: ! 708: char * ! 709: vpastwh(cp) ! 710: register char *cp; ! 711: { ! 712: ! 713: while (iswhite(*cp)) ! 714: cp++; ! 715: return (cp); ! 716: } ! 717: ! 718: whitecnt(cp) ! 719: register char *cp; ! 720: { ! 721: register int i; ! 722: ! 723: i = 0; ! 724: for (;;) ! 725: switch (*cp++) { ! 726: ! 727: case '\t': ! 728: i += value(TABSTOP) - i % value(TABSTOP); ! 729: break; ! 730: ! 731: case ' ': ! 732: i++; ! 733: break; ! 734: ! 735: default: ! 736: return (i); ! 737: } ! 738: } ! 739: ! 740: #ifdef lint ! 741: Ignore(a) ! 742: char *a; ! 743: { ! 744: ! 745: a = a; ! 746: } ! 747: ! 748: Ignorf(a) ! 749: int (*a)(); ! 750: { ! 751: ! 752: a = a; ! 753: } ! 754: #endif ! 755: ! 756: markit(addr) ! 757: line *addr; ! 758: { ! 759: ! 760: if (addr != dot && addr >= one && addr <= dol) ! 761: markDOT(); ! 762: } ! 763: ! 764: /* ! 765: * The following code is defensive programming against a bug in the ! 766: * pdp-11 overlay implementation. Sometimes it goes nuts and asks ! 767: * for an overlay with some garbage number, which generates an emt ! 768: * trap. This is a less than elegant solution, but it is somewhat ! 769: * better than core dumping and losing your work, leaving your tty ! 770: * in a weird state, etc. ! 771: */ ! 772: int _ovno; ! 773: onemt() ! 774: { ! 775: int oovno; ! 776: ! 777: signal(SIGEMT, onemt); ! 778: oovno = _ovno; ! 779: /* 2 and 3 are valid on 11/40 type vi, so */ ! 780: if (_ovno < 0 || _ovno > 3) ! 781: _ovno = 0; ! 782: error("emt trap, _ovno is %d @ - try again"); ! 783: } ! 784: ! 785: /* ! 786: * When a hangup occurs our actions are similar to a preserve ! 787: * command. If the buffer has not been [Modified], then we do ! 788: * nothing but remove the temporary files and exit. ! 789: * Otherwise, we sync the temp file and then attempt a preserve. ! 790: * If the preserve succeeds, we unlink our temp files. ! 791: * If the preserve fails, we leave the temp files as they are ! 792: * as they are a backup even without preservation if they ! 793: * are not removed. ! 794: */ ! 795: onhup() ! 796: { ! 797: ! 798: /* ! 799: * USG tty driver can send multiple HUP's!! ! 800: */ ! 801: signal(SIGINT, SIG_IGN); ! 802: signal(SIGHUP, SIG_IGN); ! 803: if (chng == 0) { ! 804: cleanup(1); ! 805: exit(0); ! 806: } ! 807: if (setexit() == 0) { ! 808: if (preserve()) { ! 809: cleanup(1); ! 810: exit(0); ! 811: } ! 812: } ! 813: exit(1); ! 814: } ! 815: ! 816: /* ! 817: * An interrupt occurred. Drain any output which ! 818: * is still in the output buffering pipeline. ! 819: * Catch interrupts again. Unless we are in visual ! 820: * reset the output state (out of -nl mode, e.g). ! 821: * Then like a normal error (with the \n before Interrupt ! 822: * suppressed in visual mode). ! 823: */ ! 824: onintr() ! 825: { ! 826: ! 827: #ifndef CBREAK ! 828: signal(SIGINT, onintr); ! 829: #else ! 830: signal(SIGINT, inopen ? vintr : onintr); ! 831: #endif ! 832: alarm(0); /* in case we were called from map */ ! 833: draino(); ! 834: if (!inopen) { ! 835: pstop(); ! 836: setlastchar('\n'); ! 837: #ifdef CBREAK ! 838: } ! 839: #else ! 840: } else ! 841: vraw(); ! 842: #endif ! 843: error("\nInterrupt" + inopen); ! 844: } ! 845: ! 846: /* ! 847: * If we are interruptible, enable interrupts again. ! 848: * In some critical sections we turn interrupts off, ! 849: * but not very often. ! 850: */ ! 851: setrupt() ! 852: { ! 853: ! 854: if (ruptible) { ! 855: #ifndef CBREAK ! 856: signal(SIGINT, onintr); ! 857: #else ! 858: signal(SIGINT, inopen ? vintr : onintr); ! 859: #endif ! 860: #ifdef SIGTSTP ! 861: if (dosusp) ! 862: signal(SIGTSTP, onsusp); ! 863: #endif ! 864: } ! 865: } ! 866: ! 867: preserve() ! 868: { ! 869: ! 870: #ifdef VMUNIX ! 871: tflush(); ! 872: #endif ! 873: synctmp(); ! 874: pid = fork(); ! 875: if (pid < 0) ! 876: return (0); ! 877: if (pid == 0) { ! 878: close(0); ! 879: dup(tfile); ! 880: execl(EXPRESERVE, "expreserve", (char *) 0); ! 881: exit(1); ! 882: } ! 883: waitfor(); ! 884: if (rpid == pid && status == 0) ! 885: return (1); ! 886: return (0); ! 887: } ! 888: ! 889: #ifndef V6 ! 890: exit(i) ! 891: int i; ! 892: { ! 893: ! 894: # ifdef TRACE ! 895: if (trace) ! 896: fclose(trace); ! 897: # endif ! 898: _exit(i); ! 899: } ! 900: #endif ! 901: ! 902: #ifdef SIGTSTP ! 903: /* ! 904: * We have just gotten a susp. Suspend and prepare to resume. ! 905: */ ! 906: onsusp() ! 907: { ! 908: ttymode f; ! 909: int omask; ! 910: struct winsize win; ! 911: ! 912: f = setty(normf); ! 913: vnfl(); ! 914: putpad(TE); ! 915: flush(); ! 916: ! 917: (void) sigsetmask(0); ! 918: signal(SIGTSTP, SIG_DFL); ! 919: kill(0, SIGTSTP); ! 920: ! 921: /* the pc stops here */ ! 922: ! 923: signal(SIGTSTP, onsusp); ! 924: vcontin(0); ! 925: setty(f); ! 926: if (!inopen) ! 927: error(0); ! 928: else { ! 929: if (ioctl(0, TIOCGWINSZ, &win) >= 0) ! 930: if (win.ws_row != winsz.ws_row || ! 931: win.ws_col != winsz.ws_col) ! 932: winch(); ! 933: if (vcnt < 0) { ! 934: vcnt = -vcnt; ! 935: if (state == VISUAL) ! 936: vclear(); ! 937: else if (state == CRTOPEN) ! 938: vcnt = 0; ! 939: } ! 940: vdirty(0, LINES); ! 941: vrepaint(cursor); ! 942: } ! 943: } ! 944: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.