[mod.sources] v06i068: VT100TOOL for Sun's

sources-request@mirror.UUCP (07/21/86)

Submitted by: linus!ell (Ed Lafferty)
Mod.sources: Volume 6, Issue 68
Archive-name: vt100tool/Part09

[  I generally dislike posting anything other than source code.  In this
   case, however, I'm making an exception because (a) there's no other
   way to do it; and (b) there is apparently a lot of demand for this
   program.  So, I took the object and data files in the fontdir and
   libdir directories and uuencode'd them.  The decode.sh script in the
   toplevel directory will uudecode them and remove the uu.xxx files;
   it lists the files by name, so you can check if you're missing
   something.  This comment will appear at the beginning of each of the
   postings of this program.  --r$  ]


#!/bin/sh
# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
# Wrapped by rs@mirror.UUCP on Thu Jul 17 00:22:14 EDT 1986
# Contents:  src/ttyvt100.c src/vt100keys.c MANIFEST
 
echo x - src/ttyvt100.c
sed 's/^XX//' > "src/ttyvt100.c" <<'@//E*O*F src/ttyvt100.c//'
XX#ifndef lint
XXstatic	char sccsid[] = "@(#)ttyvt100.c 1.16 86/06/25 Copyr 1985 MITRE Corp.";
XX#endif

XX/*
XX * Copyright (c) 1985 by MITRE Corporation
XX */

XX#include <stdio.h>
XX#include <pixrect/pixrect_hs.h>
XX#include <sunwindow/window_hs.h>
XX#include <signal.h>
XX#include <ctype.h>

XX#include <sys/ioctl.h>
XX#include <sun/fbio.h>
XX#include <sundev/kbio.h>
XX#include <sundev/kbd.h>

XX#undef DEBUG
XXint debug =  0;			/* to enable any debugging you must */
XXint debug2 = 0;			/* Define DEBUG and set one of the */
XXint debug1 = 0;			/* debug flags                     */
XXint debug4 = 0;
XXint debug3 = 0;
XXint debug5 = 0;
XXint debug6 = 0;
XXint debug7 = 0;
XXint debug8 = 0;
XX#include <sunwindow/cms_grays.h>
XX#include "ttysw_impl.h"
XX#include "ttyvt100.h"
XX#include "charimage.h"
XX#include "charscreen.h"
XX#define vanillaChar(c)	((c >= ' ') && (c <= '~'))
XXchar ansiCharBuf[CHAR_BUF_LEN];
XXextern struct pixwin *csr_pixwin;/* This is the ttysw windowfd */
XXextern struct pixfont *pixfont;		/* This is what csr_init uses ???? */
XXextern int chrwidth;
XXextern int right,top,bottom,left;
XXextern pstring(),bold(),nobold();
XXextern void init_kbd();


XX/* Logical state of window and program switches */
XXint  graf_norm, bold_norm;
XXint curscol = 0;	/* cursor column */
XXint cursrow = 0;	/* cursor row */
XXint state = ALPHA;	/* ALPHA,VT52, ESCBRKT, ESCBRKTQM, etc, */
XXint state1 = 0;			/* holds EATCHARS flag at last column */
XXint vl = 0;			/* accumulate vt52 first arg */
XXint ac = 0;	/* accumulates last arg in ESCBRKT sequences. 0-->1. */
XXint ac0 = 0;			/* ditto, but next to last arg.  0 ==> 1 */
XXint acinit = 0;			/* initial value of ac (with 0 left alone) */
XXint acinit0 = 0;			/*  ditto for first Pn */
XXint acm[10];    		/* array of parameters */
XXint ac_num = 0;			/* number of parms this time */
XXint scroll_top = 0;		/* definition of top of scrolling region */
XXint scroll_bottom = 23;		/* bottom of scrolling region */
XXint fillfunc = 0;		/* 1 -> boldf */
XXint underscore;         	/* 1 -> underscore */
XXint report = 0;			/* 1-7 if host asks for something */

XX/* dimensions of VT100 window */
XXint vtop = 0;			/* top row of vt100 window  */
XXint vbottom = 23;		/* bottom row of vt100 window */
XXint vleft = 0;			/* left column of vt100 window  */
XXint vright = 79;		/* right column of regular vt100 window */
XXint tabArray[MAX_SCREEN_WIDTH]; /* array for setting tabs */

XX/* VT100 mode variables */
XXint origin_mode = 0;		/* 0 == reset (screen upper left corner) */
XX                                /* 1 == set (upper -left within margins) */
XXint newline = 0;		/* also used by ttysw_main */
XXint local = 0;			/* 1 = local, 0 = online */
XXint cursor;			/* 0 -> NOCURSOR, 1 -> UNDERCURSOR, */
XX				/* 2 -> BLOCKCURSOR */
XXint curs_key = 0;		/*  ANSI cursor key mode [ or O*/
XXchar answer_message[31];	/* holds the answerback message */
XXint repeat = 0;			/* not implemented */
XXint interlace = 0;		/* not implemented */
XXint vt52mode = 0;		/* emulate a vt52 display */
XXint appl_key_ansi = 0;		/* ANSI application keypad mode */
XXint wrap = 0;			/* wrap at margin mode */
XXint big_screen = 0;		/* 132 col mode */
XXint smooth_scroll = 0;		/* not implemented */

XXint rev_screen = 0;		/* reverse initial setup BOW or WOB */
XXint alt_keypad_52 = 0;		/* vt52 keypad mode */
XXint half_chrwidth = 5;	/* for 132 col mode */
XXint full_chrwidth = 8;	/* for 80 col mode */
XXint twice_chrwidth = 16;	/* for 40 col modes */
XXint twelve_tenths_chrwidth = 10; /* for 66 col mode */
XXint  g0,g1;		/* to keep character set modes */
XXint  activeCharset = G0;	/* graf or asc */
XXint graph_52 = 0;	/* graphics vt52 mode flag */
XXchar charStr[2] = "c";		/* for writing a single character in vright */
XXchar *charNext;
XXchar *charBufMax;
XXint curscolStart;

XX/* we will keep a font designator for each character  */
XX/* so the repair routine will work. Also, need it for rewrite() */
XX 
XX/*
XX * Interpret a string of characters of length <len>.  Stash and restore
XX * the cursor indicator.
XX *
XX * Note that characters with the high bit set will not be recognized.
XX * This is good, for it reserves them for ASCII-8 X3.64 implementation.
XX * It just means all sources of chars which might come here must mask
XX * parity if necessary.
XX *
XX */
XXansiinit()
XX{
XX	int i;
XX	underscore = 0;
XX	curscol = vleft;
XX	cursrow = vtop;
XX/*	setupfullgraycolormap(); */
XX	for (i = 0; i < MAX_SCREEN_WIDTH; i++) tabArray[i] = 0;
XX	for (i = 0; i < MAX_SCREEN_WIDTH; i = i + 8)  tabArray[i]=1;

XX	g0 = ASC;
XX	g1 = GRAPH;
XX#ifdef DEBUG
XX	if (debug) printf( "to imageinit...\n");
XX#endif DEBUG
XX	imageinit();
XX	init_kbd();
XX	set_font(5);
XX	return(1);
XX}


XX/* compatibility kludge */
XXgfxstring(addr, len)
XX	char *addr;
XX	int len;
XX{
XX	extern struct ttysubwindow *_ttysw;
XX	if(len ==1 && *addr == '\014') /* map a ^L into vt100 clear */
XX	  {
XX	    addr = "\033[2J";
XX	    len = 4;
XX	  }
XX	ttysw_output(_ttysw, addr, len);
XX}

