Fix for UTF-8 roundtrip verification bug.
The problem was that the round-trip verification code copies the current state, which may contain intermediate Parser state for multibyte characters and ANSI escape sequences. It then applies diffs to that copy, which may appear as badly formed input. Also removes some dead, never-used code.
This commit is contained in:
@@ -138,7 +138,12 @@ namespace Network {
|
||||
/* Misc. getters and setters */
|
||||
/* Cannot modify current_state while shutdown in progress */
|
||||
MyState &get_current_state( void ) { assert( !shutdown_in_progress ); return current_state; }
|
||||
void set_current_state( const MyState &x ) { assert( !shutdown_in_progress ); current_state = x; }
|
||||
void set_current_state( const MyState &x )
|
||||
{
|
||||
assert( !shutdown_in_progress );
|
||||
current_state = x;
|
||||
current_state.reset_input();
|
||||
}
|
||||
void set_verbose( void ) { verbose = true; }
|
||||
|
||||
bool get_shutdown_in_progress( void ) const { return shutdown_in_progress; }
|
||||
|
||||
@@ -174,8 +174,8 @@ int Complete::wait_time( uint64_t now ) const
|
||||
bool Complete::compare( const Complete &other ) const
|
||||
{
|
||||
bool ret = false;
|
||||
for ( int x = 0; x < terminal.get_fb().ds.get_width(); x++ ) {
|
||||
for ( int y = 0; y < terminal.get_fb().ds.get_height(); y++ ) {
|
||||
for ( int y = 0; y < terminal.get_fb().ds.get_height(); y++ ) {
|
||||
for ( int x = 0; x < terminal.get_fb().ds.get_width(); x++ ) {
|
||||
if ( terminal.get_fb().get_cell( y, x )->compare( *other.terminal.get_fb().get_cell( y, x ) ) ) {
|
||||
fprintf( stderr, "Cell (%d, %d) differs.\n", y, x );
|
||||
ret = true;
|
||||
|
||||
@@ -67,8 +67,7 @@ namespace Terminal {
|
||||
std::string act( const Parser::Action *act );
|
||||
|
||||
const Framebuffer & get_fb( void ) const { return terminal.get_fb(); }
|
||||
bool parser_grounded( void ) const { return parser.is_grounded(); }
|
||||
|
||||
void reset_input( void ) { parser.reset_input(); }
|
||||
uint64_t get_echo_ack( void ) const { return echo_ack; }
|
||||
bool set_echo_ack( uint64_t now );
|
||||
void register_input_frame( uint64_t n, uint64_t now );
|
||||
|
||||
@@ -60,12 +60,11 @@ namespace Parser {
|
||||
|
||||
void input( wchar_t ch, Actions &actions );
|
||||
|
||||
bool operator==( const Parser &x ) const
|
||||
void reset_input( void )
|
||||
{
|
||||
return state == x.state;
|
||||
state = &family.s_Ground;
|
||||
}
|
||||
|
||||
bool is_grounded( void ) const { return state == &family.s_Ground; }
|
||||
};
|
||||
|
||||
static const size_t BUF_SIZE = 8;
|
||||
@@ -82,12 +81,12 @@ namespace Parser {
|
||||
|
||||
void input( char c, Actions &actions );
|
||||
|
||||
bool operator==( const UTF8Parser &x ) const
|
||||
void reset_input( void )
|
||||
{
|
||||
return parser == x.parser;
|
||||
parser.reset_input();
|
||||
buf[0] = '\0';
|
||||
buf_len = 0;
|
||||
}
|
||||
|
||||
bool is_grounded( void ) const { return parser.is_grounded(); }
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -662,8 +662,9 @@ bool Cell::compare( const Cell &other ) const
|
||||
|
||||
if ( !contents_match( other ) ) {
|
||||
ret = true;
|
||||
fprintf( stderr, "Contents: %lc vs. %lc\n",
|
||||
debug_contents(), other.debug_contents() );
|
||||
fprintf( stderr, "Contents: %lc (%ld) vs. %lc (%ld)\n",
|
||||
debug_contents(), contents.size(),
|
||||
other.debug_contents(), other.contents.size() );
|
||||
}
|
||||
|
||||
if ( fallback != other.fallback ) {
|
||||
|
||||
Reference in New Issue
Block a user