153889Smckusick /*
2*63256Sbostic * Copyright (c) 1992, 1993
3*63256Sbostic * The Regents of the University of California. All rights reserved.
453889Smckusick *
553889Smckusick * This code is derived from software contributed to Berkeley by
653889Smckusick * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
753889Smckusick *
853889Smckusick * %sccs.include.redist.c%
953889Smckusick *
1053889Smckusick * from: $Hdr: vt100esc.c,v 4.300 91/06/09 06:14:59 root Rel41 $ SONY
1153889Smckusick *
12*63256Sbostic * @(#)vt100esc.c 8.1 (Berkeley) 06/10/93
1353889Smckusick */
1453889Smckusick
1553889Smckusick /*
1653889Smckusick * vt100 escape sequence handler
1753889Smckusick */
1853889Smckusick
1953889Smckusick #ifdef IPC_MRX
2053889Smckusick #include "../../h/param.h"
2155762Sbostic #include "../../h/systm.h"
2253889Smckusick #include "../../iop/framebuf.h"
2353889Smckusick #else
2457177Sutashiro #include <sys/param.h>
2557177Sutashiro #include <sys/systm.h>
2657177Sutashiro #include <news3400/iop/framebuf.h>
2753889Smckusick #endif
2853889Smckusick
2957177Sutashiro #include <news3400/bm/vt100.h>
3057177Sutashiro #include <news3400/bm/bitmapif.h>
3153889Smckusick
3257177Sutashiro #include <news3400/fb/fbdefs.h>
3353889Smckusick
3453889Smckusick #ifdef IPC_MRX
3553889Smckusick #include "../../iop/kbreg.h"
3653889Smckusick #include "../../iop/keyboard.h"
3753889Smckusick #else
3857177Sutashiro #include <news3400/iop/kbreg.h>
3957177Sutashiro #include <news3400/iop/keyboard.h>
4053889Smckusick #endif
4153889Smckusick
4253889Smckusick #if CPU_SINGLE
4357177Sutashiro #include <news3400/sio/scc.h>
4453889Smckusick #endif
4553889Smckusick
4653889Smckusick #ifdef IPC_MRX
4753889Smckusick #include "config.h"
4853889Smckusick #define kbd_ioctl(chan, cmd, argp) { \
4953889Smckusick if (kb_ioctl) \
5053889Smckusick (*kb_ioctl)(chan, cmd, argp); \
5153889Smckusick }
5253889Smckusick #endif
5353889Smckusick
5453889Smckusick /*
5553889Smckusick * escape sequece functions
5653889Smckusick */
5753889Smckusick int esc_csi();
5853889Smckusick int esc_csi_ansi();
5953889Smckusick int esc_csi_dec();
6053889Smckusick int esc_store_csr();
6153889Smckusick int esc_restore_csr();
6253889Smckusick int esc_index();
6353889Smckusick int esc_next_line();
6453889Smckusick int esc_tab_set();
6553889Smckusick int esc_rev_index();
6653889Smckusick int esc_numeric_kpad();
6753889Smckusick int esc_application_kpad();
6853889Smckusick int esc_line_size();
6953889Smckusick int esc_char_setr();
7053889Smckusick int esc_char_setl();
7153889Smckusick int esc_kanji_set();
7253889Smckusick int esc_parm_set();
7353889Smckusick int esc_pf_define();
7453889Smckusick int esc_ignore();
7553889Smckusick
7653889Smckusick struct esc_sequence esc_seq_table[] = {
7753889Smckusick {'[', "ABCDfgHhJKLlMmnPr", esc_csi},
7853889Smckusick {'7', "", esc_store_csr},
7953889Smckusick {'8', "", esc_restore_csr},
8053889Smckusick {'D', "", esc_index},
8153889Smckusick {'E', "", esc_next_line},
8253889Smckusick {'H', "", esc_tab_set},
8353889Smckusick {'M', "", esc_rev_index},
8453889Smckusick {'=', "", esc_application_kpad},
8553889Smckusick {'>', "", esc_numeric_kpad},
8653889Smckusick {'#', "34568", esc_line_size},
8753889Smckusick {'(', "0ABJH", esc_char_setr},
8853889Smckusick {')', "0AB", esc_char_setl},
8953889Smckusick {'$', "B@", esc_kanji_set},
9053889Smckusick {'~', "fcpsomdbDiGCBTtE", esc_parm_set},
9153889Smckusick {'P', "pPZiI", esc_pf_define},
9253889Smckusick {'\0', "", esc_ignore},
9353889Smckusick };
9453889Smckusick
9553889Smckusick struct key_pad key_pad[] = {
9653889Smckusick { '0', 'p' }, /* 0 */
9753889Smckusick { '1', 'q' }, /* 1 */
9853889Smckusick { '2', 'r' }, /* 2 */
9953889Smckusick { '3', 's' }, /* 3 */
10053889Smckusick { '4', 't' }, /* 4 */
10153889Smckusick { '5', 'u' }, /* 5 */
10253889Smckusick { '6', 'v' }, /* 6 */
10353889Smckusick { '7', 'w' }, /* 7 */
10453889Smckusick { '8', 'x' }, /* 8 */
10553889Smckusick { '9', 'y' }, /* 9 */
10653889Smckusick { '.', 'n' }, /* period */
10753889Smckusick { '-', 'm' }, /* minus */
10853889Smckusick { '+', 'k' }, /* plus */
10953889Smckusick { ',', 'l' }, /* comma */
11053889Smckusick { '\n', 'M' }, /* enter */
11153889Smckusick { 'A', 'A' }, /* cursor up */
11253889Smckusick { 'B', 'B' }, /* cursor down */
11353889Smckusick { 'C', 'C' }, /* cursor right */
11453889Smckusick { 'D', 'D' }, /* cursor left */
11553889Smckusick { '\0', '\0' } /* */
11653889Smckusick };
11753889Smckusick
11853889Smckusick static char esc_buf[ESC_BUF_SIZ];
11953889Smckusick static char *esc_bp = esc_buf;
12053889Smckusick extern char c_pos_mess[];
12153889Smckusick
12257166Sutashiro static change_csr_key_pad(), change_aux_key_pad(), itoa();
12357166Sutashiro
12453889Smckusick Key_string key_str;
12553889Smckusick Pfk_string pfk_str;
12653889Smckusick
12753889Smckusick unsigned int first_jcode;
12853889Smckusick
12953889Smckusick /*
13053889Smckusick * put out jis-code kanji
13153889Smckusick */
jiskanji(sp,c)13253889Smckusick jiskanji(sp, c)
13353889Smckusick register SCREEN *sp;
13453889Smckusick register unsigned int c;
13553889Smckusick {
13653889Smckusick if (first_jcode) {
13753889Smckusick addch(sp, c | (first_jcode << 8));
13853889Smckusick first_jcode = 0;
13953889Smckusick } else {
14053889Smckusick first_jcode = c;
14153889Smckusick }
14253889Smckusick }
14353889Smckusick
14453889Smckusick /*
14553889Smckusick * This routine is the command analiser using second character.
14653889Smckusick * If a command has found then switch to particular escape handling
14753889Smckusick * routine, and directly called by mother routine.
14853889Smckusick * The arguments are passed through the routine.
14953889Smckusick */
esc_top_level(sp,c)15053889Smckusick esc_top_level(sp, c)
15153889Smckusick register SCREEN *sp;
15253889Smckusick char c;
15353889Smckusick {
15453889Smckusick register struct esc_sequence *estp;
15553889Smckusick
15653889Smckusick for (estp = esc_seq_table; estp->command ; estp++) {
15753889Smckusick if (estp->command == c) {
15853889Smckusick /* command found */
15953889Smckusick sp->s_estp = estp;
16053889Smckusick if (*estp->terminators == '\0') {
16153889Smckusick (*estp->esc_func)(sp);
16253889Smckusick sp->s_current_stat &= ~ESCAPE;
16353889Smckusick } else {
16453889Smckusick sp->s_esc_handler = estp->esc_func;
16553889Smckusick }
16653889Smckusick return;
16753889Smckusick }
16853889Smckusick }
16953889Smckusick sp->s_current_stat &= ~ESCAPE;
17053889Smckusick }
17153889Smckusick
17253889Smckusick /*
17353889Smckusick * Undo the ESCAPE flag, escape buffer
17453889Smckusick * and the esc_handler routine
17553889Smckusick * This routine has to be called when escape sequence has started.
17653889Smckusick */
recover(sp)17753889Smckusick recover(sp)
17853889Smckusick register SCREEN *sp;
17953889Smckusick {
18053889Smckusick register int *ip = (int *) esc_buf;
18153889Smckusick register int *sup = (int *) (esc_buf + ESC_BUF_SIZ);
18253889Smckusick
18353889Smckusick sp->s_current_stat &= ~ESCAPE;
18453889Smckusick sp->s_esc_handler = esc_top_level;
18553889Smckusick while (ip < sup)
18653889Smckusick *ip++ = 0;
18753889Smckusick esc_bp = esc_buf;
18853889Smckusick }
18953889Smckusick
19053889Smckusick /*
19153889Smckusick * This routine in_str(c, string) returns
19253889Smckusick * if string contains c then TRUE (1) else FALSE (0)
19353889Smckusick */
in_str(c,string)19453889Smckusick in_str(c, string)
19553889Smckusick char c;
19653889Smckusick register char *string;
19753889Smckusick {
19853889Smckusick while(*string)
19953889Smckusick if (c == *string++)
20053889Smckusick return(TRUE);
20153889Smckusick return(FALSE);
20253889Smckusick }
20353889Smckusick
20453889Smckusick /*
20553889Smckusick * Control sequence introducer (CSI)
20653889Smckusick * Which begins `^[[' and terminates one of `ABCDfgHhJKLlMmPr'
20753889Smckusick */
esc_csi(sp,c)20853889Smckusick esc_csi(sp, c)
20953889Smckusick register SCREEN *sp;
21053889Smckusick unsigned int c;
21153889Smckusick {
21253889Smckusick static int bufc = 0;
21353889Smckusick
21453889Smckusick if (in_str(c, sp->s_estp->terminators)) {
21553889Smckusick esc_csi_ansi(sp, esc_bp, c);
21653889Smckusick sp->s_current_stat &= ~ESCAPE;
21753889Smckusick bufc = 0;
21853889Smckusick return;
21953889Smckusick }
22053889Smckusick /* buffering arguments */
22153889Smckusick if (bufc < ESC_BUF_SIZ) {
22253889Smckusick if (c >= '0' && c <= '9') {
22353889Smckusick *esc_bp = *esc_bp *10 + (c - '0');
22453889Smckusick } else if (c == ';') {
22553889Smckusick esc_bp++;
22653889Smckusick bufc++;
22753889Smckusick } else if (c == '?') {
22853889Smckusick if (esc_bp == esc_buf) {
22953889Smckusick sp->s_esc_handler = esc_csi_dec;
23053889Smckusick } else {
23153889Smckusick esc_buf[0] = INVALID;
23253889Smckusick }
23353889Smckusick } else {
23453889Smckusick sp->s_current_stat &= ~ESCAPE;
23553889Smckusick bufc = 0;
23653889Smckusick }
23753889Smckusick }
23853889Smckusick }
23953889Smckusick
24053889Smckusick #ifdef IPC_MRX
24153889Smckusick #define SCC_KEYBOARD 0
24253889Smckusick #endif
24353889Smckusick
24453889Smckusick /*
24553889Smckusick * Ansi standard csi handler
24653889Smckusick */
esc_csi_ansi(sp,esc_bp,terminator)24753889Smckusick esc_csi_ansi(sp, esc_bp, terminator)
24853889Smckusick register SCREEN *sp;
24953889Smckusick char *esc_bp;
25053889Smckusick char terminator;
25153889Smckusick {
25253889Smckusick register char *cp = esc_buf;
25353889Smckusick register struct cursor *spc = &sp->s_csr;
25453889Smckusick register char *p;
25553889Smckusick register int i;
25653889Smckusick
25753889Smckusick if (*cp == INVALID)
25853889Smckusick return;
25953889Smckusick
26053889Smckusick cursor_off();
26153889Smckusick switch (terminator) {
26253889Smckusick case 'A': /* CUU */
26353889Smckusick if (spc->csr_y < sp->s_region.top_margin) {
26455762Sbostic spc->csr_y = max(spc->csr_y - max(*cp, 1)
26553889Smckusick ,TOP_M);
26653889Smckusick } else {
26755762Sbostic spc->csr_y = max(spc->csr_y - max(*cp, 1)
26853889Smckusick ,sp->s_region.top_margin);
26953889Smckusick }
27053889Smckusick spc->csr_p.y = (spc->csr_y - 1) * char_h + y_ofst;
27153889Smckusick sp->s_current_stat &= ~WRAP;
27253889Smckusick break;
27353889Smckusick case 'B': /* CUD */
27453889Smckusick if (spc->csr_y > sp->s_region.btm_margin) {
27555762Sbostic spc->csr_y = min(spc->csr_y + max(*cp, 1)
27653889Smckusick ,btm_m);
27753889Smckusick } else {
27855762Sbostic spc->csr_y = min(spc->csr_y + max(*cp, 1)
27953889Smckusick ,sp->s_region.btm_margin);
28053889Smckusick }
28153889Smckusick spc->csr_p.y = (spc->csr_y - 1) * char_h + y_ofst;
28253889Smckusick sp->s_current_stat &= ~WRAP;
28353889Smckusick break;
28453889Smckusick case 'C': /* CUF */
28555762Sbostic spc->csr_x = min(spc->csr_x + max(*cp, 1), rit_m);
28653889Smckusick spc->csr_p.x = (spc->csr_x - 1) * char_w + x_ofst;
28753889Smckusick sp->s_current_stat &= ~WRAP;
28853889Smckusick break;
28953889Smckusick case 'D': /* CUB */
29055762Sbostic spc->csr_x = max(spc->csr_x - max(*cp, 1), LFT_M);
29153889Smckusick spc->csr_p.x = (spc->csr_x - 1) * char_w + x_ofst;
29253889Smckusick sp->s_current_stat &= ~WRAP;
29353889Smckusick break;
29453889Smckusick case 'g': /* TBC */
29553889Smckusick switch (*cp) {
29653889Smckusick case 0:
29753889Smckusick sp->s_tab_pos[spc->csr_x] = 0;
29853889Smckusick break;
29953889Smckusick case 3:
30053889Smckusick for (i = 0; i <= rit_m; i++)
30153889Smckusick sp->s_tab_pos[i] = 0;
30253889Smckusick break;
30353889Smckusick default:
30453889Smckusick break;
30553889Smckusick }
30653889Smckusick break;
30753889Smckusick case 'f': /* HVP */
30853889Smckusick case 'H': /* CUP same as HVP */
30953889Smckusick csr_pos(sp, cp[1], cp[0]);
31053889Smckusick sp->s_current_stat &= ~WRAP;
31153889Smckusick break;
31253889Smckusick case 'J': /* ED */
31353889Smckusick erase_disp(sp, cp[0]);
31453889Smckusick sp->s_current_stat &= ~WRAP;
31553889Smckusick break;
31653889Smckusick case 'K': /* EL */
31753889Smckusick erase_line(sp, cp[0]);
31853889Smckusick sp->s_current_stat &= ~WRAP;
31953889Smckusick break;
32053889Smckusick case 'L': /* IL */
32153889Smckusick insert_line(sp, cp[0]);
32253889Smckusick break;
32353889Smckusick case 'M': /* DL */
32453889Smckusick delete_line(sp, cp[0]);
32553889Smckusick break;
32653889Smckusick case 'P': /* DCH */
32753889Smckusick delete_char(sp, cp[0]);
32853889Smckusick sp->s_current_stat &= ~WRAP;
32953889Smckusick break;
33053889Smckusick case 'r': /* DECSTBM */
33155762Sbostic cp[2] = max(cp[0] == 0 ? TOP_M: cp[0], TOP_M);
33255762Sbostic cp[3] = min(cp[1] == 0 ? btm_m: cp[1], btm_m);
33353889Smckusick if (cp[2] >= cp[3])
33453889Smckusick break;
33553889Smckusick
33653889Smckusick sp->s_region.top_margin = cp[2];
33753889Smckusick sp->s_region.btm_margin = cp[3];
33853889Smckusick
33953889Smckusick spc->csr_x = LFT_M;
34053889Smckusick spc->csr_p.x = x_ofst;
34153889Smckusick if (sp->s_term_mode & DECOM) {
34253889Smckusick spc->csr_y = sp->s_region.top_margin;
34353889Smckusick spc->csr_p.y = (spc->csr_y - 1) * char_h + y_ofst;
34453889Smckusick } else {
34553889Smckusick spc->csr_y = TOP_M;
34653889Smckusick spc->csr_p.y = y_ofst;
34753889Smckusick }
34853889Smckusick break;
34953889Smckusick case 'm': /* CRA */
35053889Smckusick while (cp <= esc_bp) {
35153889Smckusick switch (*cp++) {
35253889Smckusick case 0:
35353889Smckusick spc->csr_attributes &= NORMALM;
35453889Smckusick if (sp->s_term_mode & DECSCNM) {
35553889Smckusick fcolor = sp->s_bgcol;
35653889Smckusick bcolor = sp->s_plane;
35753889Smckusick }
35853889Smckusick else {
35953889Smckusick fcolor = sp->s_plane;
36053889Smckusick bcolor = sp->s_bgcol;
36153889Smckusick }
36253889Smckusick break;
36353889Smckusick case 1: /* bold */
36453889Smckusick spc->csr_attributes |= BOLD;
36553889Smckusick break;
36653889Smckusick case 4: /* under score */
36753889Smckusick spc->csr_attributes |= USCORE;
36853889Smckusick break;
36953889Smckusick case 5: /* blinking */
37053889Smckusick spc->csr_attributes |= BLINK;
37153889Smckusick break;
37253889Smckusick case 7: /* reverse */
37353889Smckusick spc->csr_attributes |= REVERSE;
37453889Smckusick if (sp->s_term_mode & DECSCNM) {
37553889Smckusick fcolor = sp->s_plane;
37653889Smckusick bcolor = sp->s_bgcol;
37753889Smckusick }
37853889Smckusick else {
37953889Smckusick fcolor = sp->s_bgcol;
38053889Smckusick bcolor = sp->s_plane;
38153889Smckusick }
38253889Smckusick break;
38353889Smckusick case 22: /* unbold */
38453889Smckusick spc->csr_attributes &= ~BOLD;
38553889Smckusick break;
38653889Smckusick case 24: /* no under score */
38753889Smckusick spc->csr_attributes &= ~USCORE;
38853889Smckusick break;
38953889Smckusick case 25: /* no blinking */
39053889Smckusick spc->csr_attributes &= ~BLINK;
39153889Smckusick break;
39253889Smckusick case 27: /* re-reverse */
39353889Smckusick spc->csr_attributes &= ~REVERSE;
39453889Smckusick if (sp->s_term_mode & DECSCNM) {
39553889Smckusick fcolor = sp->s_bgcol;
39653889Smckusick bcolor = sp->s_plane;
39753889Smckusick }
39853889Smckusick else {
39953889Smckusick fcolor = sp->s_plane;
40053889Smckusick bcolor = sp->s_bgcol;
40153889Smckusick }
40253889Smckusick break;
40353889Smckusick default:
40453889Smckusick break;
40553889Smckusick }
40653889Smckusick }
40753889Smckusick break;
40853889Smckusick case 'n':
40953889Smckusick while (cp <= esc_bp) { /* DSR(status request) */
41053889Smckusick switch (*cp++) {
41153889Smckusick case 6: /* inquiry cursor position */
41253889Smckusick key_str.key_string = c_pos_mess;
41353889Smckusick key_str.key_length = spr(c_pos_mess,
41453889Smckusick "\033[%d;%dR", (sp->s_term_mode & DECOM) ?
41553889Smckusick spc->csr_y - sp->s_region.top_margin + 1:
41653889Smckusick spc->csr_y, spc->csr_x);
41753889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
41853889Smckusick break;
41953889Smckusick default:
42053889Smckusick break;
42153889Smckusick }
42253889Smckusick }
42353889Smckusick break;
42453889Smckusick case 'h': /* SM */
42553889Smckusick while (cp <= esc_bp) {
42653889Smckusick switch (*cp++) {
42753889Smckusick case 2: /* Keyboard Action */
42853889Smckusick sp->s_term_mode |= KAM;
42953889Smckusick break;
43053889Smckusick case 4: /* Insert Replace */
43153889Smckusick sp->s_term_mode |= IRM;
43253889Smckusick break;
43353889Smckusick case 12: /* Local echo disable */
43453889Smckusick sp->s_term_mode |= SRM;
43553889Smckusick break;
43653889Smckusick case 20: /* Linefeed newline */
43753889Smckusick sp->s_term_mode |= LNM;
43853889Smckusick break;
43953889Smckusick default:
44053889Smckusick break;
44153889Smckusick }
44253889Smckusick }
44353889Smckusick break;
44453889Smckusick case 'l': /* RM */
44553889Smckusick while (cp <= esc_bp) {
44653889Smckusick switch (*cp++) {
44753889Smckusick case 2: /* Keyboard Action */
44853889Smckusick sp->s_term_mode &= ~KAM;
44953889Smckusick break;
45053889Smckusick case 4: /* Insert Replace */
45153889Smckusick sp->s_term_mode &= ~IRM;
45253889Smckusick break;
45353889Smckusick case 12: /* Local echo disable */
45453889Smckusick sp->s_term_mode &= ~SRM;
45553889Smckusick break;
45653889Smckusick case 20: /* Linefeed newline */
45753889Smckusick sp->s_term_mode &= ~LNM;
45853889Smckusick break;
45953889Smckusick default:
46053889Smckusick break;
46153889Smckusick }
46253889Smckusick }
46353889Smckusick break;
46453889Smckusick default:
46553889Smckusick break;
46653889Smckusick }
46753889Smckusick cursor_on(&spc->csr_p);
46853889Smckusick sp->s_current_stat &= ~ESCAPE;
46953889Smckusick }
47053889Smckusick
47153889Smckusick
47253889Smckusick /*
47353889Smckusick * Cursor position.
47453889Smckusick * csr_pos(sp, x, y) moves the cursor to (x, y).
47553889Smckusick */
csr_pos(sp,x,y)47653889Smckusick csr_pos(sp, x, y)
47753889Smckusick register SCREEN *sp;
47853889Smckusick register int x, y;
47953889Smckusick {
48053889Smckusick if (sp->s_term_mode & DECOM) {
48155762Sbostic sp->s_csr.csr_y = min(sp->s_region.top_margin +
48255762Sbostic max(y, 1) - 1, sp->s_region.btm_margin);
48353889Smckusick } else {
48455762Sbostic sp->s_csr.csr_y = min(TOP_M + max(y, 1) - 1, btm_m);
48553889Smckusick }
48655762Sbostic sp->s_csr.csr_x = max(min(x, rit_m), LFT_M);
48753889Smckusick sp->s_csr.csr_p.x = (sp->s_csr.csr_x -1) * char_w + x_ofst;
48853889Smckusick sp->s_csr.csr_p.y = (sp->s_csr.csr_y -1) * char_h + y_ofst;
48953889Smckusick }
49053889Smckusick
49153889Smckusick
49253889Smckusick /*
49353889Smckusick * Erase in display.
49453889Smckusick * erase_disp(sp, pn) erases display from the cursor to the end, from
49553889Smckusick * the beginning to the cursor or completely according to pn = 0, 1 or 2
49653889Smckusick * respectively.
49753889Smckusick */
erase_disp(sp,pn)49853889Smckusick erase_disp(sp, pn)
49953889Smckusick register SCREEN *sp;
50053889Smckusick register int pn;
50153889Smckusick {
50253889Smckusick register struct cursor *spc = &sp->s_csr;
50353889Smckusick
50453889Smckusick switch (pn) {
50553889Smckusick case 0: /* cursor to end */
50653889Smckusick erase_line(sp, 0);
50755762Sbostic clear_lines(min(spc->csr_y + 1, btm_m),
50853889Smckusick btm_m - spc->csr_y, sp->s_term_mode & DECSCNM,
50953889Smckusick sp->s_plane, sp->s_bgcol);
51053889Smckusick break;
51153889Smckusick case 1: /* beginning to cursor */
51253889Smckusick erase_line(sp, 1);
51353889Smckusick clear_lines(TOP_M, spc->csr_y - TOP_M, sp->s_term_mode & DECSCNM,
51453889Smckusick sp->s_plane, sp->s_bgcol);
51553889Smckusick break;
51653889Smckusick case 2: /* whole */
51753889Smckusick clear_lines(TOP_M, btm_m - TOP_M + 1,
51853889Smckusick sp->s_term_mode & DECSCNM,
51953889Smckusick sp->s_plane, sp->s_bgcol);
52053889Smckusick break;
52153889Smckusick default:
52253889Smckusick break;
52353889Smckusick }
52453889Smckusick }
52553889Smckusick
52653889Smckusick
52753889Smckusick
52853889Smckusick /*
52953889Smckusick * Erase in line.
53053889Smckusick * erase_line(sp, pn) erases line from the cursor to the end, from the
53153889Smckusick * beginning to the cursor or completely according to pn = 0, 1 or 2
53253889Smckusick * respectively.
53353889Smckusick */
erase_line(sp,pn)53453889Smckusick erase_line(sp, pn)
53553889Smckusick register SCREEN *sp;
53653889Smckusick register int pn;
53753889Smckusick {
53853889Smckusick register struct cursor *spc = &sp->s_csr;
53953889Smckusick
54053889Smckusick switch(pn) {
54153889Smckusick case 0:
54253889Smckusick clear_chars(spc->csr_x, spc->csr_y,
54353889Smckusick rit_m - spc->csr_x + 1, sp->s_term_mode & DECSCNM,
54453889Smckusick sp->s_plane, sp->s_bgcol);
54553889Smckusick break;
54653889Smckusick case 1:
54753889Smckusick clear_chars(LFT_M, spc->csr_y,
54853889Smckusick spc->csr_x - LFT_M + 1, sp->s_term_mode & DECSCNM,
54953889Smckusick sp->s_plane, sp->s_bgcol);
55053889Smckusick break;
55153889Smckusick case 2:
55253889Smckusick clear_lines(spc->csr_y, 1, sp->s_term_mode & DECSCNM,
55353889Smckusick sp->s_plane, sp->s_bgcol);
55453889Smckusick break;
55553889Smckusick default:
55653889Smckusick break;
55753889Smckusick }
55853889Smckusick }
55953889Smckusick
56053889Smckusick /*
56153889Smckusick * Insert line.
56253889Smckusick * insert_line(sp, pn) inserts pn lines in scroll region
56353889Smckusick */
insert_line(sp,pn)56453889Smckusick insert_line(sp, pn)
56553889Smckusick register SCREEN *sp;
56653889Smckusick register int pn;
56753889Smckusick {
56853889Smckusick register struct cursor *spc = &sp->s_csr;
56953889Smckusick register struct region *spr = &sp->s_region;
57053889Smckusick
57155762Sbostic pn = max(pn, 1);
57253889Smckusick if (spc->csr_y < spr->top_margin || spc->csr_y > spr->btm_margin)
57353889Smckusick return;
57453889Smckusick if (pn <= spr->btm_margin - spc->csr_y) {
57553889Smckusick move_lines(spc->csr_y, spr->btm_margin - pn - spc->csr_y + 1,
57653889Smckusick spc->csr_y + pn);
57753889Smckusick }
57853889Smckusick clear_lines(spc->csr_y,
57955762Sbostic min(spc->csr_y + pn - 1, spr->btm_margin) - spc->csr_y + 1,
58053889Smckusick sp->s_term_mode & DECSCNM, sp->s_plane, sp->s_bgcol);
58153889Smckusick spc->csr_x = LFT_M;
58253889Smckusick spc->csr_p.x = x_ofst;
58353889Smckusick }
58453889Smckusick
58553889Smckusick /*
58653889Smckusick * Delete line.
58753889Smckusick * delete_line(sp, pn) deletes pn lines in scroll region
58853889Smckusick */
delete_line(sp,pn)58953889Smckusick delete_line(sp, pn)
59053889Smckusick register SCREEN *sp;
59153889Smckusick register int pn;
59253889Smckusick {
59353889Smckusick register struct cursor *spc = &sp->s_csr;
59453889Smckusick register struct region *spr = &sp->s_region;
59553889Smckusick register int aux;
59653889Smckusick
59755762Sbostic pn = max(pn, 1);
59853889Smckusick if (spc->csr_y < spr->top_margin || spc->csr_y > spr->btm_margin)
59953889Smckusick return;
60053889Smckusick if (pn <= spr->btm_margin - spc->csr_y) {
60153889Smckusick aux = spc->csr_y + pn;
60253889Smckusick move_lines(aux, spr->btm_margin - aux + 1, spc->csr_y);
60353889Smckusick }
60455762Sbostic aux = max(spr->btm_margin - pn + 1, spc->csr_y);
60553889Smckusick clear_lines(aux, spr->btm_margin - aux + 1, sp->s_term_mode & DECSCNM,
60653889Smckusick sp->s_plane, sp->s_bgcol);
60753889Smckusick spc->csr_x = LFT_M;
60853889Smckusick spc->csr_p.x = x_ofst;
60953889Smckusick }
61053889Smckusick
61153889Smckusick /*
61253889Smckusick * Delete character.
61353889Smckusick * delete_char(sp, pn) deletes pn characters right side of the cursor.
61453889Smckusick */
delete_char(sp,pn)61553889Smckusick delete_char(sp, pn)
61653889Smckusick register SCREEN *sp;
61753889Smckusick register int pn;
61853889Smckusick {
61953889Smckusick register struct cursor *spc = &sp->s_csr;
62053889Smckusick register int aux;
62153889Smckusick
62255762Sbostic pn = max(pn, 1);
62353889Smckusick if (pn < rit_m - spc->csr_x + 1) {
62453889Smckusick move_chars(spc->csr_x + pn, spc->csr_y,
62553889Smckusick rit_m - spc->csr_x - pn + 1 ,spc->csr_x);
62653889Smckusick }
62755762Sbostic aux = max(rit_m - pn + 1, spc->csr_x);
62853889Smckusick clear_chars(aux, spc->csr_y, rit_m - aux + 1,
62953889Smckusick sp->s_term_mode & DECSCNM, sp->s_plane, sp->s_bgcol);
63053889Smckusick }
63153889Smckusick
63253889Smckusick /*
63353889Smckusick * This escape control sequence begins `^[[?' and ends `h' or `l'
63453889Smckusick */
esc_csi_dec(sp,c)63553889Smckusick esc_csi_dec(sp, c)
63653889Smckusick register SCREEN *sp;
63753889Smckusick char c;
63853889Smckusick {
63953889Smckusick register char *cp;
64053889Smckusick
64153889Smckusick if (in_str(c, sp->s_estp->terminators)) {
64253889Smckusick if (esc_buf[0] != INVALID) {
64353889Smckusick cursor_off();
64453889Smckusick switch (c) {
64553889Smckusick case 'h': /* set mode */
64653889Smckusick for (cp = esc_buf; cp <= esc_bp; cp++) {
64753889Smckusick switch (*cp) {
64853889Smckusick case 1: /* cursor key application */
64953889Smckusick sp->s_term_mode |= DECCKM;
65053889Smckusick change_csr_key_pad(APPLIC);
65153889Smckusick break;
65253889Smckusick case 3: /* 132 column mode */
65353889Smckusick sp->s_term_mode |= DECCOLM;
65453889Smckusick break;
65553889Smckusick case 4: /* jump scroll */
65653889Smckusick sp->s_term_mode |= DECSCLM;
65753889Smckusick break;
65853889Smckusick case 5: /* reverse */
65953889Smckusick if ((sp->s_term_mode & DECSCNM) == 0)
66053889Smckusick reverse_rec(sp->s_bgcol,
66153889Smckusick sp->s_plane);
66253889Smckusick sp->s_term_mode |= DECSCNM;
66353889Smckusick if (sp->s_csr.csr_attributes & REVERSE)
66453889Smckusick {
66553889Smckusick fcolor = sp->s_plane;
66653889Smckusick bcolor = sp->s_bgcol;
66753889Smckusick } else {
66853889Smckusick fcolor = sp->s_bgcol;
66953889Smckusick bcolor = sp->s_plane;
67053889Smckusick }
67153889Smckusick break;
67253889Smckusick case 6: /* origin */
67353889Smckusick sp->s_term_mode |= DECOM;
67453889Smckusick sp->s_csr.csr_x = LFT_M;
67553889Smckusick sp->s_csr.csr_y =
67653889Smckusick sp->s_region.top_margin;
67753889Smckusick sp->s_csr.csr_p.x = x_ofst;
67853889Smckusick sp->s_csr.csr_p.y =
67953889Smckusick (sp->s_csr.csr_y - 1) * char_h +
68053889Smckusick y_ofst;
68153889Smckusick break;
68253889Smckusick case 7: /* auto wrap */
68353889Smckusick sp->s_term_mode |= DECAWM;
68453889Smckusick break;
68553889Smckusick case 8: /* auto repeat */
68653889Smckusick if ((sp->s_term_mode & DECARM) == 0) {
68753889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCREPT,
68853889Smckusick (int *)0);
68953889Smckusick }
69053889Smckusick sp->s_term_mode |= DECARM;
69153889Smckusick break;
69253889Smckusick case 25: /* cursor active */
69353889Smckusick sp->s_term_mode |= DECCSR_ACTV;
69453889Smckusick break;
69553889Smckusick default:
69653889Smckusick break;
69753889Smckusick }
69853889Smckusick }
69953889Smckusick break;
70053889Smckusick case 'l': /* reset mode */
70153889Smckusick for (cp = esc_buf; cp <= esc_bp; cp++) {
70253889Smckusick switch (*cp) {
70353889Smckusick case 1: /* cursor key application */
70453889Smckusick sp->s_term_mode &= ~DECCKM;
70553889Smckusick change_csr_key_pad(NUMERIC);
70653889Smckusick break;
70753889Smckusick case 3: /* 132 column mode */
70853889Smckusick sp->s_term_mode &= ~DECCOLM;
70953889Smckusick break;
71053889Smckusick case 4: /* jump scroll */
71153889Smckusick sp->s_term_mode &= ~DECSCLM;
71253889Smckusick break;
71353889Smckusick case 5: /* reverse */
71453889Smckusick if (sp->s_term_mode & DECSCNM)
71553889Smckusick reverse_rec(sp->s_plane,
71653889Smckusick sp->s_bgcol);
71753889Smckusick sp->s_term_mode &= ~DECSCNM;
71853889Smckusick if (sp->s_csr.csr_attributes & REVERSE)
71953889Smckusick {
72053889Smckusick fcolor = sp->s_bgcol;
72153889Smckusick bcolor = sp->s_plane;
72253889Smckusick } else {
72353889Smckusick fcolor = sp->s_plane;
72453889Smckusick bcolor = sp->s_bgcol;
72553889Smckusick }
72653889Smckusick break;
72753889Smckusick case 6: /* origin */
72853889Smckusick sp->s_term_mode &= ~DECOM;
72953889Smckusick sp->s_csr.csr_x = LFT_M;
73053889Smckusick sp->s_csr.csr_y = TOP_M;
73153889Smckusick sp->s_csr.csr_p.x = x_ofst;
73253889Smckusick sp->s_csr.csr_p.y = y_ofst;
73353889Smckusick break;
73453889Smckusick case 7: /* auto wrap */
73553889Smckusick sp->s_term_mode &= ~DECAWM;
73653889Smckusick break;
73753889Smckusick case 8: /* auto repeat */
73853889Smckusick if (sp->s_term_mode & DECARM) {
73953889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCNRPT,
74053889Smckusick (int *) 0);
74153889Smckusick }
74253889Smckusick sp->s_term_mode &= ~DECARM;
74353889Smckusick break;
74453889Smckusick case 25: /* cursor non-active */
74553889Smckusick sp->s_term_mode &= ~DECCSR_ACTV;
74653889Smckusick break;
74753889Smckusick default:
74853889Smckusick break;
74953889Smckusick }
75053889Smckusick }
75153889Smckusick break;
75253889Smckusick default:
75353889Smckusick break;
75453889Smckusick }
75553889Smckusick cursor_on(&sp->s_csr.csr_p);
75653889Smckusick }
75753889Smckusick sp->s_current_stat &= ~ESCAPE;
75853889Smckusick } else { /* buffering arguments */
75953889Smckusick if (c >= '0' && c <= '9') {
76053889Smckusick *esc_bp = *esc_bp * 10 + (c - '0');
76153889Smckusick } else if (c == ';') {
76253889Smckusick esc_bp++;
76353889Smckusick } else if (c == '?') {
76453889Smckusick esc_buf[0] = INVALID;
76553889Smckusick } else {
76653889Smckusick sp->s_current_stat &= ~ESCAPE;
76753889Smckusick }
76853889Smckusick }
76953889Smckusick }
77053889Smckusick
77153889Smckusick /*
77253889Smckusick * changes cursor key pad to ansi_ctl
77353889Smckusick */
77453889Smckusick static
change_csr_key_pad(applic)77553889Smckusick change_csr_key_pad(applic)
77653889Smckusick register int applic;
77753889Smckusick {
77853889Smckusick char pad[4];
77953889Smckusick register Pfk_string *pfk = &pfk_str;
78053889Smckusick register Key_string *kys = &pfk_str.pfk_string;
78153889Smckusick register struct key_pad *kpd;
78253889Smckusick register int i;
78353889Smckusick
78453889Smckusick kpd = &key_pad[UP-N0];
78553889Smckusick pad[0] = '\033';
78653889Smckusick pad[1] = (applic) ? 'O': '[';
78753889Smckusick for (i = UP; i <= LEFT; i++) {
78853889Smckusick pfk->pfk_num = i;
78953889Smckusick kys->key_length = (applic) ? 3: 3;
79053889Smckusick pad[2] = (applic) ? kpd->kpd_applic: kpd->kpd_numeric;
79153889Smckusick kys->key_string = pad;
79253889Smckusick kpd++;
79353889Smckusick pfk->pfk_shift = PF_NORMAL;
79453889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
79553889Smckusick pfk->pfk_shift = PF_SHIFT;
79653889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
79753889Smckusick }
79853889Smckusick }
79953889Smckusick
80053889Smckusick extern struct cursor inner_buf_csr;
80153889Smckusick extern int inner_buf_tstat;
80253889Smckusick /*
80353889Smckusick * Store cursor position and attributes.
80453889Smckusick * The SCREEN structure is stored inner structure.
80553889Smckusick */
esc_store_csr(sp)80653889Smckusick esc_store_csr(sp)
80753889Smckusick register SCREEN *sp;
80853889Smckusick {
80953889Smckusick inner_buf_csr = sp->s_csr;
81053889Smckusick inner_buf_tstat = (DECOM|DECAWM) & sp->s_term_mode;
81153889Smckusick }
81253889Smckusick
81353889Smckusick /*
81453889Smckusick * Restore cursor position and attributes.
81553889Smckusick * The SCREEN structure is restored from inner structure.
81653889Smckusick * Prevail error from unexpected use of this command, inner structure
81753889Smckusick * must be initialized.
81853889Smckusick */
esc_restore_csr(sp)81953889Smckusick esc_restore_csr(sp)
82053889Smckusick register SCREEN *sp;
82153889Smckusick {
82253889Smckusick cursor_off();
82353889Smckusick sp->s_csr = inner_buf_csr;
82453889Smckusick sp->s_term_mode = (sp->s_term_mode & ~(DECOM|DECAWM)) | inner_buf_tstat;
82553889Smckusick cursor_on(&sp->s_csr.csr_p);
82653889Smckusick }
82753889Smckusick
82853889Smckusick /*
82953889Smckusick * index()
83053889Smckusick * esc_index(sp) moves the cursor down if the cursor is not at
83153889Smckusick * bottom margin. If the cursor is at the bottom margin then
83253889Smckusick * scroll up.
83353889Smckusick */
esc_index(sp)83453889Smckusick esc_index(sp)
83553889Smckusick register SCREEN *sp;
83653889Smckusick {
83753889Smckusick cursor_off();
83853889Smckusick if (sp->s_csr.csr_y == sp->s_region.btm_margin)
83953889Smckusick scroll_up(sp->s_region.top_margin,
84053889Smckusick sp->s_region.btm_margin, sp->s_term_mode & DECSCNM,
84153889Smckusick sp->s_plane, sp->s_bgcol);
84253889Smckusick else {
84353889Smckusick if (sp->s_csr.csr_y < btm_m) {
84453889Smckusick sp->s_csr.csr_y += 1;
84553889Smckusick sp->s_csr.csr_p.y += char_h;
84653889Smckusick }
84753889Smckusick }
84853889Smckusick sp->s_current_stat &= ~WRAP;
84953889Smckusick cursor_on(&sp->s_csr.csr_p);
85053889Smckusick }
85153889Smckusick
85253889Smckusick /*
85353889Smckusick * next line
85453889Smckusick * esc_next_line(sp) moves the cursor down like index but the cursor
85553889Smckusick * position is the beginning of the next line.
85653889Smckusick */
esc_next_line(sp)85753889Smckusick esc_next_line(sp)
85853889Smckusick register SCREEN *sp;
85953889Smckusick {
86053889Smckusick sp->s_csr.csr_x = LFT_M;
86153889Smckusick sp->s_csr.csr_p.x = x_ofst;
86253889Smckusick esc_index(sp);
86353889Smckusick }
86453889Smckusick
86553889Smckusick /*
86653889Smckusick * tabulation set
86753889Smckusick * esc_tab_set(sp) sets tabulation stop at the current cursor point.
86853889Smckusick */
esc_tab_set(sp)86953889Smckusick esc_tab_set(sp)
87053889Smckusick register SCREEN *sp;
87153889Smckusick {
87253889Smckusick sp->s_tab_pos[sp->s_csr.csr_x] = 1;
87353889Smckusick }
87453889Smckusick
87553889Smckusick /*
87653889Smckusick * reverse index
87753889Smckusick * esc_rev_index(sp) moves the cursor up if the cursor is not at the top
87853889Smckusick * margin. If the cursor is at the top margin then the screen takes place
87953889Smckusick * scroll down.
88053889Smckusick */
esc_rev_index(sp)88153889Smckusick esc_rev_index(sp)
88253889Smckusick register SCREEN *sp;
88353889Smckusick {
88453889Smckusick cursor_off();
88553889Smckusick if (sp->s_csr.csr_y == sp->s_region.top_margin)
88653889Smckusick scroll_down(sp->s_region.top_margin,
88753889Smckusick sp->s_region.btm_margin, sp->s_term_mode & DECSCNM,
88853889Smckusick sp->s_plane, sp->s_bgcol);
88953889Smckusick else {
89053889Smckusick if (sp->s_csr.csr_y > TOP_M) {
89153889Smckusick sp->s_csr.csr_y -= 1;
89253889Smckusick sp->s_csr.csr_p.y -= char_h;
89353889Smckusick }
89453889Smckusick }
89553889Smckusick sp->s_current_stat &= ~WRAP;
89653889Smckusick cursor_on(&sp->s_csr.csr_p);
89753889Smckusick }
89853889Smckusick
89953889Smckusick /*
90053889Smckusick * numeric key pad
90153889Smckusick * esc_numeric_kpad(sp) changes key pad of cursor to numeric one.
90253889Smckusick * This sequence is used in vi.
90353889Smckusick * currently not supported
90453889Smckusick */
esc_numeric_kpad(sp)90553889Smckusick esc_numeric_kpad(sp)
90653889Smckusick register SCREEN *sp;
90753889Smckusick {
90853889Smckusick change_aux_key_pad(NUMERIC);
90953889Smckusick sp->s_current_stat &= ~ESCAPE;
91053889Smckusick }
91153889Smckusick
91253889Smckusick /*
91353889Smckusick * application key pad
91453889Smckusick * esc_application_kpad(sp) changes key pad of cursor to application one.
91553889Smckusick * This sequence is also used in vi.
91653889Smckusick * currently not supported.
91753889Smckusick */
esc_application_kpad(sp)91853889Smckusick esc_application_kpad(sp)
91953889Smckusick register SCREEN *sp;
92053889Smckusick {
92153889Smckusick change_aux_key_pad(APPLIC);
92253889Smckusick sp->s_current_stat &= ~ESCAPE;
92353889Smckusick }
92453889Smckusick
92553889Smckusick /*
92653889Smckusick * change auxiliary keypad
92753889Smckusick */
92853889Smckusick static
change_aux_key_pad(applic)92953889Smckusick change_aux_key_pad(applic)
93053889Smckusick register int applic;
93153889Smckusick {
93253889Smckusick char pad[4];
93353889Smckusick register Pfk_string *pfk = &pfk_str;
93453889Smckusick register Key_string *kys = &pfk_str.pfk_string;
93553889Smckusick register struct key_pad *kpd;
93653889Smckusick register int i;
93753889Smckusick
93853889Smckusick kpd = &key_pad[0];
93953889Smckusick if (applic) {
94053889Smckusick pad[0] = '\033';
94153889Smckusick pad[1] = 'O';
94253889Smckusick }
94353889Smckusick for (i = N0; i <= NENTER; i++) {
94453889Smckusick
94553889Smckusick pfk->pfk_num = i;
94653889Smckusick kys->key_length = (applic) ? 3: 1;
94753889Smckusick if (applic) {
94853889Smckusick pad[2] = kpd->kpd_applic;
94953889Smckusick } else {
95053889Smckusick pad[0] = kpd->kpd_numeric;
95153889Smckusick }
95253889Smckusick kys->key_string = pad;
95353889Smckusick kpd++;
95453889Smckusick pfk->pfk_shift = PF_NORMAL;
95553889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
95653889Smckusick pfk->pfk_shift = PF_SHIFT;
95753889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
95853889Smckusick }
95953889Smckusick if (!applic) {
96053889Smckusick pfk->pfk_shift = PF_SHIFT;
96153889Smckusick kys->key_length = 1;
96253889Smckusick
96353889Smckusick pfk->pfk_num = MINUS;
96453889Smckusick kys->key_string = "/";
96553889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
96653889Smckusick
96753889Smckusick pfk->pfk_num = PLUS;
96853889Smckusick kys->key_string = "*";
96953889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
97053889Smckusick
97153889Smckusick pfk->pfk_num = COMMA;
97253889Smckusick kys->key_string = "=";
97353889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
97453889Smckusick }
97553889Smckusick }
97653889Smckusick
97753889Smckusick extern struct csr_buf local_csr_buf;
97853889Smckusick /*
97953889Smckusick * change line size
98053889Smckusick * esc_line_size(sp, pn) changes line size.
98153889Smckusick * c = `3' double side double height(top half)
98253889Smckusick * c = `4' double side double height(bottom half)
98353889Smckusick * c = `5' sigle width line
98453889Smckusick * c = `6' double width line
98553889Smckusick * currently not supported
98653889Smckusick */
esc_line_size(sp,c)98753889Smckusick esc_line_size(sp, c)
98853889Smckusick register SCREEN *sp;
98953889Smckusick char c;
99053889Smckusick {
99153889Smckusick register int i;
99253889Smckusick register int j;
99353889Smckusick int save_f, save_b;
99453889Smckusick
99553889Smckusick cursor_off();
99653889Smckusick switch (c) {
99753889Smckusick case '5':
99853889Smckusick local_csr_buf.csr_number = 1;
99953889Smckusick break;
100053889Smckusick case '6':
100153889Smckusick local_csr_buf.csr_number = 2;
100253889Smckusick break;
100353889Smckusick case '8':
100453889Smckusick sp->s_region.top_margin = TOP_M;
100553889Smckusick sp->s_region.btm_margin = btm_m;
100653889Smckusick save_f = fcolor;
100753889Smckusick save_b = bcolor;
100853889Smckusick fcolor = sp->s_bgcol;
100953889Smckusick bcolor = sp->s_plane;
101053889Smckusick sp->s_csr.csr_p.y = y_ofst;
101153889Smckusick for (i = TOP_M; i <= btm_m; i++) {
101253889Smckusick sp->s_csr.csr_p.x = x_ofst;
101353889Smckusick sp->s_csr.csr_y = i;
101453889Smckusick for (j = LFT_M; j <= rit_m; j++) {
101553889Smckusick sp->s_csr.csr_x = j;
101653889Smckusick copy_char(sp, 'E', 0);
101753889Smckusick sp->s_csr.csr_p.x += char_w;
101853889Smckusick }
101953889Smckusick sp->s_csr.csr_p.y += char_h;
102053889Smckusick }
102153889Smckusick sp->s_csr.csr_x = LFT_M;
102253889Smckusick sp->s_csr.csr_y = TOP_M;
102353889Smckusick sp->s_csr.csr_p.x = x_ofst;
102453889Smckusick sp->s_csr.csr_p.y = y_ofst;
102553889Smckusick fcolor = save_f;
102653889Smckusick bcolor = save_b;
102753889Smckusick break;
102853889Smckusick default:
102953889Smckusick break;
103053889Smckusick }
103153889Smckusick cursor_on(&sp->s_csr.csr_p);
103253889Smckusick sp->s_current_stat &= ~ESCAPE;
103353889Smckusick }
103453889Smckusick
103553889Smckusick /*
103653889Smckusick * character set
103753889Smckusick * esc_char_setr sets which character set you use in right graphic set.
103853889Smckusick * currently not supported
103953889Smckusick */
esc_char_setr(sp,c)104053889Smckusick esc_char_setr(sp, c)
104153889Smckusick register SCREEN *sp;
104253889Smckusick int c;
104353889Smckusick {
104453889Smckusick #if defined(IPC_MRX) || defined(CPU_SINGLE)
104553889Smckusick switch (c) {
104653889Smckusick case 'J':
104753889Smckusick case 'H':
104853889Smckusick font_jisroman();
104953889Smckusick #ifdef CPU_SINGLE
105053889Smckusick font_jisroman24();
105153889Smckusick #endif
105253889Smckusick sp->s_current_stat &= ~JKANJI;
105353889Smckusick break;
105453889Smckusick case 'B':
105553889Smckusick font_ascii();
105653889Smckusick #ifdef CPU_SINGLE
105753889Smckusick font_ascii24();
105853889Smckusick #endif
105953889Smckusick sp->s_current_stat &= ~JKANJI;
106053889Smckusick break;
106153889Smckusick }
106253889Smckusick #else /* IPC_MRX || CPU_SINGLE */
106353889Smckusick if (c == 'B' || c == 'J' || c == 'H') {
106453889Smckusick sp->s_current_stat &= ~JKANJI;
106553889Smckusick }
106653889Smckusick #endif /* IPC_MRX || CPU_SINGLE */
106753889Smckusick sp->s_current_stat &= ~ESCAPE;
106853889Smckusick }
106953889Smckusick
107053889Smckusick /*
107153889Smckusick * character set to left graphic set
107253889Smckusick * esc_char_setl sets which character set you use in left graphic set.
107353889Smckusick * currently not supported
107453889Smckusick */
esc_char_setl(sp,c)107553889Smckusick esc_char_setl(sp, c)
107653889Smckusick register SCREEN *sp;
107753889Smckusick int c;
107853889Smckusick {
107953889Smckusick sp->s_current_stat &= ~ESCAPE;
108053889Smckusick }
108153889Smckusick
108253889Smckusick extern tmode;
108353889Smckusick extern unsigned int first_jcode;
108453889Smckusick /*
108553889Smckusick * character set to kanji
108653889Smckusick * esc_kanji_set sets kanji
108753889Smckusick */
esc_kanji_set(sp,c)108853889Smckusick esc_kanji_set(sp, c)
108953889Smckusick register SCREEN *sp;
109053889Smckusick int c;
109153889Smckusick {
109253889Smckusick
109353889Smckusick #ifdef KM_JIS
109453889Smckusick if (tmode == KM_JIS && (c == 'B' || c == '@')) {
109553889Smckusick sp->s_current_stat |= JKANJI;
109653889Smckusick first_jcode = 0;
109753889Smckusick }
109853889Smckusick #endif
109953889Smckusick sp->s_current_stat &= ~ESCAPE;
110053889Smckusick }
110153889Smckusick
110253889Smckusick static short parm_buf[PARM_BUF_SIZ];
110353889Smckusick static short *parm_bp = parm_buf;
110453889Smckusick static int sensitive = 0;
110553889Smckusick static int pval = 0;
110653889Smckusick /*
110753889Smckusick * terminal parameter set command
110853889Smckusick * esc_parm_set(sp, c) sets terminal parameters such as font-width,
110953889Smckusick * font-height, character-width, character-height, character-position,
111053889Smckusick * underlind-position, screen-width, screen-height, x-offset, y-offset,
111153889Smckusick * right-mergin, bottom-mergin, dimmer-count, bell-length.
111253889Smckusick */
esc_parm_set(sp,c)111353889Smckusick esc_parm_set(sp, c)
111453889Smckusick register SCREEN *sp;
111553889Smckusick register unsigned int c;
111653889Smckusick {
111753889Smckusick static int bufc = 0;
111853889Smckusick
111953889Smckusick if (in_str(c, sp->s_estp->terminators)) {
112053889Smckusick if (sensitive) {
112153889Smckusick *parm_bp++ = pval;
112253889Smckusick } else {
112353889Smckusick *parm_bp++ = -1;
112453889Smckusick }
112553889Smckusick *parm_bp++ = -1;
112653889Smckusick parm_set(sp, parm_buf, c);
112753889Smckusick sp->s_current_stat &= ~ESCAPE;
112853889Smckusick sensitive = pval = 0;
112953889Smckusick parm_bp = parm_buf;
113053889Smckusick bufc = 0;
113153889Smckusick return;
113253889Smckusick }
113353889Smckusick /* buffering arguments */
113453889Smckusick if (bufc < PARM_BUF_SIZ) {
113553889Smckusick if (c >= '0' && c <= '9') {
113653889Smckusick pval = pval *10 + (c - '0');
113753889Smckusick sensitive = 1;
113853889Smckusick } else if (c == ';') {
113953889Smckusick if (sensitive) {
114053889Smckusick *parm_bp++ = pval;
114153889Smckusick } else {
114253889Smckusick *parm_bp++ = -1;
114353889Smckusick }
114453889Smckusick sensitive = pval = 0;
114553889Smckusick bufc++;
114653889Smckusick } else {
114753889Smckusick sp->s_current_stat &= ~ESCAPE;
114853889Smckusick sensitive = pval = 0;
114953889Smckusick parm_bp = parm_buf;
115053889Smckusick bufc = 0;
115153889Smckusick }
115253889Smckusick }
115353889Smckusick }
115453889Smckusick
115553889Smckusick static char an_buf[AN_BUF_SIZ];
115653889Smckusick
parm_set(sp,parm,terminator)115753889Smckusick parm_set(sp, parm, terminator)
115853889Smckusick SCREEN *sp;
115953889Smckusick short *parm;
116053889Smckusick unsigned int terminator;
116153889Smckusick {
116253889Smckusick register char *bp = an_buf;
116353889Smckusick register char *p;
116453889Smckusick
116553889Smckusick switch (terminator) {
116653889Smckusick case 'f':
116753889Smckusick if (parm[0] >= FONT_W_MIN && parm[0] <= consfb->font_w &&
116853889Smckusick parm[0] < char_w)
116953889Smckusick font_w = parm[0];
117053889Smckusick
117153889Smckusick if (parm[1] >= FONT_H_MIN && parm[1] <= consfb->font_h &&
117253889Smckusick parm[1] <= (char_h - ch_pos))
117353889Smckusick font_h = parm[1];
117453889Smckusick break;
117553889Smckusick case 'c':
117653889Smckusick if (parm[0] >= CHAR_W_MIN && parm[0] > font_w &&
117753889Smckusick parm[0] <= CHAR_W_MAX)
117853889Smckusick char_w = parm[0];
117953889Smckusick
118053889Smckusick if (parm[1] >= CHAR_H_MIN && parm[1] >= (font_h + ch_pos) &&
118153889Smckusick parm[1] > ul_pos && parm[1] <= CHAR_H_MAX)
118253889Smckusick char_h = parm[1];
118353889Smckusick
118453889Smckusick break;
118553889Smckusick case 'p':
118653889Smckusick if (parm[0] >= UL_POS_MIN && parm[0] <= UL_POS_MAX &&
118753889Smckusick parm[0] < char_h) {
118853889Smckusick ul_pos = parm[0];
118953889Smckusick }
119053889Smckusick if (parm[1] >= CH_POS_MIN && parm[1] <= CH_POS_MAX &&
119153889Smckusick parm[1] < (char_h - font_h)) {
119253889Smckusick ch_pos = parm[1];
119353889Smckusick }
119453889Smckusick break;
119553889Smckusick case 's':
119653889Smckusick if (parm[0] > SCR_W_MIN && parm[0] <= consfb->scr_w)
119753889Smckusick scr_w = (parm[0] < char_w) ? char_w: parm[0];
119853889Smckusick if (parm[1] > SCR_H_MIN && parm[1] <= consfb->scr_h)
119953889Smckusick scr_h = (parm[1] < char_h) ? char_h: parm[1];
120053889Smckusick break;
120153889Smckusick case 'o':
120253889Smckusick if (parm[0] >= X_OFST_MIN && parm[0] <= X_OFST_MAX)
120353889Smckusick x_ofst = (parm[0] > scr_w - char_w) ?
120453889Smckusick (scr_w - char_w): parm[0];
120553889Smckusick if (parm[1] >= Y_OFST_MIN && parm[1] <= Y_OFST_MAX)
120653889Smckusick y_ofst = (parm[1] > scr_h - char_h) ?
120753889Smckusick (scr_h - char_h): parm[1];
120853889Smckusick break;
120953889Smckusick case 'm':
121053889Smckusick if (parm[0] >= RIT_M_MIN) {
121153889Smckusick if (parm[0] > RIT_M_MAX /* consfb->rit_m */) {
121253889Smckusick parm[0] = consfb->rit_m;
121353889Smckusick }
121453889Smckusick rit_m = (parm[0] > (scr_w - x_ofst)/char_w) ?
121553889Smckusick (scr_w - x_ofst)/char_w: parm[0];
121653889Smckusick }
121753889Smckusick if (parm[1] >= BTM_M_MIN) {
121853889Smckusick if (parm[1] > BTM_M_MAX /* consfb->btm_m */) {
121953889Smckusick parm[1] = consfb->btm_m;
122053889Smckusick }
122153889Smckusick btm_m = (parm[1] > (scr_h - y_ofst)/char_h) ?
122253889Smckusick (scr_h - y_ofst)/char_h: parm[1];
122353889Smckusick }
122453889Smckusick break;
122553889Smckusick case 'd':
122660634Sutashiro if (parm[0] >= DIM_CNT_MIN /* && parm[0] <= DIM_CNT_MAX */)
122753889Smckusick dim_cnt = a_dim_on = parm[0];
122853889Smckusick else
122953889Smckusick a_dim_on = 0;
123053889Smckusick break;
123153889Smckusick case 'b':
123253889Smckusick if (parm[0] >= BELL_LEN_MIN && parm[0] <= BELL_LEN_MAX)
123353889Smckusick bell_len = parm[0];
123453889Smckusick break;
123553889Smckusick case 'D':
123653889Smckusick set_default_param();
123753889Smckusick vt100init();
123853889Smckusick bitmapinit();
123953889Smckusick break;
124053889Smckusick case 'i':
124153889Smckusick cursor_off();
124253889Smckusick csr_pos(sp, LFT_M, TOP_M);
124353889Smckusick key_str.key_string = c_pos_mess;
124453889Smckusick key_str.key_length = spr(c_pos_mess, "f=(%d,%d), ",
124553889Smckusick font_w, font_h);
124653889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
124753889Smckusick
124853889Smckusick key_str.key_length = spr(c_pos_mess, "c=(%d,%d), ",
124953889Smckusick char_w, char_h);
125053889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
125153889Smckusick
125253889Smckusick csr_pos(sp, LFT_M, (TOP_M - 1));
125353889Smckusick key_str.key_string = c_pos_mess;
125453889Smckusick key_str.key_length = spr(c_pos_mess, "p=(%d,%d), ",
125553889Smckusick ul_pos, ch_pos);
125653889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
125753889Smckusick key_str.key_length = spr(c_pos_mess, "s=(%d,%d), ",
125853889Smckusick scr_w, scr_h);
125953889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
126053889Smckusick
126153889Smckusick csr_pos(sp, LFT_M, (TOP_M - 2));
126253889Smckusick key_str.key_string = c_pos_mess;
126353889Smckusick key_str.key_length = spr(c_pos_mess, "o=(%d,%d), ",
126453889Smckusick x_ofst, y_ofst);
126553889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
126653889Smckusick key_str.key_length = spr(c_pos_mess, "m=(%d,%d)",
126753889Smckusick rit_m, btm_m);
126853889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
126953889Smckusick
127053889Smckusick cursor_on(&sp->s_csr.csr_p);
127153889Smckusick return;
127253889Smckusick case 'G':
127353889Smckusick line(parm);
127453889Smckusick return;
127553889Smckusick case 'C':
127653889Smckusick if (parm[0] >= 0) {
127753889Smckusick sp->s_plane = fbbm_get_pixel(consfb, parm[0]);
127853889Smckusick }
127953889Smckusick if (parm[1] >= 0) {
128053889Smckusick sp->s_bgcol = fbbm_get_pixel(consfb, parm[1]);
128153889Smckusick }
128253889Smckusick cursor_off();
128353889Smckusick if ((sp->s_csr.csr_attributes & REVERSE) ^
128453889Smckusick (sp->s_term_mode & DECSCNM)) {
128553889Smckusick fcolor = sp->s_bgcol;
128653889Smckusick bcolor = sp->s_plane;
128753889Smckusick }
128853889Smckusick else {
128953889Smckusick fcolor = sp->s_plane;
129053889Smckusick bcolor = sp->s_bgcol;
129153889Smckusick }
129253889Smckusick cursor_on(&sp->s_csr.csr_p);
129353889Smckusick return;
129453889Smckusick case 'T':
129553889Smckusick if (parm[0] < 0 || consfb->Mono)
129653889Smckusick return;
129753889Smckusick /*
129853889Smckusick * what value is defined on pallet N?
129953889Smckusick * put string in an_buf
130053889Smckusick */
130153889Smckusick *bp++ = '\033';
130253889Smckusick *bp++ = '~';
130353889Smckusick bp += itoa(bm_pallet_read(parm[0]), 10, bp);
130453889Smckusick *bp++ = 'a';
130553889Smckusick key_str.key_length = bp - an_buf;
130653889Smckusick key_str.key_string = an_buf;
130753889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
130853889Smckusick return;
130953889Smckusick case 't':
131053889Smckusick if (parm[0] >= 0 && !consfb->Mono) {
131153889Smckusick bm_pallet_write(parm[0],
131253889Smckusick (unsigned) parm[1] << 16
131353889Smckusick | (unsigned) parm[2] << 8
131453889Smckusick | (unsigned) parm[3]
131553889Smckusick );
131653889Smckusick }
131753889Smckusick return;
131853889Smckusick default:
131953889Smckusick return;
132053889Smckusick }
132153889Smckusick if (char_w < font_w) char_w = font_w;
132253889Smckusick if (char_h < font_h) char_h = font_h;
132353889Smckusick if (ch_pos > char_h - font_h) {
132453889Smckusick ch_pos = char_h - font_h;
132553889Smckusick ul_pos = char_h - 1;
132653889Smckusick }
132753889Smckusick if (rit_m > (scr_w - x_ofst)/char_w)
132853889Smckusick rit_m = (scr_w - x_ofst)/char_w;
132953889Smckusick if (btm_m > (scr_h - y_ofst)/char_h)
133053889Smckusick btm_m = (scr_h - y_ofst)/char_h;
133153889Smckusick sp->s_region.top_margin = TOP_M;
133253889Smckusick sp->s_region.btm_margin = btm_m;
133353889Smckusick font_r1.extent.x = font_w;
133453889Smckusick font_r1.extent.y = font_h;
133553889Smckusick font_r2.extent.x = font_w * 2;
133653889Smckusick font_r2.extent.y = font_h;
133753889Smckusick font_len1 = (font_w + 0x0f)>>4;
133853889Smckusick font_len2 = (font_w*2 + 0x0f)>>4;
133953889Smckusick cursor_off();
134053889Smckusick char_r1.extent.x = char_w;
134153889Smckusick char_r1.extent.y = char_h;
134253889Smckusick char_r2.extent.x = char_w * 2;
134353889Smckusick char_r2.extent.y = char_h;
134453889Smckusick csr_pos(sp, sp->s_csr.csr_x, sp->s_csr.csr_y);
134553889Smckusick sp->s_csr.csr_p.x = (sp->s_csr.csr_x - 1) * char_w + x_ofst;
134653889Smckusick sp->s_csr.csr_p.y = (sp->s_csr.csr_y - 1) * char_h + y_ofst;
134753889Smckusick cursor_on(&sp->s_csr.csr_p);
134853889Smckusick }
134953889Smckusick
135053889Smckusick /* VARARGS */
spr(s,fmt,ad,dummy)135153889Smckusick spr(s, fmt, ad, dummy)
135253889Smckusick register char *s, *fmt;
135353889Smckusick u_int ad;
135453889Smckusick {
135553889Smckusick register int b, c;
135653889Smckusick register u_int *adx = &ad;
135753889Smckusick char *base = s;
135853889Smckusick
135953889Smckusick for (;;) {
136053889Smckusick while ((c = *fmt++) != '%') {
136153889Smckusick *s++ = c;
136253889Smckusick if (c == '\0')
136353889Smckusick return (s - base - 1);
136453889Smckusick }
136553889Smckusick
136653889Smckusick c = *fmt++;
136753889Smckusick switch (c) {
136853889Smckusick
136953889Smckusick case 'x': case 'X':
137053889Smckusick b = 16;
137153889Smckusick goto number;
137253889Smckusick case 'd': case 'D':
137353889Smckusick b = 10;
137453889Smckusick goto number;
137553889Smckusick case 'o': case 'O':
137653889Smckusick b = 8;
137753889Smckusick number:
137853889Smckusick s += itoa(*adx, b, s);
137953889Smckusick break;
138053889Smckusick
138153889Smckusick case 'c':
138253889Smckusick *s++ = *adx;
138353889Smckusick break;
138453889Smckusick
138553889Smckusick case '%':
138653889Smckusick *s++ = c;
138753889Smckusick break;
138853889Smckusick }
138953889Smckusick adx++;
139053889Smckusick }
139153889Smckusick }
139253889Smckusick
139353889Smckusick static int pfn = -1;
139453889Smckusick static int active_buf = 0;
139553889Smckusick /*
139653889Smckusick * define the programable function keys and answer back message.
139753889Smckusick * the vt100 facilities do not contain this command!
139853889Smckusick * command sequence is as follows:
139953889Smckusick * "^[Pn|n1;n2;...;nmp" (normal mode)
140053889Smckusick * or
140153889Smckusick * "^[Pn|n1;n2;...;nmP" (shift mode)
140253889Smckusick * or
140353889Smckusick * "^[Pn|n1;n2;...;nmZ" (answer backe message)
140453889Smckusick * where, `n' denotes the decimal number asigned to function key,
140553889Smckusick * from `n1' to `nm' denote hexa number, finally,
140653889Smckusick * `p' , `E' or `Z' tells that the sequence has terminated.
140753889Smckusick * remark:
140853889Smckusick * when the terminator is `Z', the function number `n' can be omitted,
140953889Smckusick * and even though the number is specified, there is no affection to
141053889Smckusick * the result.
141153889Smckusick *
141253889Smckusick *
141353889Smckusick * ADDITION:
141453889Smckusick * there is a question: what strings are defined in programable function
141553889Smckusick * key of key-number n?
141653889Smckusick * in order to anwer this question, another escape sequence has appended.
141753889Smckusick * command sequence is as follows:
141853889Smckusick *
141953889Smckusick * "^[Pn|i" (normal mode)
142053889Smckusick * or
142153889Smckusick * "^[Pn|I" (shift mode)
142253889Smckusick *
142353889Smckusick * then the answer is
142453889Smckusick *
142553889Smckusick * "^[Pn|n1;n2;...;nmr" (normal mode)
142653889Smckusick * or
142753889Smckusick * "^[Pn|n1;n2;...;nmR" (shift mode)
142853889Smckusick *
142953889Smckusick */
esc_pf_define(sp,c)143053889Smckusick esc_pf_define(sp, c)
143153889Smckusick SCREEN *sp;
143253889Smckusick unsigned int c;
143353889Smckusick {
143453889Smckusick static bufc = 0;
143553889Smckusick
143653889Smckusick if (in_str(c, sp->s_estp->terminators)) {
143753889Smckusick pf_define(pfn, esc_bp - esc_buf + active_buf, c);
143853889Smckusick sp->s_current_stat &= ~ESCAPE;
143953889Smckusick active_buf = 0;
144053889Smckusick pfn = -1;
144153889Smckusick bufc = 0;
144253889Smckusick return;
144353889Smckusick }
144453889Smckusick /* buffering arguments */
144553889Smckusick if (bufc < ESC_BUF_SIZ) {
144653889Smckusick if (pfn < 0) {
144753889Smckusick if (c >= '0' && c <= '9') {
144853889Smckusick *esc_bp = *esc_bp *10 + (c - '0');
144953889Smckusick } else if (c == '|') {
145053889Smckusick pfn = *esc_bp;
145153889Smckusick *esc_bp = 0;
145253889Smckusick } else {
145353889Smckusick sp->s_current_stat &= ~ESCAPE;
145453889Smckusick active_buf = 0;
145553889Smckusick pfn = -1;
145653889Smckusick }
145753889Smckusick } else {
145853889Smckusick active_buf = 1;
145953889Smckusick if (c >= '0' && c <= '9') {
146053889Smckusick *esc_bp = *esc_bp * 16 + (c - '0');
146153889Smckusick } else if (c >= 'a' && c <= 'f') {
146253889Smckusick *esc_bp = *esc_bp * 16 + (c - 'a' + 10);
146353889Smckusick } else if (c >= 'A' && c <= 'F') {
146453889Smckusick *esc_bp = *esc_bp * 16 + (c - 'A' + 10);
146553889Smckusick } else if (c == ';') {
146653889Smckusick esc_bp++;
146753889Smckusick bufc++;
146853889Smckusick } else {
146953889Smckusick sp->s_current_stat &= ~ESCAPE;
147053889Smckusick pfn = -1;
147153889Smckusick active_buf = 0;
147253889Smckusick bufc = 0;
147353889Smckusick }
147453889Smckusick }
147553889Smckusick } else {
147653889Smckusick active_buf = 0;
147753889Smckusick }
147853889Smckusick }
147953889Smckusick
pf_define(pfn,length,terminator)148053889Smckusick pf_define(pfn, length, terminator)
148153889Smckusick int pfn;
148253889Smckusick int length;
148353889Smckusick unsigned int terminator;
148453889Smckusick {
148553889Smckusick register Pfk_string *pfk = &pfk_str;
148653889Smckusick register Key_string *kys = &pfk_str.pfk_string;
148753889Smckusick
148853889Smckusick if (terminator == 'Z')
148953889Smckusick return;
149053889Smckusick
149153889Smckusick if (pfn < 0 || pfn > N_PFK)
149253889Smckusick return;
149353889Smckusick if (terminator == 'i' || terminator == 'I') {
149453889Smckusick pf_answer(pfn, terminator);
149553889Smckusick return;
149653889Smckusick }
149753889Smckusick pfk->pfk_num = pfn ? pfn: 1;
149853889Smckusick pfk->pfk_shift = (terminator == 'p') ? PF_NORMAL: PF_SHIFT;
149953889Smckusick kys->key_length = length;
150053889Smckusick kys->key_string = esc_buf;
150153889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
150253889Smckusick }
150353889Smckusick
150453889Smckusick /*
150553889Smckusick * pf_answer(pfn, terminator)
150653889Smckusick * this routine answers what strings defined on pfn.
150753889Smckusick */
150853889Smckusick
150953889Smckusick char def_seq[ESC_BUF_SIZ];
151053889Smckusick
pf_answer(pfn,terminator)151153889Smckusick pf_answer(pfn, terminator)
151253889Smckusick int pfn;
151353889Smckusick unsigned int terminator;
151453889Smckusick {
151553889Smckusick register Pfk_string *pfk = &pfk_str;
151653889Smckusick register Key_string *kys = &pfk_str.pfk_string;
151753889Smckusick register char *bp = an_buf;
151853889Smckusick register char *p = def_seq;
151953889Smckusick register int length;
152053889Smckusick register int j;
152153889Smckusick
152253889Smckusick /*
152353889Smckusick * function key inquiry
152453889Smckusick * get string in def_seq
152553889Smckusick */
152653889Smckusick pfk->pfk_num = pfn ? pfn: 1;
152753889Smckusick pfk->pfk_shift = (terminator == 'i') ? PF_NORMAL: PF_SHIFT;
152853889Smckusick kys->key_length = ESC_BUF_SIZ;
152953889Smckusick kys->key_string = def_seq;
153053889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCGETS, pfk);
153153889Smckusick length = kys->key_length;
153253889Smckusick
153353889Smckusick /*
153453889Smckusick * function key answer
153553889Smckusick * put string in an_buf
153653889Smckusick */
153753889Smckusick *bp++ = '\033';
153853889Smckusick *bp++ = 'P';
153953889Smckusick bp += itoa(pfn, 10, bp);
154053889Smckusick *bp++ = '|';
154153889Smckusick key_str.key_length = bp - an_buf;
154253889Smckusick key_str.key_string = an_buf;
154353889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
154453889Smckusick
154553889Smckusick bp = an_buf;
154653889Smckusick if (length--) {
154753889Smckusick bp += itoa(*p++ & 0xff, 16, bp);
154853889Smckusick }
154953889Smckusick while (length > 0) {
155053889Smckusick for (j = 0; (j < 10) && (length-- > 0); j++) {
155153889Smckusick *bp++ = ';';
155253889Smckusick bp += itoa(*p++ & 0xff, 16, bp);
155353889Smckusick }
155453889Smckusick key_str.key_length = bp - an_buf;
155553889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, (int *)&key_str);
155653889Smckusick bp = an_buf;
155753889Smckusick }
155853889Smckusick *bp++ = (terminator == 'i') ? 'r': 'R';
155953889Smckusick key_str.key_length = bp - an_buf;
156053889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, (int *)&key_str);
156153889Smckusick }
156253889Smckusick
156353889Smckusick /*
156453889Smckusick * ignore
156553889Smckusick * esc_ignore(sp) is not called ordinally work.
156653889Smckusick */
esc_ignore(sp)156753889Smckusick esc_ignore(sp)
156853889Smckusick register SCREEN *sp;
156953889Smckusick {
157053889Smckusick sp->s_current_stat &= ~ESCAPE;
157153889Smckusick }
157253889Smckusick
157353889Smckusick static char *nmr = "0123456789abcdef";
157453889Smckusick /*
157553889Smckusick * itoa
157653889Smckusick * this routine converts binary to ascii decimal or hexa number
157753889Smckusick * according to mod.
157853889Smckusick */
157953889Smckusick static
itoa(n,mod,buf)158053889Smckusick itoa(n, mod, buf)
158153889Smckusick register int n;
158253889Smckusick register int mod;
158353889Smckusick register char *buf;
158453889Smckusick {
158553889Smckusick register int i = 0;
158653889Smckusick register int cnt;
158753889Smckusick int first = 1;
158853889Smckusick int k;
158953889Smckusick
159053889Smckusick n &= 0xffff;
159153889Smckusick for (cnt = mod*mod*mod*mod*mod*mod*mod; cnt > 0; cnt /= mod) {
159253889Smckusick k = n / cnt;
159353889Smckusick n -= k * cnt;
159453889Smckusick if (k == 0) {
159553889Smckusick if (first == 0) {
159653889Smckusick *buf++ = nmr[k];
159753889Smckusick i++;
159853889Smckusick }
159953889Smckusick } else {
160053889Smckusick *buf++ = nmr[k];
160153889Smckusick i++;
160253889Smckusick first = 0;
160353889Smckusick }
160453889Smckusick }
160553889Smckusick if (first == 1) {
160653889Smckusick *buf++ = '0';
160753889Smckusick i++;
160853889Smckusick }
160953889Smckusick return(i);
161053889Smckusick }
1611