XXttysw_output(ttysw, addr, len0)
XX	struct ttysubwindow *ttysw;
XX	register char *addr;
XX	int len0;
XX{
XX	register char c;
XX	int i;
XX	register int len;
XX	char buffer[30];	/* put string to send back to host here */
XX	char string[30];
XX	removeCursor();
XX	for (len = len0; !ttysw->ttysw_frozen && len > 0; len--) {

XX				/* this is the main loop */
XX	c = *addr++;		/* Fetch next char from string */
XX				/*  and bump pointer */
XX	switch(state){

XX	case ALPHA:

XX		ac = 0;
XX		acinit = 0;
XX		acinit0 = 0;
XX		ac0 = 0;
XX		ac_num = 0;
XX		for (i=0; i<9; i++,acm[i]=0); /* clear parm array */

XX		switch (c) {	/* Do control characters first */
XX           		case '\000' :   break; /* null character */
XX			case '\005' :   answerback();		break;
XX			case CTRL(G):	blinkscreen();		break;
XX			case CTRL(H):	pos(curscol-1,cursrow);
XX#ifdef DEBUG
XX					if(debug)printf("backspace\n");
XX#endif DEBUG
XX					break;
XX			case CTRL(I):	
XX					for (i = curscol+1; i <= vright; i++){
XX					  if (tabArray[i])
XX					    {
XX					      pos(i,cursrow);
XX					      break;
XX					    }
XX					}
XX					if(i >= vright)
XX					  pos(vright, cursrow); 
XX					break;
XX				
XX			case CTRL(J):	/* linefeed */
XX			case CTRL(K):   /* VT interpret as LF */
XX			case CTRL(L):   /* FF   "        " "  */ 
XX					Index();
XX					break;

XX			case CTRL(M):	
XX					if(newline)
XX					  {
XX					    pos( 0,cursrow);
XX					    Index();
XX					  }
XX					else pos( 0, cursrow);
XX					break;
XX			case CTRL(N):   G1_select();
XX					break;
XX			case CTRL(O):   G0_select();
XX					break;
XX			case '\033':	state = ESCAPE;
XX					break;

XX		        			
XX			default:   /* c is likely a real alpha character */
XX					if (c < 32) break; /* guess not! */
XX					if(curscol > vright) /* means we have written into last column */
XX					  {
XX					    switch (wrap)
XX					      {
XX					      case 1:
XX						curscol = 0;
XX						pos(curscol,cursrow);
XX						Index();
XX						break;
XX					      case 0:                   /* eat the character */
XX						charStr[0] = c;
XX						writePartialLine(charStr,vright);
XX						reflections[cursrow][vright] =  marks[cursrow] + (fillfunc<<8);
XX						goto loopback;
XX					      }
XX					  }
XX					    
XX					    /* and now handle the normal case "curscol not vright" */
XX					curscolStart = curscol;	/* initialize for loop */
XX					charNext = &ansiCharBuf[0];
XX					*charNext = c; /* put character into output stream */
XX					charNext++;	   /* and bump stream pointer */
XX					marks[cursrow] |= BUSY;
XX					reflections[cursrow][curscol] =  marks[cursrow] + (fillfunc<<8);
XX					curscol++;   /* and bump column  */
XX					*charNext = '\0';
XX					writePartialLine(&ansiCharBuf[0], curscolStart); /* and write to screen  */
XX					break;		      
XX				      }
XX		break;

XX	case ESCAPELPRN:
XX		switch (c){
XX		case 'A': g0 = UK;
XX			  grafon();
XX			  if(activeCharset == G0) set_font(5);
XX			  break;
XX			  
XX		case '1':
XX		case '2':

XX		case 'B': g0 = ASC;
XX			  grafon();
XX			  if(activeCharset == G0) set_font(5);
XX			  break;
XX		case '0': g0 = GRAPH;
XX			  grafon();
XX			  if(activeCharset == G0) set_font(5);
XX			  break;
XX		default:  break;
XX			}
XX		state = ALPHA;
XX		break;
XX       case ESCAPERPRN:
XX		switch (c){
XX		case 'A': g1 = UK;
XX			  grafon();
XX			  if(activeCharset == G1) set_font(5);
XX			  break;
XX		case '1':
XX		case '2':
XX		case 'B': g1 = ASC;
XX			  grafon();
XX			  if(activeCharset == G1) set_font(5);
XX			  break;
XX		case '0': g1 = GRAPH;
XX			  grafon();
XX			  if(activeCharset == G1) set_font(5);
XX			  break;
XX		default:  break;
XX			}
XX		state = ALPHA;
XX		break;
XX        case ESCAPESHARP:
XX		switch (c){
XX		case '8': Escreen();
XX			  break;
XX		case '3': mark_top(cursrow);
XX			  break;
XX			  
XX		case '4': mark_bottom(cursrow);
XX			  break;
XX		case '5': clear_width(cursrow);
XX			  break;
XX		case '6': mark_wide(cursrow);
XX			  break;
XX		default:  break;
XX			}
XX		state = ALPHA;
XX		break;
XX				    

XX	case ESCBRKT:		/* esc[   accumulate parms */
XX	case ESCBRKTQM:		/* same logic for esc[? */
XX		if ('0' <= c && c <= '9') {
XX		   ac = ((char)ac)*10 + c - '0'; /* char for inline muls */
XX		   break;
XX		} else if (c == ';') {
XX			
XX			acm[ac_num] = ac;
XX			ac_num++;
XX			ac0 = ac; ac = 0;	/* for compat up */
XX			break;
XX		} else {
XX		  if(c != '?'){
XX		    acinit = ac;		/* got a alpha */
XX		    acinit0 = ac0;              /* default both Pns */
XX		    acm[ac_num] = ac;
XX		    ac_num++;
XX		    if(ac0 == 0 && ac != 0 && ac_num == 1)
XX		      {
XX			ac0 = ac; /* if only one then it isthe first */
XX			ac = 0;
XX		      }
XX		    if(ac0 == 0) ac0 = 1; /* default is 1 not 0 */
XX		    if(ac ==0) ac = 1;
XX#ifdef DEBUG
XX	if(debug) printf("acs %d %d %d %d\n",acinit,ac0,ac,ac_num);
XX#endif DEBUG
XX		  }
XX   if (state == ESCBRKT){
XX#ifdef DEBUG
XX   		if(debug) printf("in CSI %c sequence\n",c);
XX#endif DEBUG
XX	    switch ( c ) {
XX			case 'A':	pos(curscol,cursrow-ac0); 	break;
XX			case 'B':	pos(curscol,cursrow+ac0); 	break;
XX			case 'C':	pos(curscol+ac0,cursrow); 	break;
XX			case 'D':	pos(curscol-ac0,cursrow); 	break;
XX			case 'f':
XX			case 'H':	abs_pos(ac-1,ac0-1);
XX					break;
XX			case 'J':
XX			 switch(acinit){
XX			 	case 0:	cleol(cursrow);
XX					del_lines(cursrow+1,vbottom);
XX					clearMarks(cursrow+1,vbottom);
XX					set_font(5);
XX					break;
XX				case 1: del_char(vleft,curscol, cursrow);
XX					del_lines(vtop,cursrow-1);
XX					clearMarks(vtop,cursrow-1);
XX					set_font(5);
XX					break;
XX				case 2:
XX 				        del_lines(vtop,vbottom);
XX					clearMarks(vtop,vbottom);
XX					set_font(5);
XX					break;
XX				}
XX				break;
XX			case 'K':
XX			     switch(acinit){
XX			     	case 0:
XX				   cleol(cursrow);
XX				   break;
XX				case 1:
XX				   del_char( vleft, curscol,cursrow);
XX				   break;
XX				case 2:
XX				   del_char(vleft,curscol,cursrow);
XX				   cleol(cursrow);
XX				   break;
XX			       }
XX					break;
XX		      case '?': state = ESCBRKTQM;
XX					break;
XX/* for now just bold and nobold */
XX		      case 'm': /* attributes on/off */
XX				if(ac_num == 0)
XX				  {
XX				    acm[0] = acinit;
XX				    ac_num++;
XX				  }
XX				for( i = 0; i < ac_num; i++)
XX				  {
XX				    switch(acm[i]){
XX				    case 0:   All_off();
XX					      break;
XX				    case 1:   Bold_on();
XX					      break;
XX				    case 4:   Under_on();
XX					      break;
XX				    case 5:   Blink_on();
XX					      break;
XX				    case 7:   Reverse_on();
XX					      break;
XX					    }
XX				  }
XX#ifdef DEBUG				
XXif(debug4) printf("attributes %d %d %d %d %d\n", acm[0],acm[1],acm[2],acm[3],acm[4]);					
XX#endif DEBUG
XX				break;
XX/* reports coming up */						
XX			case 'c':	/*report what are you? */
XX					ttysw_input(_ttysw,"\033[?1;0c",7);
XX					break;
XX/* tabs  clear */
XX			case 'g':	if(acinit == 0 ) {
XX					  tabArray[curscol] = 0;
XX					  break;}
XX					if(acinit == 3){
XX                                        for(i = 0; i<= MAX_SCREEN_WIDTH-1;i++)
XX					    tabArray[i] = 0;}
XX					  break;
XX/* line feed mode set */
XX			case 'h':	if(acinit == 20) newline = 1;
XX									break;
XX/* line feed node reset */
XX			case 'l':	if(acinit == 20) newline = 0;
XX									break;
XX/* status requests from host */
XX                        case 'n':	if(acinit == 5)
XX			                 ttysw_input(_ttysw,"\033[0n",4);
XX				
XX                                	if(acinit == 6)
XX					  {
XX			    sprintf(string,"\033[%u;%uR",cursrow+1,curscol+1);
XX			    ttysw_input(_ttysw,string,strlen(string));
XX			  }
XX									break;
XX/* define scroll region for indexing */
XX			case 'r':	set_scroll_region(); break;
XX/* report terminal parameters */
XX			case 'x':	if(acinit == 0)
XX			  ttysw_input(_ttysw,"\033[2;1;1;112;112;1;0x",20);
XX					if(acinit == 1)
XX			  ttysw_input(_ttysw,"\033[3;1;1;112;112;1;0x", 20);		  
XX					break;
XX			case 'q':	/* led business - ignore */	break;

XX			}	/* end of ESCBRKT switch */
XX              if(state == ESCBRKT)  state = ALPHA;
XX		ac = 0;
XX		ac0 = 0;
XX		acinit = 0;
XX		acinit0 = 0;
XX		break;
XX		}		/* not  ESCBRKT must be [? */
XX	       	
XXif(state == ESCBRKTQM){		/* must be esc[? */
XX#ifdef DEBUG
XX			if(debug)printf("esc-[? %c\n",c);
XX#endif DEBUG
XX		switch (c){
XX		    case 'h':
XX			switch(acinit){
XX			    case 1:	curs_key = 1; break;
XX			    case 3:	big_screen = 1;
XX					vright = 131;
XX					del_lines(vtop,vbottom);
XX					clearMarks(vtop,vbottom);
XX					ac_num = 0;
XX					scroll_top = vtop;
XX					scroll_bottom = vbottom;
XX					pos(0,0);
XX					set_font(5);
XX					break;
XX			    case 4:	smooth_scroll=1;
XX					break;
XX					
XX			    case 5:	if(rev_screen==0){
XX			                rev_screen = 1;
XX					pblack_background();
XX				      }
XX					break;
XX			    case 6:	origin_mode=1;	
XX			    		pos(vleft,scroll_top);
XX					break;
XX			    case 7:	wrap = 1;	break;
XX			    case 8:	repeat = 1;	break;
XX			    case 9:	interlace=1;	break;
XX			    default: break;
XX			    }
XX			state = ALPHA;
XX			    break;
XX		    case 'l':
XX		        switch(acinit){
XX			    case 1:	curs_key = 0;	break;
XX                            case 2:     vt52mode = 1;
XX					wrap = 1;
XX					scroll_top = vtop;
XX					scroll_bottom = vbottom;
XX					break;
XX			    case 3:	big_screen=0;
XX					vright = 79;
XX					clearMarks(vtop,vbottom);
XX					del_lines(vtop,vbottom);
XX					ac_num = 0;
XX					scroll_top = vtop;
XX					scroll_bottom = vbottom;
XX					pos(0,0);
XX					set_font(5);
XX					break;
XX			    case 4:	smooth_scroll=0;
XX					break;
XX			    case 5:	if(rev_screen==1){
XX			                 rev_screen = 0;
XX				 	pwhite_background();
XX				       }
XX					break;
XX			    case 6:	origin_mode=0;	
XX			    		pos(vleft,vtop);
XX					break;
XX			    case 7:	wrap = 0;	break;
XX			    case 8:	repeat = 0;	break;
XX			    case 9:	interlace = 0;	break;
XX			    default:	break;
XX				      }
XX			state = ALPHA;
XX			break;
XX	            default: 	/* esc[? something unknown? */		    
XX			state = ALPHA;
XX			    break;
XX		    }		/* end of esc[? switch */
XX			state = ALPHA;
XX	    }			/* end of esc[? conditional */
XX      }				/* ends esc[ and esc[? section */
XX		ac = 0;
XX		ac0 = 0;
XX		acinit = 0;
XX		acinit0 = 0;

XX	    state = ALPHA;	/* following the ansi sequence, return to */
XX		break;		/* out of state switch */


XX	      case ESC52Y:	/* gather next 2 chars */
XX		if(vl) {
XX		  pos( c - '\040',vl - '\040');
XX#ifdef DEBUG
XX		  if(debug1)printf("vt52 position %d %d\n",vl-'\40',c-'\40');
XX#endif DEBUG
XX		  vl = 0;
XX		  state = ALPHA;
XX		  break;
XX		}
XX		else {
XX		  vl = c;
XX		  break;
XX		}
XX		break;

XX	      case ESCAPE:	
XX#ifdef DEBUG
XX			if(debug)printf("escape-%c\n",c);
XX#endif DEBUG
XX		if(vt52mode) {
XX		             scroll_top = vtop;
XX			     scroll_bottom = vbottom;
XX		  switch (c) {
XX		  case 'A':  pos(curscol,--cursrow); break;
XX                  case 'B':  pos(curscol,++cursrow); break;
XX		  case 'C':  pos(++curscol,cursrow); break;
XX		  case 'D':  pos(--curscol,cursrow); break;
XX                  case 'F':  graph_52 = 1;           break;
XX		  case 'G':  graph_52 = 0;           break;
XX		  case 'H':  pos(0,0);               break;
XX		  case 'I':  Rindex();               break;
XX                  case 'J':  cleol(cursrow);
XX			     del_lines(cursrow+1,vbottom);
XX			     break;
XX                  case 'K':  cleol(cursrow);
XX			     break;
XX		  case 'Y':  state = ESC52Y;
XX			     vl = 0;
XX			     break;
XX                  case 'Z':  ttysw_input(_ttysw,"\033/Z",3);
XX			     break;
XX                  case '<':  vt52mode = 0;
XX			     break;
XX                  case '>':  alt_keypad_52 = 0;
XX			     break;
XX                  case '=':  alt_keypad_52 = 1;
XX  			     break;
XX                  case '1':  graph_52 = 1;
XX			     break;
XX                  case '2':  graph_52 = 0;
XX			     break;
XX			   }
XX		  if (state == ESCAPE) state = ALPHA;
XX		  break;
XX		}
XX		else

XX		switch (c) { 
XX			/* detect esc left bracket */
XX			case '[':	
XX					state = ESCBRKT;
XX					break;

XX			case 'D':       Index();		break;
XX			case 'E':	pos(0,cursrow);
XX					Index();
XX								break;
XX			case 'H':	tabArray[curscol] = 1;
XX#ifdef DEBUG
XX				if(debug)printf("tab set at %d\n",curscol);
XX#endif DEBUG
XX								break;
XX			case 'M':	Rindex();		break;
XX			case 'Z':       ttysw_input(_ttysw,"\033[?1;0c",7);
XX					break;
XX			case '7':	Save_cursor();		break;
XX			case '8':	Restore_cursor();	break;
XX			case '(': 	/* G0 char set designator */
XX				state = ESCAPELPRN;
XX				    break;

XX			case ')':  /* G1 char set designator */
XX				    state = ESCAPERPRN;	
XX				    break;
XX				    
XX			case '#':  /*  large char controls */
XX			         state = ESCAPESHARP;
XX					break;

XX			case '1':	/* set graphics option */
XX					break;
XX					
XX			
XX			case '2':	/* graphics off */
XX					break;
XX					
XX			case '=':	appl_key_ansi = 1;
XX					break;
XX					
XX			case '>':	appl_key_ansi = 0;
XX					break;
XX					
XX			case 'c':	/* reset power up */
XX					reset();
XX					break;
XX					
XX					

XX	/* By default, ignore the character after the ESC */
XX			default:	state = ALPHA;
XX					break;
XX		}		/* end plain escape sequence */
XX		ac = 0;
XX		ac0 = 0;
XX		acinit = 0;
XX		acinit0 = 0;
XX		if(state == ESCAPE) state = ALPHA;
XX		break;
XX		  
XX	      default:		/* for state switch */
XX				/* don't think we ever get here */
XX			state = ALPHA;
XX			cursor = BLOCKCURSOR;
XX			break;
XX	      }			/* end of state switch */
XX      loopback: continue;

XX      }				/* end of while loop */
XX	    			/* get next character from input */
XX/* Finished all input. If we have been asked for a  report return */
XX/* appropriate message as function value (hope not much has followed) */
XX/* EndOuterLoop: */
XX	drawCursor( cursrow, curscol );
XX	return(len0);

XX}


