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