From 035c47fb362cc97fb42712e0138c55a7a4d318e4 Mon Sep 17 00:00:00 2001 From: Christian Duerr Date: Fri, 31 Jan 2020 22:22:09 +0000 Subject: Fix param not resetting between escapes Fixes #46. --- src/lib.rs | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 1402108..011b6a1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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), } } } @@ -709,6 +706,34 @@ mod tests { assert_eq!(dispatcher.params[0], &[i64::MAX as i64]); } + #[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] = &[ -- cgit