XXpos(col, row)
XX	int col, row;
XX{
XX  int orow;
XX	if (col <= vleft)
XX		col = vleft;
XX	if (col >= vright)
XX		col = vright;
XX			/* mimic vt100 scrolling region anomaly */
XX	if (row <= scroll_top && cursrow >=  scroll_top)
XX		row = scroll_top;
XX	if (row >=scroll_bottom && cursrow <=  scroll_bottom)
XX		row = scroll_bottom;
XX	orow = cursrow;
XX#ifdef DEBUG
XX  if(row < 0) trap();
XX  if(debug7) if (col == 0) printf("POS %d: %s\n",row, image[row]);
XX#endif
XX  if(row < 0)row = 0;

XX	cursrow = row;
XX	curscol = col;
XX	vpos(row, col); 	/* assume 0,0 upper left for SunW */
XX	check_marks(row,orow);
XX}




XXset_scroll_region()
XX{
XX#ifdef DEBUG
XXif(debug3) printf("entering set_scroll_region %d %d %d\n", acinit, ac, ac0);
XX#endif DEBUG
XXif (ac_num == 0 || ac_num == 1 ||(ac_num == 2 && ac == ac0 && ac == 1)) {
XX  
XX/* default :: reset to whole screen */
XX	scroll_top = vtop;
XX	scroll_bottom = vbottom;
XX	pos(0,0);
XX	return; 
XX	 }
XXelse				/* set scroll region from pars */
XXif(ac > ac0) {
XX	scroll_top = ac0-1;	/* scroll region start */
XX	scroll_bottom = ac-1;	/*  "       "    end */
XX	pos( 0,origin_mode?scroll_top:0);
XX	}
XX#ifdef DEBUG
XXif (debug3) printf("scroll region %d  %d", scroll_top, scroll_bottom);
XX#endif DEBUG
XX}

