1 /* @(#)ttgeneric.c 8.1 (Berkeley) 6/6/93 */
2 /* $NetBSD: ttgeneric.c,v 1.10 2009/04/14 08:50:06 lukem Exp $ */
5 * Copyright (c) 1983, 1993
6 * The Regents of the University of California. All rights reserved.
8 * This code is derived from software contributed to Berkeley by
9 * Edward Wang at The University of California, Berkeley.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46 short gen_frame
[16] = {
53 /* ANSI graphics frame */
54 #define G (WWM_GRP << WWC_MSHIFT)
55 short ansi_frame
[16] = {
56 ' ', 'x'|G
, 'Q'|G
, 'm'|G
,
57 'x'|G
, 'x'|G
, 'l'|G
, 't'|G
,
58 'q'|G
, 'j'|G
, 'q'|G
, 'v'|G
,
59 'k'|G
, 'u'|G
, 'w'|G
, 'n'|G
61 struct tt_str ansi_AS
= {
65 struct tt_str
*gen_PC
;
66 struct tt_str
*gen_CM
;
67 struct tt_str
*gen_IM
;
68 struct tt_str
*gen_IC
;
69 struct tt_str
*gen_ICn
;
70 struct tt_str
*gen_IP
;
71 struct tt_str
*gen_EI
;
72 struct tt_str
*gen_DC
;
73 struct tt_str
*gen_DCn
;
74 struct tt_str
*gen_AL
;
75 struct tt_str
*gen_ALn
;
76 struct tt_str
*gen_DL
;
77 struct tt_str
*gen_DLn
;
78 struct tt_str
*gen_CE
;
79 struct tt_str
*gen_CD
;
80 struct tt_str
*gen_CL
;
81 struct tt_str
*gen_VS
;
82 struct tt_str
*gen_VE
;
83 struct tt_str
*gen_TI
;
84 struct tt_str
*gen_TE
;
85 struct tt_str
*gen_SO
;
86 struct tt_str
*gen_SE
;
87 struct tt_str
*gen_US
;
88 struct tt_str
*gen_UE
;
89 struct tt_str
*gen_LE
;
90 struct tt_str
*gen_ND
;
91 struct tt_str
*gen_UP
;
92 struct tt_str
*gen_DO
;
93 struct tt_str
*gen_BC
;
94 struct tt_str
*gen_NL
;
95 struct tt_str
*gen_CR
;
96 struct tt_str
*gen_HO
;
97 struct tt_str
*gen_AS
;
98 struct tt_str
*gen_AE
;
99 struct tt_str
*gen_XS
;
100 struct tt_str
*gen_XE
;
101 struct tt_str
*gen_SF
;
102 struct tt_str
*gen_SFn
;
103 struct tt_str
*gen_SR
;
104 struct tt_str
*gen_SRn
;
105 struct tt_str
*gen_CS
;
120 void gen_clear(void);
121 void gen_clreol(void);
122 void gen_clreos(void);
123 void gen_delchar(int);
124 void gen_delline(int);
126 void gen_inschar(char);
127 void gen_insline(int);
128 void gen_insspace(int);
129 void gen_move(int, int);
131 void gen_scroll_down(int);
132 void gen_scroll_up(int);
133 void gen_setinsert(char);
134 void gen_setmodes(int);
135 void gen_setscroll(int, int);
136 void gen_start(void);
137 void gen_write(const char *, int);
140 gen_setinsert(char new)
152 gen_setmodes(int new)
156 diff
= new ^ tt
.tt_modes
;
157 if (diff
& WWM_REV
) {
164 if (gen_UE
&& gen_US
&& new & WWM_UL
&&
165 !strcmp(gen_SE
->ts_str
, gen_UE
->ts_str
))
176 if (gen_SE
&& gen_SO
&& new & WWM_REV
&&
177 !strcmp(gen_UE
->ts_str
, gen_SE
->ts_str
))
181 if (diff
& WWM_GRP
) {
189 if (diff
& WWM_USR
) {
203 if (tt
.tt_modes
) /* for concept 100 */
206 ttpgoto(gen_ALn
, 0, n
, gen_LI
- tt
.tt_row
);
209 tttputs(gen_AL
, gen_LI
- tt
.tt_row
);
215 if (tt
.tt_modes
) /* for concept 100 */
218 ttpgoto(gen_DLn
, 0, n
, gen_LI
- tt
.tt_row
);
221 tttputs(gen_DL
, gen_LI
- tt
.tt_row
);
229 if (tt
.tt_nmodes
!= tt
.tt_modes
)
230 gen_setmodes(tt
.tt_nmodes
);
232 if (++tt
.tt_col
== gen_CO
) {
234 tt
.tt_col
= tt
.tt_row
= -10;
236 tt
.tt_col
= 0, tt
.tt_row
++;
243 gen_write(const char *p
, int n
)
247 if (tt
.tt_nmodes
!= tt
.tt_modes
)
248 gen_setmodes(tt
.tt_nmodes
);
251 if (tt
.tt_col
== gen_CO
) {
253 tt
.tt_col
= tt
.tt_row
= -10;
255 tt
.tt_col
= 0, tt
.tt_row
++;
262 gen_move(int row
, int col
)
264 if (tt
.tt_row
== row
&& tt
.tt_col
== col
)
266 if (!gen_MI
&& tt
.tt_insert
)
268 if (!gen_MS
&& tt
.tt_modes
)
270 if (row
< tt
.tt_scroll_top
|| row
> tt
.tt_scroll_bot
)
271 gen_setscroll(0, tt
.tt_nrow
- 1);
272 if (tt
.tt_row
== row
) {
277 if (tt
.tt_col
== col
- 1) {
282 } else if (tt
.tt_col
== col
+ 1) {
289 if (tt
.tt_col
== col
) {
290 if (tt
.tt_row
== row
+ 1) {
295 } else if (tt
.tt_row
== row
- 1) {
300 if (gen_HO
&& col
== 0 && row
== 0) {
304 tttgoto(gen_CM
, col
, row
);
318 tt
.tt_col
= tt
.tt_row
= 0;
320 tt
.tt_nmodes
= tt
.tt_modes
= 0;
337 if (tt
.tt_modes
) /* for concept 100 */
339 tttputs(gen_CE
, gen_CO
- tt
.tt_col
);
345 if (tt
.tt_modes
) /* for concept 100 */
347 tttputs(gen_CD
, gen_LI
- tt
.tt_row
);
353 if (tt
.tt_modes
) /* for concept 100 */
363 if (tt
.tt_nmodes
!= tt
.tt_modes
)
364 gen_setmodes(tt
.tt_nmodes
);
366 tttputs(gen_IC
, gen_CO
- tt
.tt_col
);
369 tttputs(gen_IP
, gen_CO
- tt
.tt_col
);
370 if (++tt
.tt_col
== gen_CO
) {
372 tt
.tt_col
= tt
.tt_row
= -10;
374 tt
.tt_col
= 0, tt
.tt_row
++;
384 ttpgoto(gen_ICn
, 0, n
, gen_CO
- tt
.tt_col
);
387 tttputs(gen_IC
, gen_CO
- tt
.tt_col
);
394 ttpgoto(gen_DCn
, 0, n
, gen_CO
- tt
.tt_col
);
397 tttputs(gen_DC
, gen_CO
- tt
.tt_col
);
401 gen_scroll_down(int n
)
403 gen_move(tt
.tt_scroll_bot
, 0);
405 ttpgoto(gen_SFn
, 0, n
, n
);
414 gen_move(tt
.tt_scroll_top
, 0);
416 ttpgoto(gen_SRn
, 0, n
, n
);
423 gen_setscroll(int top
, int bot
)
425 tttgoto(gen_CS
, bot
, top
);
426 tt
.tt_scroll_top
= top
;
427 tt
.tt_scroll_bot
= bot
;
428 tt
.tt_row
= tt
.tt_col
= -10;
434 gen_PC
= tttgetstr("pc");
435 PC
= gen_PC
? *gen_PC
->ts_str
: 0;
438 gen_CM
= ttxgetstr("cm"); /* may not work */
439 gen_IM
= ttxgetstr("im");
440 gen_IC
= tttgetstr("ic");
441 gen_ICn
= tttgetstr("IC");
442 gen_IP
= tttgetstr("ip");
443 gen_EI
= ttxgetstr("ei");
444 gen_DC
= tttgetstr("dc");
445 gen_DCn
= tttgetstr("DC");
446 gen_AL
= tttgetstr("al");
447 gen_ALn
= tttgetstr("AL");
448 gen_DL
= tttgetstr("dl");
449 gen_DLn
= tttgetstr("DL");
450 gen_CE
= tttgetstr("ce");
451 gen_CD
= tttgetstr("cd");
452 gen_CL
= ttxgetstr("cl");
453 gen_VS
= ttxgetstr("vs");
454 gen_VE
= ttxgetstr("ve");
455 gen_TI
= ttxgetstr("ti");
456 gen_TE
= ttxgetstr("te");
457 gen_SO
= ttxgetstr("so");
458 gen_SE
= ttxgetstr("se");
459 gen_US
= ttxgetstr("us");
460 gen_UE
= ttxgetstr("ue");
461 gen_LE
= ttxgetstr("le");
462 gen_ND
= ttxgetstr("nd");
463 gen_UP
= ttxgetstr("up");
464 gen_DO
= ttxgetstr("do");
465 gen_BC
= ttxgetstr("bc");
466 gen_NL
= ttxgetstr("nl");
467 gen_CR
= ttxgetstr("cr");
468 gen_HO
= ttxgetstr("ho");
469 gen_AS
= ttxgetstr("as");
470 gen_AE
= ttxgetstr("ae");
471 gen_XS
= ttxgetstr("XS");
472 gen_XE
= ttxgetstr("XE");
473 gen_SF
= ttxgetstr("sf");
474 gen_SFn
= ttxgetstr("SF");
475 gen_SR
= ttxgetstr("sr");
476 gen_SRn
= ttxgetstr("SR");
477 gen_CS
= ttxgetstr("cs");
478 gen_MI
= tgetflag("mi");
479 gen_MS
= tgetflag("ms");
480 gen_AM
= tgetflag("am");
481 gen_OS
= tgetflag("os");
482 gen_BS
= tgetflag("bs");
483 gen_DA
= tgetflag("da");
484 gen_DB
= tgetflag("db");
485 gen_NS
= tgetflag("ns");
486 gen_XN
= tgetflag("xn");
487 gen_CO
= tgetnum("co");
488 gen_LI
= tgetnum("li");
489 gen_UG
= tgetnum("ug");
490 gen_SG
= tgetnum("sg");
491 if (gen_CL
== NULL
|| gen_OS
|| gen_CM
== NULL
)
495 * Deal with obsolete termcap fields.
497 if (gen_LE
== NULL
) {
501 static struct tt_str bc
= { "\b", 1 };
505 if (gen_NL
== NULL
) {
506 static struct tt_str nl
= { "\n", 1 };
511 if (gen_CR
== NULL
) {
512 static struct tt_str cr
= { "\r", 1 };
516 * Most terminal will scroll with "nl", but very few specify "sf".
517 * We shouldn't use "do" here.
519 if (gen_SF
== NULL
&& !gen_NS
)
521 BC
= gen_LE
? __DECONST(char *, gen_LE
->ts_str
) : 0;
522 UP
= gen_UP
? __DECONST(char *, gen_UP
->ts_str
) : 0;
524 * Fix up display attributes that we can't handle, or don't
529 if (gen_UG
> 0 || (gen_US
&& gen_SO
&& ttstrcmp(gen_US
, gen_SO
) == 0))
532 if (gen_IM
&& gen_IM
->ts_n
== 0) {
533 free((char *) gen_IM
);
536 if (gen_EI
&& gen_EI
->ts_n
== 0) {
537 free((char *) gen_EI
);
540 if (gen_IC
&& gen_IC
->ts_n
== 0) {
541 free((char *) gen_IC
);
545 tt
.tt_inschar
= gen_inschar
;
547 tt
.tt_insspace
= gen_insspace
;
549 tt
.tt_delchar
= gen_delchar
;
551 tt
.tt_insline
= gen_insline
;
553 tt
.tt_delline
= gen_delline
;
555 tt
.tt_clreol
= gen_clreol
;
557 tt
.tt_clreos
= gen_clreos
;
559 tt
.tt_scroll_down
= gen_scroll_down
;
561 * Don't allow scroll_up if da or db but not cs.
562 * See comment in wwscroll.c.
564 if (gen_SR
&& (gen_CS
|| (!gen_DA
&& !gen_DB
)))
565 tt
.tt_scroll_up
= gen_scroll_up
;
567 tt
.tt_setscroll
= gen_setscroll
;
569 tt
.tt_availmodes
|= WWM_REV
;
571 tt
.tt_availmodes
|= WWM_UL
;
573 tt
.tt_availmodes
|= WWM_GRP
;
575 tt
.tt_availmodes
|= WWM_USR
;
577 tt
.tt_retain
= gen_DB
;
580 tt
.tt_start
= gen_start
;
582 tt
.tt_write
= gen_write
;
583 tt
.tt_putc
= gen_putc
;
584 tt
.tt_move
= gen_move
;
585 tt
.tt_clear
= gen_clear
;
586 tt
.tt_setmodes
= gen_setmodes
;
587 tt
.tt_frame
= gen_AS
&& ttstrcmp(gen_AS
, &ansi_AS
) == 0 ?
588 ansi_frame
: gen_frame
;