|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)ttgeneric.c 3.29 5/2/86";
3: #endif
4:
5: /*
6: * Copyright (c) 1983 Regents of the University of California,
7: * All rights reserved. Redistribution permitted subject to
8: * the terms of the Berkeley Software License Agreement.
9: */
10:
11: #include "ww.h"
12: #include "tt.h"
13:
14: char PC, *BC, *UP;
15: short ospeed;
16:
17: /* normal frame */
18: short gen_frame[16] = {
19: ' ', '|', '-', '+',
20: '|', '|', '+', '+',
21: '-', '+', '-', '+',
22: '+', '+', '+', '+'
23: };
24:
25: /* ANSI graphics frame */
26: #define G (WWM_GRP << WWC_MSHIFT)
27: short ansi_frame[16] = {
28: ' ', 'x'|G, 'Q'|G, 'm'|G,
29: 'x'|G, 'x'|G, 'l'|G, 't'|G,
30: 'q'|G, 'j'|G, 'q'|G, 'v'|G,
31: 'k'|G, 'u'|G, 'w'|G, 'n'|G
32: };
33: #define ANSI_AS "\033(0" /* ) */
34:
35: struct tt_str *gen_CM;
36: struct tt_str *gen_IM;
37: struct tt_str *gen_IC;
38: struct tt_str *gen_IP;
39: struct tt_str *gen_EI;
40: struct tt_str *gen_DC;
41: struct tt_str *gen_AL;
42: struct tt_str *gen_DL;
43: struct tt_str *gen_CE;
44: struct tt_str *gen_CD;
45: struct tt_str *gen_CL;
46: struct tt_str *gen_VS;
47: struct tt_str *gen_VE;
48: struct tt_str *gen_TI;
49: struct tt_str *gen_TE;
50: struct tt_str *gen_SO;
51: struct tt_str *gen_SE;
52: struct tt_str *gen_US;
53: struct tt_str *gen_UE;
54: struct tt_str *gen_UP;
55: struct tt_str *gen_PC;
56: struct tt_str *gen_BC;
57: struct tt_str *gen_ND;
58: struct tt_str *gen_HO;
59: struct tt_str *gen_NL;
60: struct tt_str *gen_AS;
61: struct tt_str *gen_AE;
62: struct tt_str *gen_XS;
63: struct tt_str *gen_XE;
64: char gen_MI;
65: char gen_MS;
66: char gen_AM;
67: char gen_OS;
68: char gen_BS;
69: char gen_DB;
70: int gen_CO;
71: int gen_LI;
72: int gen_UG;
73: int gen_SG;
74:
75: gen_setinsert(new)
76: char new;
77: {
78: if (new) {
79: if (gen_IM)
80: ttxputs(gen_IM);
81: } else
82: if (gen_EI)
83: ttxputs(gen_EI);
84: tt.tt_insert = new;
85: }
86:
87: gen_setmodes(new)
88: register new;
89: {
90: register diff;
91:
92: diff = new ^ tt.tt_modes;
93: if (diff & WWM_REV) {
94: if (new & WWM_REV) {
95: if (gen_SO)
96: ttxputs(gen_SO);
97: } else
98: if (gen_SE)
99: ttxputs(gen_SE);
100: }
101: if (diff & WWM_UL) {
102: if (new & WWM_UL) {
103: if (gen_US)
104: ttxputs(gen_US);
105: } else
106: if (gen_UE)
107: ttxputs(gen_UE);
108: }
109: if (diff & WWM_GRP) {
110: if (new & WWM_GRP) {
111: if (gen_AS)
112: ttxputs(gen_AS);
113: } else
114: if (gen_AE)
115: ttxputs(gen_AE);
116: }
117: if (diff & WWM_USR) {
118: if (new & WWM_USR) {
119: if (gen_XS)
120: ttxputs(gen_XS);
121: } else
122: if (gen_XE)
123: ttxputs(gen_XE);
124: }
125: tt.tt_modes = new;
126: }
127:
128: gen_insline()
129: {
130: if (tt.tt_modes) /* for concept 100 */
131: gen_setmodes(0);
132: if (gen_AL)
133: tttputs(gen_AL, gen_LI - tt.tt_row);
134: }
135:
136: gen_delline()
137: {
138: if (tt.tt_modes) /* for concept 100 */
139: gen_setmodes(0);
140: if (gen_DL)
141: tttputs(gen_DL, gen_LI - tt.tt_row);
142: }
143:
144: gen_putc(c)
145: register char c;
146: {
147: if (tt.tt_ninsert != tt.tt_insert)
148: gen_setinsert(tt.tt_ninsert);
149: if (tt.tt_nmodes != tt.tt_modes)
150: gen_setmodes(tt.tt_nmodes);
151: if (tt.tt_insert) {
152: if (gen_IC)
153: tttputs(gen_IC, gen_CO - tt.tt_col);
154: ttputc(c);
155: if (gen_IP)
156: tttputs(gen_IP, gen_CO - tt.tt_col);
157: } else
158: ttputc(c);
159: if (++tt.tt_col == gen_CO)
160: if (gen_AM)
161: tt.tt_col = 0, tt.tt_row++;
162: else
163: tt.tt_col--;
164: }
165:
166: gen_write(p, n)
167: register char *p;
168: register n;
169: {
170: if (tt.tt_ninsert != tt.tt_insert)
171: gen_setinsert(tt.tt_ninsert);
172: if (tt.tt_nmodes != tt.tt_modes)
173: gen_setmodes(tt.tt_nmodes);
174: if (tt.tt_insert && (gen_IC || gen_IP)) {
175: while (--n >= 0) {
176: if (gen_IC)
177: tttputs(gen_IC, gen_CO - tt.tt_col);
178: ttputc(*p++);
179: if (gen_IP)
180: tttputs(gen_IP, gen_CO - tt.tt_col);
181: tt.tt_col++;
182: }
183: } else {
184: tt.tt_col += n;
185: ttwrite(p, n);
186: }
187: if (tt.tt_col == gen_CO)
188: if (gen_AM)
189: tt.tt_col = 0, tt.tt_row++;
190: else
191: tt.tt_col--;
192: }
193:
194: gen_move(row, col)
195: register char row, col;
196: {
197: if (tt.tt_row == row && tt.tt_col == col)
198: return;
199: if (!gen_MI && tt.tt_insert)
200: gen_setinsert(0);
201: if (!gen_MS && tt.tt_modes)
202: gen_setmodes(0);
203: if (tt.tt_row == row) {
204: if (tt.tt_col == col)
205: return;
206: if (tt.tt_col == col - 1) {
207: if (gen_ND) {
208: ttxputs(gen_ND);
209: goto out;
210: }
211: } else if (tt.tt_col == col + 1) {
212: if (gen_BC) {
213: ttxputs(gen_BC);
214: goto out;
215: }
216: }
217: }
218: if (tt.tt_col == col) {
219: if (tt.tt_row == row + 1) {
220: if (gen_UP) {
221: ttxputs(gen_UP);
222: goto out;
223: }
224: } else if (tt.tt_row == row + 1) {
225: ttxputs(gen_NL);
226: goto out;
227: }
228: }
229: if (gen_HO && col == 0 && row == 0) {
230: ttxputs(gen_HO);
231: goto out;
232: }
233: tttgoto(gen_CM, col, row);
234: out:
235: tt.tt_col = col;
236: tt.tt_row = row;
237: }
238:
239: gen_init()
240: {
241: if (gen_VS)
242: ttxputs(gen_VS);
243: if (gen_TI)
244: ttxputs(gen_TI);
245: ttxputs(gen_CL);
246: tt.tt_col = tt.tt_row = 0;
247: tt.tt_ninsert = tt.tt_insert = 0;
248: tt.tt_nmodes = tt.tt_modes = 0;
249: }
250:
251: gen_end()
252: {
253: if (gen_TE)
254: ttxputs(gen_TE);
255: if (gen_VE)
256: ttxputs(gen_VE);
257: }
258:
259: gen_clreol()
260: {
261: if (tt.tt_modes) /* for concept 100 */
262: gen_setmodes(0);
263: tttputs(gen_CE, gen_CO - tt.tt_col);
264: }
265:
266: gen_clreos()
267: {
268: if (tt.tt_modes) /* for concept 100 */
269: gen_setmodes(0);
270: tttputs(gen_CD, gen_LI - tt.tt_row);
271: }
272:
273: gen_clear()
274: {
275: if (tt.tt_modes) /* for concept 100 */
276: gen_setmodes(0);
277: ttxputs(gen_CL);
278: }
279:
280: gen_delchar()
281: {
282: tttputs(gen_DC, gen_CO - tt.tt_col);
283: }
284:
285: tt_generic()
286: {
287: gen_PC = tttgetstr("pc");
288: PC = gen_PC ? *gen_PC->ts_str : 0;
289: ospeed = wwoldtty.ww_sgttyb.sg_ospeed;
290:
291: gen_CM = ttxgetstr("cm"); /* may not work */
292: gen_IM = ttxgetstr("im");
293: gen_IC = tttgetstr("ic");
294: gen_IP = tttgetstr("ip");
295: gen_EI = ttxgetstr("ei");
296: gen_DC = tttgetstr("dc");
297: gen_AL = tttgetstr("al");
298: gen_DL = tttgetstr("dl");
299: gen_CE = tttgetstr("ce");
300: gen_CD = tttgetstr("cd");
301: gen_CL = ttxgetstr("cl");
302: gen_VS = ttxgetstr("vs");
303: gen_VE = ttxgetstr("ve");
304: gen_TI = ttxgetstr("ti");
305: gen_TE = ttxgetstr("te");
306: gen_SO = ttxgetstr("so");
307: gen_SE = ttxgetstr("se");
308: gen_US = ttxgetstr("us");
309: gen_UE = ttxgetstr("ue");
310: gen_UP = ttxgetstr("up");
311: gen_BC = ttxgetstr("bc");
312: gen_ND = ttxgetstr("nd");
313: gen_HO = ttxgetstr("ho");
314: gen_NL = ttxgetstr("nl");
315: gen_AS = ttxgetstr("as");
316: gen_AE = ttxgetstr("ae");
317: gen_XS = ttxgetstr("XS");
318: gen_XE = ttxgetstr("XE");
319: gen_MI = tgetflag("mi");
320: gen_MS = tgetflag("ms");
321: gen_AM = tgetflag("am");
322: gen_OS = tgetflag("os");
323: gen_BS = tgetflag("bs");
324: gen_DB = tgetflag("db");
325: gen_CO = tgetnum("co");
326: gen_LI = tgetnum("li");
327: gen_UG = tgetnum("ug");
328: gen_SG = tgetnum("sg");
329:
330: if (gen_NL == 0) {
331: static struct tt_str nl = { "\n", 1 };
332: gen_NL = &nl;
333: }
334: if (gen_BC == 0 && gen_BS) {
335: static struct tt_str bc = { "\b", 1 };
336: gen_BC = &bc;
337: }
338: BC = gen_BC ? gen_BC->ts_str : 0;
339: UP = gen_UP ? gen_UP->ts_str : 0;
340: if (gen_CL == 0 || gen_OS || gen_CM == 0)
341: return -1;
342:
343: if (gen_DC)
344: tt.tt_delchar = gen_delchar;
345: if (gen_AL)
346: tt.tt_insline = gen_insline;
347: if (gen_DL)
348: tt.tt_delline = gen_delline;
349: if (gen_CE)
350: tt.tt_clreol = gen_clreol;
351: if (gen_CD)
352: tt.tt_clreos = gen_clreos;
353: if (gen_SG > 0)
354: gen_SO = 0;
355: if (gen_UG > 0)
356: gen_US = 0;
357: if (gen_SO)
358: tt.tt_availmodes |= WWM_REV;
359: if (gen_US)
360: tt.tt_availmodes |= WWM_UL;
361: if (gen_AS)
362: tt.tt_availmodes |= WWM_GRP;
363: if (gen_XS)
364: tt.tt_availmodes |= WWM_USR;
365: tt.tt_hasinsert = gen_IM != 0;
366: tt.tt_wrap = gen_AM;
367: tt.tt_retain = gen_DB;
368: tt.tt_ncol = gen_CO;
369: tt.tt_nrow = gen_LI;
370: tt.tt_init = gen_init;
371: tt.tt_end = gen_end;
372: tt.tt_write = gen_write;
373: tt.tt_putc = gen_putc;
374: tt.tt_move = gen_move;
375: tt.tt_clear = gen_clear;
376: tt.tt_setinsert = gen_setinsert;
377: tt.tt_setmodes = gen_setmodes;
378: tt.tt_frame = gen_AS && !strncmp(gen_AS->ts_str, ANSI_AS, gen_AS->ts_n)
379: ? ansi_frame : gen_frame;
380: return 0;
381: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.