XXIndex()
XX{

XX/* if not at bottom of region, then just move down one line */
XX#ifdef DEBUG
XX    if(debug)printf("Index called %d %d\n",curscol,cursrow);
XX#endif DEBUG
XX    if (cursrow != scroll_bottom) {
XX    	pos(curscol,cursrow+1);
XX	return;
XX	}
XX    if (cursrow == scroll_bottom) {
XX      scroll_up();
XX      shiftMarksUp();
XX      check_marks(cursrow,cursrow-1);
XX    }
XX}

XXRindex()
XX{
XX#ifdef DEBUG
XX    if(debug)printf("Rindex called %d %d\n",curscol,cursrow);
XX#endif DEBUG
XX/* if not at top of scroll region, then just move up a line */
XX    if (cursrow !=  scroll_top) {
XX    	pos(curscol,cursrow-1);
XX	return;
XX	}
XX    if (cursrow == scroll_top) {
XX      scroll_down();
XX      shiftMarksDown();
XX      check_marks(cursrow,cursrow+1);
XX    }

XX}

XX/* Scroll up one line at the cursor position -- happens on LF at
XXbottom of the screen or when ESC-E or D commands step at bottom 
XXmargin -- also linefeed at bottom margin if margins set */
XXscroll_up()
XX{
XX  int otop = top;
XX  int obottom = bottom;
XX  top = scroll_top;
XX  bottom = scroll_bottom;
XX  scroll1up(top,bottom);
XX  top = otop;
XX  bottom = obottom;

XX}

XXscroll_down()			/* Same as up except that we have to  */
XX{				/* get rid of lines off bottom of screen */
XX  int otop = top;
XX  int obottom = bottom;
XX  top = scroll_top;
XX  bottom = scroll_bottom;
XX  scroll1dn(top, bottom);
XX  top = otop;
XX  bottom = obottom;

XX}

XXint ocursrow, ocurscol, obold, ocharset,og0,og1;
XX    
XXSave_cursor()
XX{
XX    ocursrow = cursrow;
XX    ocurscol = curscol;
XX    obold = fillfunc;
XX    ocharset = activeCharset;
XX    og0 = g0;
XX    og1 = g1;
XX    
XX}

XXRestore_cursor()
XX{
XX    cursrow = ocursrow;
XX    curscol = ocurscol;
XX    fillfunc = obold;
XX    if(fillfunc & BOLD) Bold_on();
XX    if(fillfunc & UNDER) Under_on();
XX    if(fillfunc & REVERSE)  Reverse_on();
XX    activeCharset = ocharset;
XX    grafon();
XX    g0 = og0;
XX    g1 = og1;
XX    set_font(5);
XX    
XX}

