|
|
1.1 ! root 1: # include "curses.ext" ! 2: # include "cr_ex.h" ! 3: ! 4: # define HARDTABS 8 ! 5: ! 6: extern char *tgoto(); ! 7: int plodput(); ! 8: ! 9: /* ! 10: * Terminal driving and line formatting routines. ! 11: * Basic motion optimizations are done here as well ! 12: * as formatting of lines (printing of control characters, ! 13: * line numbering and the like). ! 14: */ ! 15: ! 16: /* ! 17: * Sync the position of the output cursor. ! 18: * Most work here is rounding for terminal boundaries getting the ! 19: * column position implied by wraparound or the lack thereof and ! 20: * rolling up the screen to get destline on the screen. ! 21: */ ! 22: ! 23: static int outcol, outline, destcol, destline, plodcnt; ! 24: ! 25: mvcur(ly, lx, y, x) ! 26: int ly, lx, y, x; { ! 27: ! 28: #ifdef DEBUG ! 29: fprintf(outf, "MVCUR: moving cursor from (%d,%d) to (%d,%d)\n", ly, lx, y, x); ! 30: #endif ! 31: destcol = x; ! 32: destline = y; ! 33: outcol = lx; ! 34: outline = ly; ! 35: fgoto(); ! 36: } ! 37: ! 38: fgoto() { ! 39: ! 40: reg char *cgp; ! 41: reg int l, c; ! 42: ! 43: if (destcol > COLS - 1) { ! 44: destline += destcol / COLS; ! 45: destcol %= COLS; ! 46: } ! 47: if (outcol > COLS - 1) { ! 48: l = (outcol + 1) / COLS; ! 49: outline += l; ! 50: outcol %= COLS; ! 51: if (AM == 0) { ! 52: while (l > 0) { ! 53: if (pfast) ! 54: putchar('\r'); ! 55: putchar('\n'); ! 56: l--; ! 57: } ! 58: outcol = 0; ! 59: } ! 60: if (outline > LINES - 1) { ! 61: destline -= outline - (LINES - 1); ! 62: outline = LINES - 1; ! 63: } ! 64: } ! 65: if (destline > LINES - 1) { ! 66: l = destline; ! 67: destline = LINES - 1; ! 68: if (outline < LINES - 1) { ! 69: c = destcol; ! 70: if (pfast == 0 && !CA) ! 71: destcol = 0; ! 72: fgoto(); ! 73: destcol = c; ! 74: } ! 75: while (l > LINES - 1) { ! 76: putchar('\n'); ! 77: l--; ! 78: if (pfast == 0) ! 79: outcol = 0; ! 80: } ! 81: } ! 82: if (destline < outline && !(CA || UP != NULL)) ! 83: destline = outline; ! 84: cgp = tgoto(CM, destcol, destline); ! 85: if (CA) ! 86: if (plod(strlen(cgp)) > 0) ! 87: plod(0); ! 88: else ! 89: tputs(cgp, 0, _putchar); ! 90: else ! 91: plod(0); ! 92: outline = destline; ! 93: outcol = destcol; ! 94: } ! 95: ! 96: char ! 97: _putchar(c) ! 98: reg char c; { ! 99: ! 100: putchar(c); ! 101: #ifdef DEBUG ! 102: fprintf(outf, "_PUTCHAR(%s)\n", unctrl(c)); ! 103: #endif ! 104: } ! 105: ! 106: extern bool plodflg; ! 107: extern int plodcnt; ! 108: ! 109: plod(cnt) ! 110: int cnt; { ! 111: ! 112: reg int i, j, k; ! 113: reg int soutcol, soutline; ! 114: ! 115: plodcnt = plodflg = cnt; ! 116: soutcol = outcol; ! 117: soutline = outline; ! 118: if (HO) { ! 119: if (GT) ! 120: i = (destcol / HARDTABS) + (destcol % HARDTABS); ! 121: else ! 122: i = destcol; ! 123: if (destcol >= outcol) { ! 124: j = destcol / HARDTABS - outcol / HARDTABS; ! 125: if (GT && j) ! 126: j += destcol % HARDTABS; ! 127: else ! 128: j = destcol - outcol; ! 129: } else ! 130: if (outcol - destcol <= i && (BS || BC)) ! 131: i = j = outcol - destcol; ! 132: else ! 133: j = i + 1; ! 134: k = outline - destline; ! 135: if (k < 0) ! 136: k = -k; ! 137: j += k; ! 138: if (i + destline < j) { ! 139: tputs(HO, 0, plodput); ! 140: outcol = outline = 0; ! 141: } else if (LL) { ! 142: k = (LINES - 1) - destline; ! 143: if (i + k + 2 < j) { ! 144: tputs(LL, 0, plodput); ! 145: outcol = 0; ! 146: outline = LINES - 1; ! 147: } ! 148: } ! 149: } ! 150: if (GT) ! 151: i = destcol % HARDTABS + destcol / HARDTABS; ! 152: else ! 153: i = destcol; ! 154: /* ! 155: if (BT && outcol > destcol && (j = (((outcol+7) & ~7) - destcol - 1) >> 3)) { ! 156: j *= (k = strlen(BT)); ! 157: if ((k += (destcol&7)) > 4) ! 158: j += 8 - (destcol&7); ! 159: else ! 160: j += k; ! 161: } else ! 162: */ ! 163: j = outcol - destcol; ! 164: /* ! 165: * If we will later need a \n which will turn into a \r\n by ! 166: * the system or the terminal, then don't bother to try to \r. ! 167: */ ! 168: if ((NONL || !pfast) && outline < destline) ! 169: goto dontcr; ! 170: /* ! 171: * If the terminal will do a \r\n and there isn't room for it, ! 172: * then we can't afford a \r. ! 173: */ ! 174: if (NC && outline >= destline) ! 175: goto dontcr; ! 176: /* ! 177: * If it will be cheaper, or if we can't back up, then send ! 178: * a return preliminarily. ! 179: */ ! 180: if (j > i + 1 || outcol > destcol && !BS && !BC) { ! 181: plodput('\r'); ! 182: if (NC) { ! 183: plodput('\n'); ! 184: outline++; ! 185: } ! 186: outcol = 0; ! 187: } ! 188: dontcr: ! 189: while (outline < destline) { ! 190: outline++; ! 191: plodput('\n'); ! 192: if (plodcnt < 0) ! 193: goto out; ! 194: if (NONL || pfast == 0) ! 195: outcol = 0; ! 196: } ! 197: if (BT) ! 198: k = strlen(BT); ! 199: while (outcol > destcol) { ! 200: if (plodcnt < 0) ! 201: goto out; ! 202: /* ! 203: if (BT && outcol - destcol > 4+k) { ! 204: tputs(BT, 0, plodput); ! 205: outcol--; ! 206: outcol &= ~7; ! 207: continue; ! 208: } ! 209: */ ! 210: outcol--; ! 211: if (BC) ! 212: tputs(BC, 0, plodput); ! 213: else ! 214: plodput('\b'); ! 215: } ! 216: while (outline > destline) { ! 217: outline--; ! 218: tputs(UP, 0, plodput); ! 219: if (plodcnt < 0) ! 220: goto out; ! 221: } ! 222: if (GT && destcol - outcol > 1) { ! 223: for (;;) { ! 224: i = (outcol / HARDTABS + 1) * HARDTABS; ! 225: if (i > destcol) ! 226: break; ! 227: if (TA) ! 228: tputs(TA, 0, plodput); ! 229: else ! 230: plodput('\t'); ! 231: outcol = i; ! 232: } ! 233: if (destcol - outcol > 4 && i < COLS && (BC || BS)) { ! 234: if (TA) ! 235: tputs(TA, 0, plodput); ! 236: else ! 237: plodput('\t'); ! 238: outcol = i; ! 239: while (outcol > destcol) { ! 240: outcol--; ! 241: if (BC) ! 242: tputs(BC, 0, plodput); ! 243: else ! 244: plodput('\b'); ! 245: } ! 246: } ! 247: } ! 248: while (outcol < destcol) { ! 249: if (ND) ! 250: tputs(ND, 0, plodput); ! 251: else ! 252: plodput(' '); ! 253: outcol++; ! 254: if (plodcnt < 0) ! 255: goto out; ! 256: } ! 257: out: ! 258: if (plodflg) { ! 259: outcol = soutcol; ! 260: outline = soutline; ! 261: } ! 262: return(plodcnt); ! 263: } ! 264: ! 265: /* ! 266: * Move (slowly) to destination. ! 267: * Hard thing here is using home cursor on really deficient terminals. ! 268: * Otherwise just use cursor motions, hacking use of tabs and overtabbing ! 269: * and backspace. ! 270: */ ! 271: ! 272: static bool plodflg; ! 273: ! 274: plodput(c) ! 275: reg char c; { ! 276: ! 277: if (plodflg) ! 278: plodcnt--; ! 279: else { ! 280: putchar(c); ! 281: #ifdef DEBUG ! 282: fprintf(outf, "PLODPUT(%s)\n", unctrl(c)); ! 283: #endif ! 284: } ! 285: } ! 286: ! 287: /* ! 288: * Put with padding ! 289: */ ! 290: putpad(cp) ! 291: reg char *cp; { ! 292: ! 293: fflush(stdout); ! 294: #ifdef DEBUG ! 295: fprintf(outf, "PUTPAD: _puts(\"%s\")\n", cp); ! 296: #endif ! 297: _puts(cp); ! 298: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.