xref: /csrg-svn/sys/news3400/bm/vt100esc.c (revision 63256)
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