tt_availmodes
[unix-history] / usr / src / usr.bin / window / ttgeneric.c
CommitLineData
73f690a1 1#ifndef lint
7d77e730 2static char *sccsid = "@(#)ttgeneric.c 3.7 83/08/17";
73f690a1
EW
3#endif
4
5#include "ww.h"
fff1d01b 6#include "tt.h"
73f690a1 7
94c16993
EW
8char *tgetstr();
9char *tgoto();
10
73f690a1
EW
11char gen_frame[16] = {
12 ' ', '|', '-', '+',
13 '|', '|', '+', '+',
fff1d01b 14 '-', '+', '-', '+',
73f690a1
EW
15 '+', '+', '+', '+'
16};
17
745d1a08
EW
18int gen_row, gen_col;
19char gen_modes;
745d1a08
EW
20char gen_insert;
21
745d1a08
EW
22char *gen_CM;
23char *gen_IM;
24char *gen_IC;
25char *gen_IP;
26char *gen_EI;
27char *gen_DC;
28char *gen_AL;
29char *gen_DL;
30char *gen_CE;
31char *gen_CD;
32char *gen_CL;
33char *gen_VS;
34char *gen_VE;
35char *gen_SO;
36char *gen_SE;
37char *gen_US;
38char *gen_UE;
39char *gen_UP;
40char *gen_PC;
41char *gen_BC;
42char *gen_ND;
43char *gen_HO;
44char *gen_NL;
45char gen_MI;
46char gen_MS;
47char gen_AM;
48char gen_OS;
49char gen_BS;
50int gen_CO;
51int gen_LI;
52char gen_strings[1024];
53char *gen_strp = gen_strings;
54
55#define pc(c) putchar('c')
56#define ps(s) fputs((s), stdout)
57
58gen_pc(c)
59{
60 putchar(c);
61}
62
63gen_sc(c)
64{
65 *gen_strp++ = c;
73f690a1 66}
73f690a1
EW
67
68gen_setinsert(new)
69char new;
70{
745d1a08
EW
71 if (gen_insert == new)
72 return;
73 if (new) {
74 if (gen_IM)
75 ps(gen_IM);
76 } else
77 if (gen_EI)
78 ps(gen_EI);
79 gen_insert = new;
73f690a1
EW
80}
81
82gen_setmodes(new)
745d1a08 83register new;
73f690a1 84{
745d1a08
EW
85 register diff;
86
7d77e730 87 new &= tt.tt_availmodes;
745d1a08
EW
88 if ((diff = new ^ gen_modes) == 0)
89 return;
90 if (diff & WWM_REV) {
91 if (new & WWM_REV) {
92 if (gen_SO)
93 ps(gen_SO);
94 } else
95 if (gen_SE)
96 ps(gen_SE);
97 }
98 if (diff & WWM_UL) {
99 if (new & WWM_UL) {
100 if (gen_US)
101 ps(gen_US);
102 } else
103 if (gen_UE)
104 ps(gen_UE);
105 }
106 gen_modes = new;
73f690a1
EW
107}
108
109gen_insline()
110{
745d1a08
EW
111 if (gen_AL)
112 tputs(gen_AL, gen_LI - gen_row, gen_pc);
73f690a1
EW
113}
114
115gen_delline()
116{
745d1a08
EW
117 if (gen_DL)
118 tputs(gen_DL, gen_LI - gen_row, gen_pc);
73f690a1
EW
119}
120
121gen_putc(c)
122register char c;
123{
745d1a08
EW
124 if (gen_insert) {
125 if (gen_IC)
126 tputs(gen_IC, gen_CO - gen_col, gen_pc);
127 putchar(c);
128 if (gen_IP)
129 tputs(gen_IP, gen_CO - gen_col, gen_pc);
130 } else
73f690a1 131 putchar(c);
73f690a1
EW
132 gen_col++;
133}
134
135gen_write(start, end)
136register char *start, *end;
137{
73f690a1
EW
138 if (gen_insert) {
139 while (start <= end) {
745d1a08
EW
140 if (gen_IC)
141 tputs(gen_IC, gen_CO - gen_col, gen_pc);
142 putchar(*start++);
143 if (gen_IP)
144 tputs(gen_IP, gen_CO - gen_col, gen_pc);
73f690a1
EW
145 gen_col++;
146 }
147 } else {
148 gen_col += end - start + 1;
149 while (start <= end)
745d1a08 150 putchar(*start++);
73f690a1
EW
151 }
152}
153
154gen_blank(n)
155register n;
156{
157 if (n <= 0)
158 return;
73f690a1
EW
159 if (gen_insert) {
160 while (--n >= 0) {
745d1a08
EW
161 if (gen_IC)
162 tputs(gen_IC, gen_CO - gen_col, gen_pc);
73f690a1 163 putchar(' ');
745d1a08
EW
164 if (gen_IP)
165 tputs(gen_IP, gen_CO - gen_col, gen_pc);
73f690a1
EW
166 gen_col++;
167 }
168 } else {
169 gen_col += n;
170 while (--n >= 0)
171 putchar(' ');
172 }
173}
174
175gen_move(row, col)
176register char row, col;
177{
745d1a08
EW
178 if (gen_row == row && gen_col == col)
179 return;
180 if (!gen_MI && gen_insert)
181 if (gen_EI)
182 ps(gen_EI);
183 if (!gen_MS && gen_modes & WWM_REV)
184 if (gen_SE)
185 ps(gen_SE);
73f690a1
EW
186 if (gen_row == row) {
187 if (gen_col == col)
188 return;
189 if (gen_col == col - 1) {
745d1a08
EW
190 if (gen_ND) {
191 ps(gen_ND);
192 goto out;
193 }
73f690a1 194 } else if (gen_col == col + 1) {
745d1a08
EW
195 if (gen_BC) {
196 ps(gen_BC);
197 goto out;
198 }
73f690a1
EW
199 }
200 }
201 if (gen_col == col) {
202 if (gen_row == row + 1) {
745d1a08
EW
203 if (gen_UP) {
204 ps(gen_UP);
205 goto out;
206 }
73f690a1 207 } else if (gen_row == row + 1) {
745d1a08
EW
208 if (gen_NL) {
209 ps(gen_NL);
210 goto out;
211 }
73f690a1
EW
212 }
213 }
745d1a08
EW
214 if (gen_HO && col == 0 && row == 0) {
215 ps(gen_HO);
73f690a1
EW
216 goto out;
217 }
745d1a08 218 tputs(tgoto(gen_CM, col, row), 1, gen_pc);
73f690a1
EW
219out:
220 gen_col = col;
221 gen_row = row;
745d1a08
EW
222 if (!gen_MI && gen_insert)
223 if (gen_IM)
224 ps(gen_IM);
225 if (!gen_MS && gen_modes & WWM_REV)
226 if (gen_SO)
227 ps(gen_SO);
73f690a1
EW
228}
229
230gen_init()
73f690a1 231{
745d1a08
EW
232 if (gen_VS)
233 ps(gen_VS);
fff1d01b
EW
234 if (gen_CL)
235 ps(gen_CL);
73f690a1
EW
236 gen_col = gen_row = 0;
237 gen_insert = 0;
73f690a1
EW
238 gen_modes = 0;
239}
240
fff1d01b 241gen_end()
73f690a1 242{
745d1a08
EW
243 gen_setmodes(0);
244 gen_setinsert(0);
245 if (gen_VE)
246 ps(gen_VE);
73f690a1
EW
247}
248
249gen_clreol()
250{
745d1a08
EW
251 if (gen_CE)
252 tputs(gen_CE, gen_CO - gen_col, gen_pc);
73f690a1
EW
253}
254
255gen_clreos()
256{
745d1a08
EW
257 if (gen_CD)
258 tputs(gen_CD, gen_LI - gen_row, gen_pc);
73f690a1
EW
259}
260
261gen_clear()
262{
745d1a08
EW
263 if (gen_CL)
264 ps(gen_CL);
73f690a1
EW
265}
266
267gen_delchar()
268{
745d1a08
EW
269 if (gen_DC)
270 tputs(gen_DC, gen_CO - gen_col, gen_pc);
271}
272
273char *
274gen_getstr(str)
275char *str;
276{
277 char buf[100];
278 char *bufp = buf;
279
280 str = tgetstr(str, &bufp);
281 if (str == 0)
282 return 0;
283 str = gen_strp;
284 tputs(buf, 1, gen_sc);
285 gen_sc(0);
286 return str;
73f690a1
EW
287}
288
289tt_generic()
290{
745d1a08
EW
291 gen_CM = tgetstr("cm", &gen_strp);
292 gen_IM = gen_getstr("im");
293 gen_IC = tgetstr("ic", &gen_strp);
294 gen_IP = tgetstr("ip", &gen_strp);
295 gen_EI = gen_getstr("ei");
296 gen_DC = tgetstr("dc", &gen_strp);
297 gen_AL = tgetstr("al", &gen_strp);
298 gen_DL = tgetstr("dl", &gen_strp);
299 gen_CE = tgetstr("ce", &gen_strp);
300 gen_CD = tgetstr("cd", &gen_strp);
301 gen_CL = gen_getstr("cl");
302 gen_VS = gen_getstr("vs");
303 gen_VE = gen_getstr("ve");
304 gen_SO = gen_getstr("so");
305 gen_SE = gen_getstr("se");
306 gen_US = gen_getstr("us");
307 gen_UE = gen_getstr("ue");
308 gen_UP = gen_getstr("up");
309 gen_PC = tgetstr("pc", &gen_strp);
310 gen_BC = gen_getstr("bc");
311 gen_ND = gen_getstr("nd");
312 gen_HO = gen_getstr("ho");
313 gen_NL = gen_getstr("nl");
314 gen_MI = tgetflag("mi");
315 gen_MS = tgetflag("ms");
316 gen_AM = tgetflag("am");
317 gen_OS = tgetflag("os");
318 gen_BS = tgetflag("bs");
319 gen_CO = tgetnum("co");
320 gen_LI = tgetnum("li");
321
322 if (gen_CL == 0 || gen_CM == 0 || gen_OS)
323 return -1;
324
325 if (gen_NL == 0)
326 gen_NL = "\n";
327 if (gen_BC == 0 && gen_BS)
328 gen_BC == "\b";
329
330 {
331 extern char PC, *BC, *UP;
332 extern short ospeed;
333
334 PC = gen_PC ? *gen_PC : 0;
335 BC = gen_BC;
336 UP = gen_UP;
337 ospeed = wwoldtty.ww_sgttyb.sg_ospeed;
338 }
339
340 if (gen_SO)
7d77e730 341 tt.tt_availmodes |= WWM_REV;
745d1a08 342 if (gen_US)
7d77e730 343 tt.tt_availmodes |= WWM_UL;
745d1a08
EW
344 if (gen_IM)
345 tt.tt_setinsert = gen_setinsert;
346 if (gen_DC)
347 tt.tt_delchar = gen_delchar;
348 if (gen_AL)
349 tt.tt_insline = gen_insline;
350 if (gen_DL)
351 tt.tt_delline = gen_delline;
352 if (gen_CE)
353 tt.tt_clreol = gen_clreol;
354 if (gen_CD)
355 tt.tt_clreos = gen_clreos;
356 if (gen_CL)
357 tt.tt_clear = gen_clear;
358 tt.tt_ncol = gen_CO;
359 if (gen_AM)
360 tt.tt_ncol--;
361 tt.tt_nrow = gen_LI;
73f690a1 362 tt.tt_init = gen_init;
fff1d01b 363 tt.tt_end = gen_end;
745d1a08
EW
364 tt.tt_setmodes = gen_setmodes;
365 tt.tt_blank = gen_blank;
73f690a1
EW
366 tt.tt_write = gen_write;
367 tt.tt_putc = gen_putc;
745d1a08 368 tt.tt_move = gen_move;
73f690a1
EW
369 tt.tt_frame = gen_frame;
370 return 0;
371}