XXchar * estring = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE";


XXEscreen()
XX{
XX    int i = 0;
XX    newline = 0;
XX    origin_mode = 0;
XX    wrap = 1;
XX    curscol = 0;
XX    cursrow = 0;
XX    scroll_top = 0;
XX    scroll_bottom = 23;
XX    del_lines(vtop,vbottom);
XX    clearMarks(vtop,vbottom);
XX    estring[vright+1] = '\0';
XX    while (i <= vbottom){
XX          pos(0,i);
XX	  writePartialLine(estring,0);
XX	  i++;
XX      }
XX    estring[vright+1] = 'E';
XX    pos(0,0);
XX  }
XX  


XXanswerback()
XX{
XX  ttysw_input(_ttysw,answer_message,strlen(answer_message));
XX}


XXreset()
XX{
XX  newline = 0;
XX  wrap = 1;
XX  origin_mode = 0;
XX  big_screen = 0;
XX  curscol = 0;
XX  cursrow = 0;
XX  fillfunc = 0;
XX  scroll_top = 0;
XX  scroll_bottom = 23;
XX  del_lines(vtop,vbottom);
XX  clearMarks(vtop,vbottom);
XX  vt52mode = 0;
XX  set_font(5);
XX  pos(curscol,cursrow);
XX}
XXchar* blanks = "                                                                                                                                       ";
XXdel_lines(from,to)
XXint from,to;
XX{
XX  int i, inverse;
XX  int savec = curscol;
XX  int savel = cursrow;
XX#ifdef DEBUG
XX  if(debug) printf("deleting from %d to %d\n",from, to);
XX#endif DEBUG
XX  inverse = fillfunc & REVERSE;
XX  nobold();
XX  blanks[vright+1] = '\0';
XX  for(i= from; i<=to; i++)
XX    {
XX     pos(0,i);
XX/*     writePartialLine(blanks,0); */
XX     vsetlinelength(image[i],0);
XX   }
XX  pclearscreen(from, to+1);
XX  blanks[vright +1] = ' ';
XX  if(inverse) bold();
XX  pos(savec,savel);
XX}

XXchar buf[MAX_SCREEN_WIDTH];	    


XX/* Writes blanks into line and keeps cursor at original position */

XXdel_char(from,to,row)
XXint from,to,row;
XX{
XX  int savec,savel,inverse;
XX  register i = to - from +1;
XX  savec = curscol;
XX  savel = cursrow;
XX  nobold();
XX  cursrow = row;
XX  blanks[i] = '\0';
XX  writePartialLine(blanks, from);
XX  blanks[i] = ' ';
XX  if(fillfunc & REVERSE) bold(); /* restore reverse if set */
XX  pos(savec,savel);		
XX}

XXcleol(row)
XXint row;
XX{
XX  int i;
XX  del_char(curscol, vright, row);
XX  vsetlinelength(image[row],curscol);

XX}


XX      

XX/*special routine for vt100 abs cursor position  */

XXabs_pos(col,row)
XXint row, col;
XX{
XX  int srow;
XX  int orow;
XX  orow = cursrow;
XX  if (origin_mode){
XX    srow = row + scroll_top;
XX    if(srow > scroll_bottom) srow = scroll_bottom;
XX  }
XX  else srow = row;
XX  curscol = col;
XX  cursrow = srow;

XX#ifdef DEBUG
XX  if(cursrow < 0 ) trap();
XX  if(debug)printf("moving to col %d, row %d \n",col,srow);
XX#endif DEBUG
XX  vpos(srow,col);
XX  check_marks(cursrow,orow);
XX}

XXtrap(){}
XX  
XXpwhite_background()
XX{
XX/*  pw_blackonwhite(csr_pixwin, 0,1); */
XX  pw_writebackground(csr_pixwin, 0 , 0,
XX		     winwidthp, winheightp, PIX_NOT(PIX_DST)); 


XX      }

XXpblack_background()
XX{
XX/*  pw_whiteonblack(csr_pixwin,0,1); */
XX  pw_writebackground(csr_pixwin, 0, 0,
XX		     winwidthp, winheightp, PIX_NOT(PIX_DST));
XX}

XXmark_top(row)			/* top of double height row */
XXint row;
XX{
XX  int i;
XX  marks[row] &= ~ BOTTOM_F;
XX  marks[row] |= TOP_F|WIDE_F;
XX  for (i = 0; i <= 131; i++){
XX    reflections[row][i] &= ~ BOTTOM_F;
XX    reflections[row][i] |= TOP_F|WIDE_F ;
XX  }
XX  if(length(image[row]) > big_screen ? 66 : 40)
XX    vsetlinelength(image[row],big_screen ? 66 : 40);
XX  rewrite(row);
XX}


XXmark_bottom(row)		/* bottom of double height row */
XXint row;
XX{
XX  int i;
XX  marks[row] &= ~ TOP_F;
XX  marks[row] |= BOTTOM_F|WIDE_F;
XX  for (i = 0; i <= 131; i++)
XX    {
XX      reflections[row][i] &= ~TOP_F;
XX      reflections[row][i] |= BOTTOM_F|WIDE_F;
XX    }
XX  if(length(image[row]) > big_screen ? 66 : 40)
XX    vsetlinelength(image[row],big_screen ? 66 : 40);
XX  rewrite(row);
XX}


XXclear_width(row)		/* set row to non-widte ype */
XXint row;
XX{
XX  int i;
XX  marks[row] &= ~(WIDE_F|TOP_F|BOTTOM_F);
XX  for (i = 0; i <= 131; i++)
XX    {
XX      reflections[row][i] &= ~(WIDE_F|TOP_F|BOTTOM_F);
XX    }
XX  
XX  rewrite(row);		
XX}


XXmark_wide(row)		/* double width -single height row */
XXint row;
XX{
XX  int i;
XX  marks[row] &= ~(BOTTOM_F|TOP_F);
XX  marks[row] |= WIDE_F;
XX  for (i = 0; i <= 131; i++)
XX    {
XX      reflections[row][i] &= ~(BOTTOM_F|TOP_F);
XX      reflections[row][i] |= WIDE_F;
XX    }
XX  if(length(image[row]) > big_screen ? 66 : 40)
XX    vsetlinelength(image[row],big_screen ? 66 : 40);
XX  rewrite(row);
XX}


XXG0_select()
XX{
XX#ifdef DEBUG
XX  if(debug4) printf("selecting G0 font which is %d\n",G0);
XX#endif
XX  activeCharset = G0;
XX  set_font(5);
XX  return;
XX}

XXG1_select()
XX{
XX#ifdef DEBUG
XX  if(debug4) printf("selecting G1 font which is %d\n", G1);
XX#endif
XX  activeCharset = G1;
XX  set_font(5);
XX  return;
XX}









XXshiftMarksUp()			/* LF or Index has dropped top line */
XX{
XX  int i,j;			
XX  for(i = scroll_top; i < scroll_bottom; i++)
XX    {
XX      marks[i] = marks[i+1];
XX      for (j = 0; j < 132; j++) reflections[i][j] = reflections[i+1][j];
XX    }
XX  marks[scroll_bottom] = big_screen ? NARROW_F : NORMAL_F;/* New line is 80 or 132 cols */
XX  for (j = 0 ; j < 132; j++) reflections[scroll_bottom][j] = marks[scroll_bottom];
XX}
XX	
XXshiftMarksDown()	/* scroll down has removed bottom line */
XX{	
XX  int i,j;
XX  for ( i = scroll_bottom; i > scroll_top; i--)
XX    {
XX      marks[i] = marks[i-1];
XX      for ( j = 0; j < 132; j++) reflections[i][j] = reflections[i-1][j];
XX    }
XX  marks[scroll_top] = big_screen ? NARROW_F : NORMAL_F;
XX  for(j = 0; j < 132; j++) reflections[scroll_top][j] = marks[scroll_top];
XX}

