diff options
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 39 |
1 files changed, 32 insertions, 7 deletions
@@ -286,9 +286,6 @@ impl Parser { self.ignoring, byte as char, ); - - self.num_params = 0; - self.param = 0; }, Action::EscDispatch => { performer.esc_dispatch(self.params(), self.intermediates(), self.ignoring, byte); @@ -322,13 +319,13 @@ impl Parser { } }, Action::Clear => { + // Reset everything on ESC/CSI/DCS entry self.intermediate_idx = 0; - self.num_params = 0; self.ignoring = false; + self.num_params = 0; + self.param = 0; }, - Action::BeginUtf8 => { - self.process_utf8(performer, byte); - }, + Action::BeginUtf8 => self.process_utf8(performer, byte), } } } @@ -710,6 +707,34 @@ mod tests { } #[test] + fn csi_reset() { + static INPUT: &[u8] = b"\x1b[3;1\x1b[2J"; + let mut dispatcher = CsiDispatcher::default(); + let mut parser = Parser::new(); + + for byte in INPUT { + parser.advance(&mut dispatcher, *byte); + } + + assert_eq!(dispatcher.params.len(), 1); + assert_eq!(dispatcher.params[0], &[2]); + } + + #[test] + fn dcs_reset() { + static INPUT: &[u8] = b"\x1bP1X\x9c\x1b[31mH"; + let mut dispatcher = CsiDispatcher::default(); + let mut parser = Parser::new(); + + for byte in INPUT { + parser.advance(&mut dispatcher, *byte); + } + + assert_eq!(dispatcher.params.len(), 1); + assert_eq!(dispatcher.params[0], &[31]); + } + + #[test] fn parse_osc_with_utf8_arguments() { static INPUT: &[u8] = &[ 0x0d, 0x1b, 0x5d, 0x32, 0x3b, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x27, 0xc2, 0xaf, 0x5c, |