]>
git.saurik.com Git - apple/shell_cmds.git/blob - window/ttgeneric.c
e45224e9778a9167d2ca0a137160e8b990a9080a
1 /* $NetBSD: ttgeneric.c,v 1.5 1998/08/25 20:59:43 ross Exp $ */
4 * Copyright (c) 1983, 1993
5 * The Regents of the University of California. All rights reserved.
7 * This code is derived from software contributed to Berkeley by
8 * Edward Wang at The University of California, Berkeley.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the University of
21 * California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 #include <sys/cdefs.h>
42 static char sccsid
[] = "@(#)ttgeneric.c 8.1 (Berkeley) 6/6/93";
44 __RCSID("$NetBSD: ttgeneric.c,v 1.5 1998/08/25 20:59:43 ross Exp $");
50 #define _CURSES_PRIVATE
52 #undef _CURSES_PRIVATE
61 extern char PC
, *BC
, *UP
;
65 short gen_frame
[16] = {
72 /* ANSI graphics frame */
73 #define G (WWM_GRP << WWC_MSHIFT)
74 short ansi_frame
[16] = {
75 ' ', 'x'|G
, 'Q'|G
, 'm'|G
,
76 'x'|G
, 'x'|G
, 'l'|G
, 't'|G
,
77 'q'|G
, 'j'|G
, 'q'|G
, 'v'|G
,
78 'k'|G
, 'u'|G
, 'w'|G
, 'n'|G
80 struct tt_str ansi_AS
= {
84 struct tt_str
*gen_PC
;
85 struct tt_str
*gen_CM
;
86 struct tt_str
*gen_IM
;
87 struct tt_str
*gen_IC
;
88 struct tt_str
*gen_ICn
;
89 struct tt_str
*gen_IP
;
90 struct tt_str
*gen_EI
;
91 struct tt_str
*gen_DC
;
92 struct tt_str
*gen_DCn
;
93 struct tt_str
*gen_AL
;
94 struct tt_str
*gen_ALn
;
95 struct tt_str
*gen_DL
;
96 struct tt_str
*gen_DLn
;
97 struct tt_str
*gen_CE
;
98 struct tt_str
*gen_CD
;
99 struct tt_str
*gen_CL
;
100 struct tt_str
*gen_VS
;
101 struct tt_str
*gen_VE
;
102 struct tt_str
*gen_TI
;
103 struct tt_str
*gen_TE
;
104 struct tt_str
*gen_SO
;
105 struct tt_str
*gen_SE
;
106 struct tt_str
*gen_US
;
107 struct tt_str
*gen_UE
;
108 struct tt_str
*gen_LE
;
109 struct tt_str
*gen_ND
;
110 struct tt_str
*gen_UP
;
111 struct tt_str
*gen_DO
;
112 struct tt_str
*gen_BC
;
113 struct tt_str
*gen_NL
;
114 struct tt_str
*gen_CR
;
115 struct tt_str
*gen_HO
;
116 struct tt_str
*gen_AS
;
117 struct tt_str
*gen_AE
;
118 struct tt_str
*gen_XS
;
119 struct tt_str
*gen_XE
;
120 struct tt_str
*gen_SF
;
121 struct tt_str
*gen_SFn
;
122 struct tt_str
*gen_SR
;
123 struct tt_str
*gen_SRn
;
124 struct tt_str
*gen_CS
;
139 void gen_clear
__P((void));
140 void gen_clreol
__P((void));
141 void gen_clreos
__P((void));
142 void gen_delchar
__P((int));
143 void gen_delline
__P((int));
144 void gen_end
__P((void));
145 void gen_inschar
__P((char));
146 void gen_insline
__P((int));
147 void gen_insspace
__P((int));
148 void gen_move
__P((int, int));
149 void gen_putc
__P((char));
150 void gen_scroll_down
__P((int));
151 void gen_scroll_up
__P((int));
152 void gen_setinsert
__P((char));
153 void gen_setmodes
__P((int));
154 void gen_setscroll
__P((int, int));
155 void gen_start
__P((void));
156 void gen_write
__P((char *, int));
177 diff
= new ^ tt
.tt_modes
;
178 if (diff
& WWM_REV
) {
194 if (diff
& WWM_GRP
) {
202 if (diff
& WWM_USR
) {
217 if (tt
.tt_modes
) /* for concept 100 */
220 ttpgoto(gen_ALn
, 0, n
, gen_LI
- tt
.tt_row
);
223 tttputs(gen_AL
, gen_LI
- tt
.tt_row
);
230 if (tt
.tt_modes
) /* for concept 100 */
233 ttpgoto(gen_DLn
, 0, n
, gen_LI
- tt
.tt_row
);
236 tttputs(gen_DL
, gen_LI
- tt
.tt_row
);
245 if (tt
.tt_nmodes
!= tt
.tt_modes
)
246 gen_setmodes(tt
.tt_nmodes
);
248 if (++tt
.tt_col
== gen_CO
) {
250 tt
.tt_col
= tt
.tt_row
= -10;
252 tt
.tt_col
= 0, tt
.tt_row
++;
265 if (tt
.tt_nmodes
!= tt
.tt_modes
)
266 gen_setmodes(tt
.tt_nmodes
);
269 if (tt
.tt_col
== gen_CO
) {
271 tt
.tt_col
= tt
.tt_row
= -10;
273 tt
.tt_col
= 0, tt
.tt_row
++;
283 if (tt
.tt_row
== row
&& tt
.tt_col
== col
)
285 if (!gen_MI
&& tt
.tt_insert
)
287 if (!gen_MS
&& tt
.tt_modes
)
289 if (row
< tt
.tt_scroll_top
|| row
> tt
.tt_scroll_bot
)
290 gen_setscroll(0, tt
.tt_nrow
- 1);
291 if (tt
.tt_row
== row
) {
296 if (tt
.tt_col
== col
- 1) {
301 } else if (tt
.tt_col
== col
+ 1) {
308 if (tt
.tt_col
== col
) {
309 if (tt
.tt_row
== row
+ 1) {
314 } else if (tt
.tt_row
== row
- 1) {
319 if (gen_HO
&& col
== 0 && row
== 0) {
323 tttgoto(gen_CM
, col
, row
);
337 tt
.tt_col
= tt
.tt_row
= 0;
339 tt
.tt_nmodes
= tt
.tt_modes
= 0;
356 if (tt
.tt_modes
) /* for concept 100 */
358 tttputs(gen_CE
, gen_CO
- tt
.tt_col
);
364 if (tt
.tt_modes
) /* for concept 100 */
366 tttputs(gen_CD
, gen_LI
- tt
.tt_row
);
372 if (tt
.tt_modes
) /* for concept 100 */
383 if (tt
.tt_nmodes
!= tt
.tt_modes
)
384 gen_setmodes(tt
.tt_nmodes
);
386 tttputs(gen_IC
, gen_CO
- tt
.tt_col
);
389 tttputs(gen_IP
, gen_CO
- tt
.tt_col
);
390 if (++tt
.tt_col
== gen_CO
) {
392 tt
.tt_col
= tt
.tt_row
= -10;
394 tt
.tt_col
= 0, tt
.tt_row
++;
405 ttpgoto(gen_ICn
, 0, n
, gen_CO
- tt
.tt_col
);
408 tttputs(gen_IC
, gen_CO
- tt
.tt_col
);
416 ttpgoto(gen_DCn
, 0, n
, gen_CO
- tt
.tt_col
);
419 tttputs(gen_DC
, gen_CO
- tt
.tt_col
);
426 gen_move(tt
.tt_scroll_bot
, 0);
428 ttpgoto(gen_SFn
, 0, n
, n
);
438 gen_move(tt
.tt_scroll_top
, 0);
440 ttpgoto(gen_SRn
, 0, n
, n
);
447 gen_setscroll(top
, bot
)
450 tttgoto(gen_CS
, bot
, top
);
451 tt
.tt_scroll_top
= top
;
452 tt
.tt_scroll_bot
= bot
;
453 tt
.tt_row
= tt
.tt_col
= -10;
459 gen_PC
= tttgetstr("pc");
460 PC
= gen_PC
? *gen_PC
->ts_str
: 0;
463 gen_CM
= ttxgetstr("cm"); /* may not work */
464 gen_IM
= ttxgetstr("im");
465 gen_IC
= tttgetstr("ic");
466 gen_ICn
= tttgetstr("IC");
467 gen_IP
= tttgetstr("ip");
468 gen_EI
= ttxgetstr("ei");
469 gen_DC
= tttgetstr("dc");
470 gen_DCn
= tttgetstr("DC");
471 gen_AL
= tttgetstr("al");
472 gen_ALn
= tttgetstr("AL");
473 gen_DL
= tttgetstr("dl");
474 gen_DLn
= tttgetstr("DL");
475 gen_CE
= tttgetstr("ce");
476 gen_CD
= tttgetstr("cd");
477 gen_CL
= ttxgetstr("cl");
478 gen_VS
= ttxgetstr("vs");
479 gen_VE
= ttxgetstr("ve");
480 gen_TI
= ttxgetstr("ti");
481 gen_TE
= ttxgetstr("te");
482 gen_SO
= ttxgetstr("so");
483 gen_SE
= ttxgetstr("se");
484 gen_US
= ttxgetstr("us");
485 gen_UE
= ttxgetstr("ue");
486 gen_LE
= ttxgetstr("le");
487 gen_ND
= ttxgetstr("nd");
488 gen_UP
= ttxgetstr("up");
489 gen_DO
= ttxgetstr("do");
490 gen_BC
= ttxgetstr("bc");
491 gen_NL
= ttxgetstr("nl");
492 gen_CR
= ttxgetstr("cr");
493 gen_HO
= ttxgetstr("ho");
494 gen_AS
= ttxgetstr("as");
495 gen_AE
= ttxgetstr("ae");
496 gen_XS
= ttxgetstr("XS");
497 gen_XE
= ttxgetstr("XE");
498 gen_SF
= ttxgetstr("sf");
499 gen_SFn
= ttxgetstr("SF");
500 gen_SR
= ttxgetstr("sr");
501 gen_SRn
= ttxgetstr("SR");
502 gen_CS
= ttxgetstr("cs");
503 gen_MI
= tgetflag("mi");
504 gen_MS
= tgetflag("ms");
505 gen_AM
= tgetflag("am");
506 gen_OS
= tgetflag("os");
507 gen_BS
= tgetflag("bs");
508 gen_DA
= tgetflag("da");
509 gen_DB
= tgetflag("db");
510 gen_NS
= tgetflag("ns");
511 gen_XN
= tgetflag("xn");
512 gen_CO
= tgetnum("co");
513 gen_LI
= tgetnum("li");
514 gen_UG
= tgetnum("ug");
515 gen_SG
= tgetnum("sg");
516 if (gen_CL
== 0 || gen_OS
|| gen_CM
== 0)
520 * Deal with obsolete termcap fields.
526 static struct tt_str bc
= { "\b", 1 };
531 static struct tt_str nl
= { "\n", 1 };
537 static struct tt_str cr
= { "\r", 1 };
541 * Most terminal will scroll with "nl", but very few specify "sf".
542 * We shouldn't use "do" here.
544 if (gen_SF
== 0 && !gen_NS
)
546 BC
= gen_LE
? gen_LE
->ts_str
: 0;
547 UP
= gen_UP
? gen_UP
->ts_str
: 0;
549 * Fix up display attributes that we can't handle, or don't
554 if (gen_UG
> 0 || (gen_US
&& gen_SO
&& ttstrcmp(gen_US
, gen_SO
) == 0))
557 if (gen_IM
&& gen_IM
->ts_n
== 0) {
558 free((char *) gen_IM
);
561 if (gen_EI
&& gen_EI
->ts_n
== 0) {
562 free((char *) gen_EI
);
565 if (gen_IC
&& gen_IC
->ts_n
== 0) {
566 free((char *) gen_IC
);
570 tt
.tt_inschar
= gen_inschar
;
572 tt
.tt_insspace
= gen_insspace
;
574 tt
.tt_delchar
= gen_delchar
;
576 tt
.tt_insline
= gen_insline
;
578 tt
.tt_delline
= gen_delline
;
580 tt
.tt_clreol
= gen_clreol
;
582 tt
.tt_clreos
= gen_clreos
;
584 tt
.tt_scroll_down
= gen_scroll_down
;
586 * Don't allow scroll_up if da or db but not cs.
587 * See comment in wwscroll.c.
589 if (gen_SR
&& (gen_CS
|| (!gen_DA
&& !gen_DB
)))
590 tt
.tt_scroll_up
= gen_scroll_up
;
592 tt
.tt_setscroll
= gen_setscroll
;
594 tt
.tt_availmodes
|= WWM_REV
;
596 tt
.tt_availmodes
|= WWM_UL
;
598 tt
.tt_availmodes
|= WWM_GRP
;
600 tt
.tt_availmodes
|= WWM_USR
;
602 tt
.tt_retain
= gen_DB
;
605 tt
.tt_start
= gen_start
;
607 tt
.tt_write
= gen_write
;
608 tt
.tt_putc
= gen_putc
;
609 tt
.tt_move
= gen_move
;
610 tt
.tt_clear
= gen_clear
;
611 tt
.tt_setmodes
= gen_setmodes
;
612 tt
.tt_frame
= gen_AS
&& ttstrcmp(gen_AS
, &ansi_AS
) == 0 ?
613 ansi_frame
: gen_frame
;