@ -1784,56 +1784,80 @@ tputtab(bool forward) {
void
void
tputc ( char * c , int len ) {
tputc ( char * c , int len ) {
uchar ascii = * c ;
uchar ascii = * c ;
bool control = ascii < ' \x20 ' | | ascii = = 0177 ;
if ( iofd ! = - 1 )
if ( iofd ! = - 1 )
write ( iofd , c , len ) ;
write ( iofd , c , len ) ;
switch ( ascii ) {
case ' \t ' : /* HT */
tputtab ( 1 ) ;
return ;
case ' \b ' : /* BS */
tmoveto ( term . c . x - 1 , term . c . y ) ;
return ;
case ' \r ' : /* CR */
tmoveto ( 0 , term . c . y ) ;
return ;
case ' \f ' : /* LF */
case ' \v ' : /* VT */
case ' \n ' : /* LF */
/* go to first col if the mode is set */
tnewline ( IS_SET ( MODE_CRLF ) ) ;
return ;
case ' \a ' : /* BEL */
if ( term . esc & ESC_STR )
/*
* STR sequences must be checked before of anything
* because it can use some control codes as part of the sequence
*/
if ( term . esc & ESC_STR ) {
switch ( ascii ) {
case ' \033 ' :
term . esc = ESC_START | ESC_STR_END ;
break ;
break ;
if ( ! ( xw . state & WIN_FOCUSED ) )
xseturgency ( 1 ) ;
return ;
case ' \033 ' : /* ESC */
csireset ( ) ;
term . esc = ESC_START ;
return ;
case ' \016 ' : /* SO */
term . c . attr . mode | = ATTR_GFX ;
break ;
case ' \017 ' : /* SI */
term . c . attr . mode & = ~ ATTR_GFX ;
return ;
case ' \032 ' : /* SUB */
case ' \030 ' : /* CAN */
csireset ( ) ;
case ' \a ' : /* backwards compatibility to xterm */
term . esc = 0 ;
strhandle ( ) ;
break ;
default :
strescseq . buf [ strescseq . len + + ] = ascii ;
if ( strescseq . len + 1 > = STR_BUF_SIZ ) {
term . esc = 0 ;
strhandle ( ) ;
}
}
return ;
return ;
default :
/* case '\005': ENQ (IGNORED) */
/* case '\000': NUL (IGNORED) */
/* case '\021': XON (IGNORED) */
/* case '\023': XOFF (IGNORED) */
/* case 0177: DEL (IGNORED) */
break ;
}
}
if ( term . esc & ESC_START ) {
/*
* Actions of control codes must be performed as soon they arrive
* because they can be embedded inside a control sequence , and
* they must not cause conflicts with sequences .
*/
if ( control ) {
switch ( ascii ) {
case ' \t ' : /* HT */
tputtab ( 1 ) ;
return ;
case ' \b ' : /* BS */
tmoveto ( term . c . x - 1 , term . c . y ) ;
return ;
case ' \r ' : /* CR */
tmoveto ( 0 , term . c . y ) ;
return ;
case ' \f ' : /* LF */
case ' \v ' : /* VT */
case ' \n ' : /* LF */
/* go to first col if the mode is set */
tnewline ( IS_SET ( MODE_CRLF ) ) ;
return ;
case ' \a ' : /* BEL */
if ( ! ( xw . state & WIN_FOCUSED ) )
xseturgency ( 1 ) ;
return ;
case ' \033 ' : /* ESC */
csireset ( ) ;
term . esc = ESC_START ;
return ;
case ' \016 ' : /* SO */
term . c . attr . mode | = ATTR_GFX ;
return ;
case ' \017 ' : /* SI */
term . c . attr . mode & = ~ ATTR_GFX ;
return ;
case ' \032 ' : /* SUB */
case ' \030 ' : /* CAN */
csireset ( ) ;
return ;
case ' \005 ' : /* ENQ (IGNORED) */
case ' \000 ' : /* NUL (IGNORED) */
case ' \021 ' : /* XON (IGNORED) */
case ' \023 ' : /* XOFF (IGNORED) */
case 0177 : /* DEL (IGNORED) */
return ;
}
} else if ( term . esc & ESC_START ) {
if ( term . esc & ESC_CSI ) {
if ( term . esc & ESC_CSI ) {
csiescseq . buf [ csiescseq . len + + ] = ascii ;
csiescseq . buf [ csiescseq . len + + ] = ascii ;
if ( BETWEEN ( ascii , 0x40 , 0x7E )
if ( BETWEEN ( ascii , 0x40 , 0x7E )
@ -1841,22 +1865,6 @@ tputc(char *c, int len) {
term . esc = 0 ;
term . esc = 0 ;
csiparse ( ) , csihandle ( ) ;
csiparse ( ) , csihandle ( ) ;
}
}
} else if ( term . esc & ESC_STR ) {
switch ( ascii ) {
case ' \033 ' :
term . esc = ESC_START | ESC_STR_END ;
break ;
case ' \a ' : /* backwards compatibility to xterm */
term . esc = 0 ;
strhandle ( ) ;
break ;
default :
strescseq . buf [ strescseq . len + + ] = ascii ;
if ( strescseq . len + 1 > = STR_BUF_SIZ ) {
term . esc = 0 ;
strhandle ( ) ;
}
}
} else if ( term . esc & ESC_STR_END ) {
} else if ( term . esc & ESC_STR_END ) {
term . esc = 0 ;
term . esc = 0 ;
if ( ascii = = ' \\ ' )
if ( ascii = = ' \\ ' )
@ -1955,20 +1963,26 @@ tputc(char *c, int len) {
term . esc = 0 ;
term . esc = 0 ;
}
}
}
}
} else {
if ( sel . bx ! = - 1 & & BETWEEN ( term . c . y , sel . by , sel . ey ) )
sel . bx = - 1 ;
if ( ascii > = ' \020 ' | | term . c . attr . mode & ATTR_GFX ) {
if ( IS_SET ( MODE_WRAP ) & & term . c . state & CURSOR_WRAPNEXT )
tnewline ( 1 ) ; /* always go to first col */
tsetchar ( c ) ;
if ( term . c . x + 1 < term . col ) {
tmoveto ( term . c . x + 1 , term . c . y ) ;
} else {
term . c . state | = CURSOR_WRAPNEXT ;
}
}
/*
* All characters which forms part of a sequence are not
* printed
*/
return ;
}
}
/*
* Display control codes only if we are in graphic mode
*/
if ( control & & ! ( term . c . attr . mode & ATTR_GFX ) )
return ;
if ( sel . bx ! = - 1 & & BETWEEN ( term . c . y , sel . by , sel . ey ) )
sel . bx = - 1 ;
if ( IS_SET ( MODE_WRAP ) & & term . c . state & CURSOR_WRAPNEXT )
tnewline ( 1 ) ; /* always go to first col */
tsetchar ( c ) ;
if ( term . c . x + 1 < term . col )
tmoveto ( term . c . x + 1 , term . c . y ) ;
else
term . c . state | = CURSOR_WRAPNEXT ;
}
}
int
int