@ -356,6 +356,7 @@ static void csidump(void);
static void csihandle ( void ) ;
static void csiparse ( void ) ;
static void csireset ( void ) ;
static int eschandle ( uchar ascii ) ;
static void strdump ( void ) ;
static void strhandle ( void ) ;
static void strparse ( void ) ;
@ -2347,6 +2348,19 @@ tdeftran(char ascii) {
}
}
void
tdectest ( char c ) {
static char E [ UTF_SIZ ] = " E " ;
int x , y ;
if ( c = = ' 8 ' ) { /* DEC screen alignment test. */
for ( x = 0 ; x < term . col ; + + x ) {
for ( y = 0 ; y < term . row ; + + y )
tsetchar ( E , & term . c . attr , x , y ) ;
}
}
}
void
tstrsequence ( uchar c ) {
if ( c & 0x80 ) {
@ -2455,17 +2469,83 @@ tcontrolcode(uchar ascii) {
return ;
}
void
tdectest ( char c ) {
static char E [ UTF_SIZ ] = " E " ;
int x , y ;
if ( c = = ' 8 ' ) { /* DEC screen alignment test. */
for ( x = 0 ; x < term . col ; + + x ) {
for ( y = 0 ; y < term . row ; + + y )
tsetchar ( E , & term . c . attr , x , y ) ;
/*
* returns 1 when the sequence is finished and it hasn ' t to read
* more characters for this sequence , otherwise 0
*/
int
eschandle ( uchar ascii ) {
switch ( ascii ) {
case ' [ ' :
term . esc | = ESC_CSI ;
return 0 ;
case ' # ' :
term . esc | = ESC_TEST ;
return 0 ;
case ' P ' : /* DCS -- Device Control String */
case ' _ ' : /* APC -- Application Program Command */
case ' ^ ' : /* PM -- Privacy Message */
case ' ] ' : /* OSC -- Operating System Command */
case ' k ' : /* old title set compatibility */
tstrsequence ( ascii ) ;
return 0 ;
case ' ( ' : /* set primary charset G0 */
case ' ) ' : /* set secondary charset G1 */
case ' * ' : /* set tertiary charset G2 */
case ' + ' : /* set quaternary charset G3 */
term . icharset = ascii - ' ( ' ;
term . esc | = ESC_ALTCHARSET ;
return 0 ;
case ' D ' : /* IND -- Linefeed */
if ( term . c . y = = term . bot ) {
tscrollup ( term . top , 1 ) ;
} else {
tmoveto ( term . c . x , term . c . y + 1 ) ;
}
break ;
case ' E ' : /* NEL -- Next line */
tnewline ( 1 ) ; /* always go to first col */
break ;
case ' H ' : /* HTS -- Horizontal tab stop */
term . tabs [ term . c . x ] = 1 ;
break ;
case ' M ' : /* RI -- Reverse index */
if ( term . c . y = = term . top ) {
tscrolldown ( term . top , 1 ) ;
} else {
tmoveto ( term . c . x , term . c . y - 1 ) ;
}
break ;
case ' Z ' : /* DECID -- Identify Terminal */
ttywrite ( vtiden , sizeof ( vtiden ) - 1 ) ;
break ;
case ' c ' : /* RIS -- Reset to inital state */
treset ( ) ;
xresettitle ( ) ;
xloadcols ( ) ;
break ;
case ' = ' : /* DECPAM -- Application keypad */
term . mode | = MODE_APPKEYPAD ;
break ;
case ' > ' : /* DECPNM -- Normal keypad */
term . mode & = ~ MODE_APPKEYPAD ;
break ;
case ' 7 ' : /* DECSC -- Save Cursor */
tcursor ( CURSOR_SAVE ) ;
break ;
case ' 8 ' : /* DECRC -- Restore Cursor */
tcursor ( CURSOR_LOAD ) ;
break ;
case ' \\ ' : /* ST -- String Terminator */
if ( term . esc & ESC_STR_END )
strhandle ( ) ;
break ;
default :
fprintf ( stderr , " erresc: unknown sequence ESC 0x%02X '%c' \n " ,
( uchar ) ascii , isprint ( ascii ) ? ascii : ' . ' ) ;
break ;
}
return 1 ;
}
void
@ -2552,76 +2632,9 @@ tputc(char *c, int len) {
} else if ( term . esc & ESC_TEST ) {
tdectest ( ascii ) ;
} else {
switch ( ascii ) {
case ' [ ' :
term . esc | = ESC_CSI ;
return ;
case ' # ' :
term . esc | = ESC_TEST ;
return ;
case ' P ' : /* DCS -- Device Control String */
case ' _ ' : /* APC -- Application Program Command */
case ' ^ ' : /* PM -- Privacy Message */
case ' ] ' : /* OSC -- Operating System Command */
case ' k ' : /* old title set compatibility */
tstrsequence ( ascii ) ;
if ( ! eschandle ( ascii ) )
return ;
case ' ( ' : /* set primary charset G0 */
case ' ) ' : /* set secondary charset G1 */
case ' * ' : /* set tertiary charset G2 */
case ' + ' : /* set quaternary charset G3 */
term . icharset = ascii - ' ( ' ;
term . esc | = ESC_ALTCHARSET ;
return ;
case ' D ' : /* IND -- Linefeed */
if ( term . c . y = = term . bot ) {
tscrollup ( term . top , 1 ) ;
} else {
tmoveto ( term . c . x , term . c . y + 1 ) ;
}
break ;
case ' E ' : /* NEL -- Next line */
tnewline ( 1 ) ; /* always go to first col */
break ;
case ' H ' : /* HTS -- Horizontal tab stop */
term . tabs [ term . c . x ] = 1 ;
break ;
case ' M ' : /* RI -- Reverse index */
if ( term . c . y = = term . top ) {
tscrolldown ( term . top , 1 ) ;
} else {
tmoveto ( term . c . x , term . c . y - 1 ) ;
}
break ;
case ' Z ' : /* DECID -- Identify Terminal */
ttywrite ( vtiden , sizeof ( vtiden ) - 1 ) ;
break ;
case ' c ' : /* RIS -- Reset to inital state */
treset ( ) ;
xresettitle ( ) ;
xloadcols ( ) ;
break ;
case ' = ' : /* DECPAM -- Application keypad */
term . mode | = MODE_APPKEYPAD ;
break ;
case ' > ' : /* DECPNM -- Normal keypad */
term . mode & = ~ MODE_APPKEYPAD ;
break ;
case ' 7 ' : /* DECSC -- Save Cursor */
tcursor ( CURSOR_SAVE ) ;
break ;
case ' 8 ' : /* DECRC -- Restore Cursor */
tcursor ( CURSOR_LOAD ) ;
break ;
case ' \\ ' : /* ST -- String Terminator */
if ( term . esc & ESC_STR_END )
strhandle ( ) ;
break ;
default :
fprintf ( stderr , " erresc: unknown sequence ESC 0x%02X '%c' \n " ,
( uchar ) ascii , isprint ( ascii ) ? ascii : ' . ' ) ;
break ;
}
/* sequence already finished */
}
term . esc = 0 ;
/*