|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)ttgeneric.c 3.35 (Berkeley) 6/29/88";
20: #endif /* not lint */
21:
22: #include "ww.h"
23: #include "tt.h"
24:
25: char PC, *BC, *UP;
26: short ospeed;
27:
28: /* normal frame */
29: short gen_frame[16] = {
30: ' ', '|', '-', '+',
31: '|', '|', '+', '+',
32: '-', '+', '-', '+',
33: '+', '+', '+', '+'
34: };
35:
36: /* ANSI graphics frame */
37: #define G (WWM_GRP << WWC_MSHIFT)
38: short ansi_frame[16] = {
39: ' ', 'x'|G, 'Q'|G, 'm'|G,
40: 'x'|G, 'x'|G, 'l'|G, 't'|G,
41: 'q'|G, 'j'|G, 'q'|G, 'v'|G,
42: 'k'|G, 'u'|G, 'w'|G, 'n'|G
43: };
44: struct tt_str ansi_AS = {
45: "\033(0", 3
46: };
47:
48: struct tt_str *gen_CM;
49: struct tt_str *gen_IM;
50: struct tt_str *gen_IC;
51: struct tt_str *gen_IP;
52: struct tt_str *gen_EI;
53: struct tt_str *gen_DC;
54: struct tt_str *gen_AL;
55: struct tt_str *gen_DL;
56: struct tt_str *gen_CE;
57: struct tt_str *gen_CD;
58: struct tt_str *gen_CL;
59: struct tt_str *gen_VS;
60: struct tt_str *gen_VE;
61: struct tt_str *gen_TI;
62: struct tt_str *gen_TE;
63: struct tt_str *gen_SO;
64: struct tt_str *gen_SE;
65: struct tt_str *gen_US;
66: struct tt_str *gen_UE;
67: struct tt_str *gen_UP;
68: struct tt_str *gen_PC;
69: struct tt_str *gen_BC;
70: struct tt_str *gen_ND;
71: struct tt_str *gen_HO;
72: struct tt_str *gen_NL;
73: struct tt_str *gen_CR;
74: struct tt_str *gen_AS;
75: struct tt_str *gen_AE;
76: struct tt_str *gen_XS;
77: struct tt_str *gen_XE;
78: struct tt_str *gen_SF;
79: struct tt_str *gen_SR;
80: struct tt_str *gen_CS;
81: char gen_MI;
82: char gen_MS;
83: char gen_AM;
84: char gen_OS;
85: char gen_BS;
86: char gen_DA;
87: char gen_DB;
88: char gen_NS;
89: char gen_XN;
90: int gen_CO;
91: int gen_LI;
92: int gen_UG;
93: int gen_SG;
94:
95: gen_setinsert(new)
96: char new;
97: {
98: if (new) {
99: if (gen_IM)
100: ttxputs(gen_IM);
101: } else
102: if (gen_EI)
103: ttxputs(gen_EI);
104: tt.tt_insert = new;
105: }
106:
107: gen_setmodes(new)
108: register new;
109: {
110: register diff;
111:
112: diff = new ^ tt.tt_modes;
113: if (diff & WWM_REV) {
114: if (new & WWM_REV) {
115: if (gen_SO)
116: ttxputs(gen_SO);
117: } else
118: if (gen_SE)
119: ttxputs(gen_SE);
120: }
121: if (diff & WWM_UL) {
122: if (new & WWM_UL) {
123: if (gen_US)
124: ttxputs(gen_US);
125: } else
126: if (gen_UE)
127: ttxputs(gen_UE);
128: }
129: if (diff & WWM_GRP) {
130: if (new & WWM_GRP) {
131: if (gen_AS)
132: ttxputs(gen_AS);
133: } else
134: if (gen_AE)
135: ttxputs(gen_AE);
136: }
137: if (diff & WWM_USR) {
138: if (new & WWM_USR) {
139: if (gen_XS)
140: ttxputs(gen_XS);
141: } else
142: if (gen_XE)
143: ttxputs(gen_XE);
144: }
145: tt.tt_modes = new;
146: }
147:
148: gen_insline()
149: {
150: if (tt.tt_modes) /* for concept 100 */
151: gen_setmodes(0);
152: if (gen_AL)
153: tttputs(gen_AL, gen_LI - tt.tt_row);
154: }
155:
156: gen_delline()
157: {
158: if (tt.tt_modes) /* for concept 100 */
159: gen_setmodes(0);
160: if (gen_DL)
161: tttputs(gen_DL, gen_LI - tt.tt_row);
162: }
163:
164: gen_putc(c)
165: register char c;
166: {
167: if (tt.tt_ninsert != tt.tt_insert)
168: gen_setinsert(tt.tt_ninsert);
169: if (tt.tt_nmodes != tt.tt_modes)
170: gen_setmodes(tt.tt_nmodes);
171: if (tt.tt_insert) {
172: if (gen_IC)
173: tttputs(gen_IC, gen_CO - tt.tt_col);
174: ttputc(c);
175: if (gen_IP)
176: tttputs(gen_IP, gen_CO - tt.tt_col);
177: } else
178: ttputc(c);
179: if (++tt.tt_col == gen_CO)
180: if (gen_XN)
181: tt.tt_col = tt.tt_row = -10;
182: else if (gen_AM)
183: tt.tt_col = 0, tt.tt_row++;
184: else
185: tt.tt_col--;
186: }
187:
188: gen_write(p, n)
189: register char *p;
190: register n;
191: {
192: if (tt.tt_ninsert != tt.tt_insert)
193: gen_setinsert(tt.tt_ninsert);
194: if (tt.tt_nmodes != tt.tt_modes)
195: gen_setmodes(tt.tt_nmodes);
196: if (tt.tt_insert && (gen_IC || gen_IP)) {
197: while (--n >= 0) {
198: if (gen_IC)
199: tttputs(gen_IC, gen_CO - tt.tt_col);
200: ttputc(*p++);
201: if (gen_IP)
202: tttputs(gen_IP, gen_CO - tt.tt_col);
203: tt.tt_col++;
204: }
205: } else {
206: tt.tt_col += n;
207: ttwrite(p, n);
208: }
209: if (tt.tt_col == gen_CO)
210: if (gen_XN)
211: tt.tt_col = tt.tt_row = -10;
212: else if (gen_AM)
213: tt.tt_col = 0, tt.tt_row++;
214: else
215: tt.tt_col--;
216: }
217:
218: gen_move(row, col)
219: register int row, col;
220: {
221: if (tt.tt_row == row && tt.tt_col == col)
222: return;
223: if (!gen_MI && tt.tt_insert)
224: gen_setinsert(0);
225: if (!gen_MS && tt.tt_modes)
226: gen_setmodes(0);
227: if (row < tt.tt_scroll_top || row > tt.tt_scroll_bot)
228: gen_setscroll(tt.tt_nrow - 1, 0);
229: if (tt.tt_row == row) {
230: if (col == 0) {
231: ttxputs(gen_CR);
232: goto out;
233: }
234: if (tt.tt_col == col - 1) {
235: if (gen_ND) {
236: ttxputs(gen_ND);
237: goto out;
238: }
239: } else if (tt.tt_col == col + 1) {
240: if (gen_BC) {
241: ttxputs(gen_BC);
242: goto out;
243: }
244: }
245: }
246: if (tt.tt_col == col) {
247: if (tt.tt_row == row + 1) {
248: if (gen_UP) {
249: ttxputs(gen_UP);
250: goto out;
251: }
252: } else if (tt.tt_row == row + 1) {
253: ttxputs(gen_NL);
254: goto out;
255: }
256: }
257: if (gen_HO && col == 0 && row == 0) {
258: ttxputs(gen_HO);
259: goto out;
260: }
261: tttgoto(gen_CM, col, row);
262: out:
263: tt.tt_col = col;
264: tt.tt_row = row;
265: }
266:
267: gen_init()
268: {
269: if (gen_VS)
270: ttxputs(gen_VS);
271: if (gen_TI)
272: ttxputs(gen_TI);
273: ttxputs(gen_CL);
274: tt.tt_col = tt.tt_row = 0;
275: tt.tt_ninsert = tt.tt_insert = 0;
276: tt.tt_nmodes = tt.tt_modes = 0;
277: }
278:
279: gen_end()
280: {
281: if (gen_TE)
282: ttxputs(gen_TE);
283: if (gen_VE)
284: ttxputs(gen_VE);
285: }
286:
287: gen_clreol()
288: {
289: if (tt.tt_modes) /* for concept 100 */
290: gen_setmodes(0);
291: tttputs(gen_CE, gen_CO - tt.tt_col);
292: }
293:
294: gen_clreos()
295: {
296: if (tt.tt_modes) /* for concept 100 */
297: gen_setmodes(0);
298: tttputs(gen_CD, gen_LI - tt.tt_row);
299: }
300:
301: gen_clear()
302: {
303: if (tt.tt_modes) /* for concept 100 */
304: gen_setmodes(0);
305: ttxputs(gen_CL);
306: }
307:
308: gen_delchar()
309: {
310: tttputs(gen_DC, gen_CO - tt.tt_col);
311: }
312:
313: gen_scroll_down()
314: {
315: gen_move(tt.tt_scroll_bot, 0);
316: ttxputs(gen_SF);
317: }
318:
319: gen_scroll_up()
320: {
321: gen_move(tt.tt_scroll_top, 0);
322: ttxputs(gen_SR);
323: }
324:
325: gen_setscroll(top, bot)
326: {
327: tttgoto(gen_CS, bot, top);
328: tt.tt_scroll_top = top;
329: tt.tt_scroll_bot = bot;
330: tt.tt_row = tt.tt_col = -10;
331: }
332:
333: tt_generic()
334: {
335: gen_PC = tttgetstr("pc");
336: PC = gen_PC ? *gen_PC->ts_str : 0;
337: ospeed = wwoldtty.ww_sgttyb.sg_ospeed;
338:
339: gen_CM = ttxgetstr("cm"); /* may not work */
340: gen_IM = ttxgetstr("im");
341: gen_IC = tttgetstr("ic");
342: gen_IP = tttgetstr("ip");
343: gen_EI = ttxgetstr("ei");
344: gen_DC = tttgetstr("dc");
345: gen_AL = tttgetstr("al");
346: gen_DL = tttgetstr("dl");
347: gen_CE = tttgetstr("ce");
348: gen_CD = tttgetstr("cd");
349: gen_CL = ttxgetstr("cl");
350: gen_VS = ttxgetstr("vs");
351: gen_VE = ttxgetstr("ve");
352: gen_TI = ttxgetstr("ti");
353: gen_TE = ttxgetstr("te");
354: gen_SO = ttxgetstr("so");
355: gen_SE = ttxgetstr("se");
356: gen_US = ttxgetstr("us");
357: gen_UE = ttxgetstr("ue");
358: gen_UP = ttxgetstr("up");
359: gen_BC = ttxgetstr("bc");
360: gen_ND = ttxgetstr("nd");
361: gen_HO = ttxgetstr("ho");
362: gen_NL = ttxgetstr("nl");
363: gen_CR = ttxgetstr("cr");
364: gen_AS = ttxgetstr("as");
365: gen_AE = ttxgetstr("ae");
366: gen_XS = ttxgetstr("XS");
367: gen_XE = ttxgetstr("XE");
368: gen_SF = ttxgetstr("sf");
369: gen_SR = ttxgetstr("sr");
370: gen_CS = ttxgetstr("cs");
371: gen_MI = tgetflag("mi");
372: gen_MS = tgetflag("ms");
373: gen_AM = tgetflag("am");
374: gen_OS = tgetflag("os");
375: gen_BS = tgetflag("bs");
376: gen_DA = tgetflag("da");
377: gen_DB = tgetflag("db");
378: gen_NS = tgetflag("ns");
379: gen_XN = tgetflag("xn");
380: gen_CO = tgetnum("co");
381: gen_LI = tgetnum("li");
382: gen_UG = tgetnum("ug");
383: gen_SG = tgetnum("sg");
384: if (gen_CL == 0 || gen_OS || gen_CM == 0)
385: return -1;
386:
387: if (gen_NL == 0) {
388: static struct tt_str nl = { "\n", 1 };
389: gen_NL = &nl;
390: }
391: if (gen_CR == 0) {
392: static struct tt_str cr = { "\r", 1 };
393: gen_CR = &cr;
394: }
395: if (gen_BC == 0 && gen_BS) {
396: static struct tt_str bc = { "\b", 1 };
397: gen_BC = &bc;
398: }
399: if (gen_SF == 0 && !gen_NS)
400: gen_SF = gen_NL;
401: BC = gen_BC ? gen_BC->ts_str : 0;
402: UP = gen_UP ? gen_UP->ts_str : 0;
403:
404: if (gen_DC)
405: tt.tt_delchar = gen_delchar;
406: if (gen_AL)
407: tt.tt_insline = gen_insline;
408: if (gen_DL)
409: tt.tt_delline = gen_delline;
410: if (gen_CE)
411: tt.tt_clreol = gen_clreol;
412: if (gen_CD)
413: tt.tt_clreos = gen_clreos;
414: if (gen_SF)
415: tt.tt_scroll_down = gen_scroll_down;
416: /*
417: * Don't allow scroll_up if da or db but not cs.
418: * See comment in wwscroll.c.
419: */
420: if (gen_SR && (gen_CS || !gen_DA && !gen_DB))
421: tt.tt_scroll_up = gen_scroll_up;
422: if (gen_CS)
423: tt.tt_setscroll = gen_setscroll;
424: if (gen_SG > 0)
425: gen_SO = 0;
426: if (gen_UG > 0 || gen_US && gen_SO && ttstrcmp(gen_US, gen_SO) == 0)
427: gen_US = 0;
428: if (gen_SO)
429: tt.tt_availmodes |= WWM_REV;
430: if (gen_US)
431: tt.tt_availmodes |= WWM_UL;
432: if (gen_AS)
433: tt.tt_availmodes |= WWM_GRP;
434: if (gen_XS)
435: tt.tt_availmodes |= WWM_USR;
436: tt.tt_hasinsert = gen_IM != 0;
437: tt.tt_wrap = gen_AM;
438: tt.tt_retain = gen_DB;
439: tt.tt_ncol = gen_CO;
440: tt.tt_nrow = gen_LI;
441: tt.tt_init = gen_init;
442: tt.tt_end = gen_end;
443: tt.tt_write = gen_write;
444: tt.tt_putc = gen_putc;
445: tt.tt_move = gen_move;
446: tt.tt_clear = gen_clear;
447: tt.tt_setinsert = gen_setinsert;
448: tt.tt_setmodes = gen_setmodes;
449: tt.tt_frame = gen_AS && ttstrcmp(gen_AS, &ansi_AS) == 0 ?
450: ansi_frame : gen_frame;
451: return 0;
452: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.