XXclearMarks(from,to)
XXint from,to;
XX{
XX  int i,j;
XX  for(i = from; i <= to ; i++)
XX    {
XX      marks[i] =big_screen ? NARROW_F : NORMAL_F;
XX      for (j = 0; j< 132; j++) reflections[i][j] = marks[i];
XX    }

XX}

XX  
XXAll_off()			/* turn off all attributes */
XX{
XX#ifdef DEBUG
XX  if(debug4) printf("All_off entered\n");
XX#endif
XX  fillfunc = 0;
XX  underscore = 0;
XX  nobold();
XX  set_font(5);
XX}

XXBold_on()
XX{
XX#ifdef DEBUG
XX  if(debug4) printf("Bold_on entered\n");
XX#endif
XX  fillfunc |= BOLD;  
XX  set_font(5);

XX}

XXReverse_on()
XX{
XX#ifdef DEBUG
XX  if(debug4) printf("Reverse_on entered\n");
XX#endif
XX  fillfunc |= REVERSE;
XX  bold();
XX}
XXBlink_on()			/* can't figure out how to do this */
XX{
XX  fillfunc |= BLINK;
XX}

XXUnder_on()
XX{
XX  underscore = 1;
XX  fillfunc |= UNDER;
XX}


XXscroll1up(tp,bm)
XXint tp,bm;
XX{
XX  int i;
XX  char *line;
XX  swapregions ( tp , tp + 1, bm - tp);
XX  line = image[bm];
XX  for(i = 0; i <= right; i++) line[i] = ' ';
XX  vsetlinelength(image[bm],0);
XX/*  pcopyscreen(tp+1,tp,bm-tp);  */
XX  pw_copy(csr_pixwin, col_to_x(vleft), row_to_y(tp), winwidthp,
XX	  row_to_y(bm -tp), PIX_SRC,
XX	  csr_pixwin, col_to_x(vleft), row_to_y(tp + 1));
XX  pclearline(left,right, bm);
XX  
XX}
XXscroll1dn(tp,bm)
XXint tp,bm;
XX{
XX  int i,k;
XX  char *line;
XX  swapnregions(bm, bm - 1,bm - tp);
XX  line = image[tp];
XX  for(i = 0; i <= right; i++) line[i] = ' ';
XX  vsetlinelength(image[tp],0);
XX/*  pcopyscreen(tp, tp+1, bm-tp);*/
XX  pw_copy(csr_pixwin, col_to_x(vleft), row_to_y(tp+1), winwidthp,
XX	  row_to_y(bm -tp), PIX_SRC,
XX	  csr_pixwin, col_to_x(vleft), row_to_y(tp));
XX  
XX  pclearline(left,right,tp);
XX}



XXswapnregions(a, b, n)		/* move block down */
XX	int a, b, n;
XX{
XX	while (n--)
XX		swap(a--, b--);
XX}

XXint
XXsetupfullgraycolormap()

XX{


XX	register u_char	red[CMS_GRAYSSIZE], green[CMS_GRAYSSIZE],
XX	    blue[CMS_GRAYSSIZE]; 
XX	register i;

XX	/*
XX	 * Initialize to gray cms.
XX	 */
XX/*	pw_setcmsname(csr_pixwin, CMS_GRAYS); */
XX	cms_grayssetup(red,green,blue);
XX	pw_putcolormap(csr_pixwin, 0, CMS_GRAYSSIZE, red, green, blue);
XX	return(CMS_GRAYSSIZE);
XX}


@//E*O*F src/ttyvt100.c//
chmod u=r,g=r,o=r src/ttyvt100.c
 
echo x - src/vt100keys.c
sed 's/^XX//' > "src/vt100keys.c" <<'@//E*O*F src/vt100keys.c//'
XX#ifndef lint
XXstatic	char sccsid[] = "@(#)vt100keys.c 1.6 86/04/11 Copyr 1985 MITRE Corp";
XX#endif

XX/*
XX * Copyright (c) 1985 by MITRE Corporation
XX */

XX#include <stdio.h>
XX#include <pixrect/pixrect_hs.h>
XX#include <sunwindow/window_hs.h>
XX#include <signal.h>
XX#include <ctype.h>

XX#include <sys/ioctl.h>
XX#include <sun/fbio.h>
XX#include <sundev/kbio.h>
XX#include <sundev/kbd.h>
XX#include "ttyvt100.h"
XX#include "charimage.h"
XX#include "charscreen.h"
XXextern int vt52mode, curs_key,alt_keypad_52,appl_key_ansi;
XX/* This routine takes function keys and converts to vt100 key-strings */
XX/* These depend on the mode settings: */
XX/* CURSOR KEYS: */
XX/* vt52_mode */
XX/* ANSI mode && curs_key mode */
XX/* ANSI mode && not curs_key mode */
XX/* AUXILIARY KEYPAD: */
XX/* vt52mode && numeric */
XX/* vt52mode && application */
XX/* ANSI && numeric */
XX/* ANSI && application */
XX/********************************* */
XXextern int newline;

