diff options
-rw-r--r-- | CHANGELOG.md | 4 | ||||
-rw-r--r-- | src/lib.rs | 39 |
2 files changed, 36 insertions, 7 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index ffea20c..ffce24e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ CHANGELOG ========= +## [Unreleased] + +- Fix params reset between escapes + ## 0.6.0 - Fix build failure on Rust 1.36.0 @@ -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, |