XXchar *
XXtranslate_key(code)
XXint code;
XX{
XX  int flag = 0;
XX  int flagc = 0;
XX  /*  Now set up from mode flags: */
XX  flagc = vt52mode;		/* that's a 1 0r 0 */

XX#ifdef DEBUG
XXif(debug2)printf("entered translate with %d\n",code);
XX#endif DEBUG

XX  if(!vt52mode)  flagc = 2 + curs_key; /* makes it 2 or 3 */
XX  if(vt52mode && alt_keypad_52) flag = APPL5;
XX  if(vt52mode && !alt_keypad_52)flag = NUMER5;
XX  if(!vt52mode && appl_key_ansi) flag = APPLA;
XX  if(!vt52mode && !appl_key_ansi) flag = NUMERA;
XX  switch(code){
XX    /* Left panel except L1 which */
XX    /* is the hardware abort control (when combined with "a")*/
XX  case   KEY_LEFT(2):       
XX  case   KEY_LEFT(3):       
XX  case   KEY_LEFT(4):       
XX  case   KEY_LEFT(5):       
XX  case   KEY_LEFT(6):       
XX  case   KEY_LEFT(7): 
XX  case   KEY_LEFT(8):
XX  case   KEY_LEFT(9):
XX  case   KEY_LEFT(10): return("");

XX    /* right panel but not the cursor keys yet */
XX    /* we will use all 15 as keypad PF1--15*/

XX  case   KEY_RIGHT(1): /* PF1 */
XX		  switch(flag){
XX		  case NUMER5: return("\033P");
XX		  case NUMERA: return("\033OP");
XX		  case APPL5:  return("\033P");
XX		  case APPLA:  return("\033OP");
XX		  default:  break;
XX			  }
XX		  return("");
XX  case   KEY_RIGHT(2): /* PF2 */
XX		  switch(flag){
XX		  case NUMER5: return("\033Q");
XX		  case NUMERA: return("\033OQ");
XX		  case APPL5:  return("\033Q");
XX		  case APPLA:  return("\033OQ");
XX		  default:  break;
XX			  }
XX		  return("");
XX  case   KEY_RIGHT(3): /* PF3 */
XX		  switch(flag){
XX		  case NUMER5: return("\033R");
XX		  case NUMERA: return("\033OR");
XX		  case APPL5:  return("\033R");
XX		  case APPLA:  return("\033OR");
XX		  default:  break;
XX			  }
XX		  return("");
XX  case   KEY_RIGHT(4): /*  7  */
XX		  switch(flag){
XX		  case NUMER5: return("7");
XX		  case NUMERA: return("7");
XX		  case APPL5:  return("\033?w");
XX		  case APPLA:  return("\033Ow");
XX		  default:  break;
XX			  }
XX		  return("");
XX  case   KEY_RIGHT(5): /*  8  */
XX		  switch(flag){
XX		  case NUMER5: return("8");
XX		  case NUMERA: return("8");
XX		  case APPL5:  return("\033?x");
XX		  case APPLA:  return("\033Ox");
XX		  default:  break;
XX			  }
XX		  return("");
XX  case   KEY_RIGHT(6): /*  9  */
XX                  switch(flag){
XX		  case NUMER5: return("9");
XX		  case NUMERA: return("9");
XX		  case APPL5:  return("\033?y");
XX		  case APPLA:  return("\033Oy");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_RIGHT(7): /*  4  */
XX		  switch(flag){
XX		  case NUMER5: return("4");
XX		  case NUMERA: return("4");
XX		  case APPL5:  return("\033?t");
XX		  case APPLA:  return("\033Ot");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_RIGHT(8): /*  5  */
XX		  switch(flag){
XX		  case NUMER5: return("5");
XX		  case NUMERA: return("5");
XX		  case APPL5:  return("\033?u");
XX		  case APPLA:  return("\033Ou");
XX		  default:  break;
XX			  }
XX		  return("");


XX  case   KEY_RIGHT(9): /*  6  */
XX		  switch(flag){
XX		  case NUMER5: return("6");
XX		  case NUMERA: return("6");
XX		  case APPL5:  return("\033?v");
XX		  case APPLA:  return("\033Ov");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_RIGHT(10): /* 1  */
XX		  switch(flag){
XX		  case NUMER5: return("1");
XX		  case NUMERA: return("1");
XX		  case APPL5:  return("\033?q");
XX		  case APPLA:  return("\033Oq");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_RIGHT(11): /* 2  */
XX		  switch(flag){
XX		  case NUMER5: return("2");
XX		  case NUMERA: return("2");
XX		  case APPL5:  return("\033?r");
XX		  case APPLA:  return("\033Or");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_RIGHT(12): /* 3  */
XX		  switch(flag){
XX		  case NUMER5: return("3");
XX		  case NUMERA: return("3");
XX		  case APPL5:  return("\033?s");
XX		  case APPLA:  return("\033Os");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_RIGHT(13): /* 0  */
XX		  switch(flag){
XX		  case NUMER5: return("0");
XX		  case NUMERA: return("0");
XX		  case APPL5:  return("\033?p");
XX		  case APPLA:  return("\033Op");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_RIGHT(14): /* .  */
XX		  switch(flag){
XX		  case NUMER5: return(".");
XX		  case NUMERA: return(".");
XX		  case APPL5:  return("\033?n");
XX		  case APPLA:  return("\033On");
XX		  default:  break;
XX			  }
XX		  return("");


XX  case   KEY_RIGHT(15): /*ENTER*/
XX		  switch(flag){
XX		  case NUMERA:  
XX		  case NUMER5: if(newline)
XX		                  return("\r\n");
XX			       else return("\r");
XX		  case APPL5:  return("\033?M");
XX		  case APPLA:  return("\033OM");
XX		  default:  break;
XX			  }
XX		  return("");

XX    /* Top panel */
XX  case   KEY_TOP(1):      return("");
XX  case   KEY_TOP(2):      return("");
XX  case   KEY_TOP(3): /*  UP   */ 
XX		  switch(flagc){
XX		  case 1: return("\033A");
XX		  case 2: return("\033[A");
XX		  case 3:  return("\033OA");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_TOP(4): /* DOWN  */
XX		  switch(flagc){
XX		  case 1: return("\033B");
XX		  case 2: return("\033[B");
XX		  case 3:  return("\033OB");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_TOP(5): /* LEFT  */
XX		  switch(flagc){
XX		  case 1: return("\033D");
XX		  case 2: return("\033[D");
XX		  case 3:  return("\033OD");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_TOP(6): /* RIGHT */
XX		  switch(flagc){
XX		  case 1: return("\033C");
XX		  case 2: return("\033[C");
XX		  case 3:  return("\033OC");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_TOP(7): /* PF4   */
XX		  switch(flag){
XX		  case NUMER5: return("\033S");
XX		  case NUMERA: return("\033OS");
XX		  case APPL5:  return("\033S");
XX		  case APPLA:  return("\033OS");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_TOP(8): /*-(dash)*/
XX		  switch(flag){
XX		  case NUMER5: return("-");
XX		  case NUMERA: return("-");
XX		  case APPL5:  return("\033?m");
XX		  case APPLA:  return("\033Om");
XX		  default:  break;
XX			  }
XX		  return("");

XX  case   KEY_TOP(9): /*,comma */
XX		  switch(flag){
XX		  case NUMER5: return(",");
XX		  case NUMERA: return(",");
XX		  case APPL5:  return("\033?l");
XX		  case APPLA:  return("\033Ol");
XX		  default:  break;
XX			  }
XX		  return("");
XX    default: return("");
XX	      }
XX}



XX/* This code puts the keyboard into a form that we can use all */
XX/*  the keys as PF-keys as a vt100; i.e. disables the arrow notion */
XX/*  on the keypad. Keys will transmit standard SUN-2 keyboard codes.*/

XX#define		MAX_keydefs	(sizeof (k_board)/sizeof (*k_board))
XXint     fbdes,
XX        kb;



XXstruct fbtype   fb;
XXstruct key_id_num {
XX	char *name;
XX	int id_num;
XX	} k_board [] = {
XX	{"'", 87},
XX	{",", 107},
XX	{"-", 40},
XX	{".", 108},
XX	{"/", 109},
XX	{"0", 39},
XX	{"1", 30},
XX	{"2", 31},
XX	{"3", 32},
XX	{"4", 33},
XX	{"5", 34},
XX	{"6", 35},
XX	{"7", 36},
XX	{"8", 37},
XX	{"9", 38},
XX	{";", 86},
XX	{"=", 41},
XX	{"break", 19},
XX	{"bs", 43},
XX	{"del", 66},
XX	{"esc", 29},
XX	{"l1", 1},
XX	{"l10", 97},
XX	{"l2", 3},
XX	{"l3", 25},
XX	{"l4", 26},
XX	{"l5", 49},
XX	{"l6", 51},
XX	{"l7", 72},
XX	{"l8", 73},
XX	{"l9", 95},
XX	{"lf", 111},
XX	{"r1", 21},
XX	{"r10", 91},
XX	{"r11", 92},
XX	{"r12", 93},
XX	{"r13", 112},
XX	{"r14", 113},
XX	{"r15", 114},
XX	{"r2", 22},
XX	{"r3", 23},
XX	{"r4", 45},
XX	{"r5", 46},
XX	{"r6", 47},
XX	{"r7", 68},
XX	{"r8", 69},
XX	{"r9", 70},
XX	{"ret", 89},
XX	{"f1", 5},
XX	{"f2", 6},
XX	{"f3", 8},
XX	{"f4", 10},
XX	{"f5", 12},
XX	{"f6", 14},
XX	{"f7", 16},
XX	{"f8", 17},
XX	{"f9", 18},
XX	{"tab", 53},
XX	{"[", 64},
XX	{"\\", 88},
XX	{"]", 65},
XX	{"`", 42},
XX	{"a", 77},
XX	{"b", 104},
XX	{"c", 102},
XX	{"d", 79},
XX	{"e", 56},
XX	{"f", 80},
XX	{"g", 81},
XX	{"h", 82},
XX	{"i", 61},
XX	{"j", 83},
XX	{"k", 84},
XX	{"l", 85},
XX	{"m", 106},
XX	{"n", 105},
XX	{"o", 62},
XX	{"p", 63},
XX	{"q", 54},
XX	{"r", 57},
XX	{"s", 78},
XX	{"t", 58},
XX	{"u", 60},
XX	{"v", 103},
XX	{"w", 55},
XX	{"x", 101},
XX	{"y", 59},
XX	{"z", 100}
XX};
XX/* rf8,10,12,and 14 are the culprits. when the kbd is initialized */
XX/* they transmit an escape code instead of the standard sun-2 position*/
XXvoid
XXinit_kbd()
XX{
XX		prep_kbd ();	/* prepare keyboard */
XX		set_key("r8",RF(8));
XX		set_key("r10",RF(10));
XX		set_key("r12",RF(12));
XX		set_key("r14",RF(14));

XX}

XXint prep_kbd()
XX{
XX    if ((fbdes = open ("/dev/fb", 2)) < 0) {
XX	fprintf (stderr, "%s: couldn't open framebuffer\n", "ttyvt100");
XX	exit (2);
XX    }

XX    if (ioctl (fbdes, FBIOGTYPE, &fb) < 0) {
XX	fprintf (stderr, "%s: couldn't get the fb struct\n", "ttyvt100");
XX	exit (2);
XX    }

XX    if (fb.fb_type != FBTYPE_SUN2BW) {
XX	fprintf (stderr, "Sorry, I only do Sun2s\n", "ttyvt100");
XX	exit (2);
XX    }

XX    if ((kb = open ("/dev/kbd", 2)) < 0) {
XX	fprintf (stderr, "%s: couldn't open keyboard\n", "ttyvt100");
XX	exit (2);
XX    }
XX    return;
XX}

XXint set_key(key, keydef)
XXchar *key;
XXint keydef;
XX{
XX    int     found_key = FALSE,
XX            i;

XX    struct kiockey  this_key;
XX    struct kiockey *pk = &this_key;


XX    switch (*key) {
XX	case 'C': 
XX	    pk -> kio_tablemask = CTRLMASK;
XX	    key++;
XX	    break;
XX	case 'S': 
XX	    pk -> kio_tablemask = SHIFTMASK;
XX	    key++;
XX	    break;
XX	default: 
XX	    pk -> kio_tablemask = 0;
XX	    break;
XX    }


XX    for (i = 0; i < MAX_keydefs; i++) {
XX	if (strncmp (key, k_board[i].name, 3) == 0) {
XX	    found_key = TRUE;
XX	    break;
XX	}
XX    }

XX    if (!found_key) {
XX	fprintf (stderr, "%s: couldn't find `%s' key\n", "ttyvt100", key);
XX	exit (2);
XX    }

XX    pk -> kio_station = k_board[i].id_num;

XX/*    pk -> kio_tablemask = 0; */


XX		    pk -> kio_entry = keydef;
XX		
XX 
XX/* define key */

XX    if (ioctl (kb, KIOCSETKEY, pk) < 0) {
XX	fprintf (stderr, "%s: couldn't define the `%s' key\n", "ttyvt100", key);
XX	exit (2);
XX    }
XX    return;
XX}
XX/* end of the keyboard stuff. only do this on entering. whew! */


@//E*O*F src/vt100keys.c//
chmod u=r,g=r,o=r src/vt100keys.c
 
echo x - MANIFEST
sed 's/^XX//' > "MANIFEST" <<'@//E*O*F MANIFEST//'
XXINSTALL                      1
XXMANIFEST                     1
XXMANIFEST                     9
XXdecode.sh                    1
XXfontdir                      1
XXfontdir/uu.gacha.b.8         1
XXfontdir/uu.gacha.bg.8        1
XXfontdir/uu.gacha.g.8         1
XXfontdir/uu.gacha.r.8         1
XXfontdir/uu.testfont.sh       1
XXfontdir/uu.thin.b.5          1
XXfontdir/uu.thin.b.6          1
XXfontdir/uu.thin.bg.5         2
XXfontdir/uu.thin.bg.6         2
XXfontdir/uu.thin.g.5          2
XXfontdir/uu.thin.g.6          2
XXfontdir/uu.thin.r.5          2
XXfontdir/uu.thin.r.6          2
XXfontdir/uu.thinbot.b.10      2
XXfontdir/uu.thinbot.bg.10     3
XXfontdir/uu.thinbot.g.10      3
XXfontdir/uu.thinbot.r.10      3
XXfontdir/uu.thintop.b.10      3
XXfontdir/uu.thintop.bg.10     3
XXfontdir/uu.thintop.g.10      3
XXfontdir/uu.thintop.r.10      4
XXfontdir/uu.thinwide.b.10     4
XXfontdir/uu.thinwide.bg.10     4
XXfontdir/uu.thinwide.g.10     4
XXfontdir/uu.thinwide.r.10     4
XXfontdir/uu.wide.b.16         4
XXfontdir/uu.wide.bg.16        5
XXfontdir/uu.wide.g.16         5
XXfontdir/uu.wide.r.16         5
XXfontdir/uu.widebot.b.16      5
XXfontdir/uu.widebot.bg.16     5
XXfontdir/uu.widebot.g.16      5
XXfontdir/uu.widebot.r.16      6
XXfontdir/uu.widetop.b.16      6
XXfontdir/uu.widetop.bg.16     6
XXfontdir/uu.widetop.g.16      6
XXfontdir/uu.widetop.r.16      6
XXlibdir                       1
XXlibdir/makefile              1
XXlibdir/uu.cim_change.o       6
XXlibdir/uu.cim_size.o         2
XXlibdir/uu.csr_change.o       7
XXlibdir/uu.csr_init.o         7
XXlibdir/uu.ttysw_main.o       7
XXlibdir/uu.ttyvt100.o         8
XXlibdir/uu.vt100fonts.o       7
XXlibdir/uu.vt100keys.o        8
XXmakefile                     1
XXsrc                          3
XXsrc/README                   6
XXsrc/ttyvt100.c               9
XXsrc/ttyvt100.h               8
XXsrc/vt100fonts.c             8
XXsrc/vt100keys.c              9
XXvconfig.h                    8
XXvshelltool.icon              6
XXvt100tool.1                  8
XXvt100tool.c                  10
@//E*O*F MANIFEST//
chmod u=rw,g=rw,o=rw MANIFEST
 
echo Inspecting for damage in transit...
temp=/tmp/sharin$$; dtemp=/tmp/sharout$$
trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
cat > $temp <<\!!!
    1215    3746   27979 ttyvt100.c
     491    1239   10210 vt100keys.c
      63     126    1955 MANIFEST
    1769    5111   40144 total
!!!
wc  src/ttyvt100.c src/vt100keys.c MANIFEST | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
if test -s $dtemp
then echo "Ouch [diff of wc output]:" ; cat $dtemp
else echo "No problems found."
fi
exit 0