aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAaron Hill <aa1ronham@gmail.com>2017-05-16 17:56:11 -0400
committerJoe Wilm <jwilm@users.noreply.github.com>2017-05-16 16:23:09 -0700
commit86805965e630339ee19e06ecb5fdaf8c21e711ff (patch)
tree59355ae89c0e6ebb0e2ec4d5e44e391cf21e3675 /src
parent3b70b0d5953e8510d556e96cfb32f288d35dd705 (diff)
downloadr-alacritty-vte-86805965e630339ee19e06ecb5fdaf8c21e711ff.tar.gz
r-alacritty-vte-86805965e630339ee19e06ecb5fdaf8c21e711ff.tar.bz2
r-alacritty-vte-86805965e630339ee19e06ecb5fdaf8c21e711ff.zip
Properly handle maximum number of OSC parameters
Previously, `osc_num_params` would be incremented when the final parameter finished parsing, even if it was already at `MAX_PARAMS`. This commit ensures that it is not incremented beyond `MAX_PARAMS`.
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 68eb9e4..a5317c3 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -277,6 +277,7 @@ impl Parser {
// First param is special - 0 to current byte index
0 => {
self.osc_params[param_idx] = (0, idx);
+ self.osc_num_params += 1;
},
// All other params depend on previous indexing
@@ -284,10 +285,9 @@ impl Parser {
let prev = self.osc_params[param_idx - 1];
let begin = prev.1;
self.osc_params[param_idx] = (begin, idx);
+ self.osc_num_params += 1;
}
}
- self.osc_num_params += 1;
-
self.osc_dispatch(performer);
},
Action::Unhook => performer.unhook(),
@@ -475,6 +475,31 @@ mod tests {
}
#[test]
+ fn parse_osc_max_params() {
+ use MAX_PARAMS;
+
+ static INPUT: &'static [u8] = b"\x1b];;;;;;;;;;;;;;;;\x1b";
+
+ // Create dispatcher and check state
+ let mut dispatcher = OscDispatcher::default();
+ assert_eq!(dispatcher.dispatched_osc, false);
+
+ // Run parser using OSC_BYTES
+ let mut parser = Parser::new();
+ for byte in INPUT {
+ parser.advance(&mut dispatcher, *byte);
+ }
+
+ // Check that flag is set and thus osc_dispatch assertions ran.
+ assert!(dispatcher.dispatched_osc);
+ assert_eq!(dispatcher.params.len(), MAX_PARAMS);
+ for param in dispatcher.params.iter() {
+ assert_eq!(param.len(), 0);
+ }
+
+ }
+
+ #[test]
fn parse_semi_set_underline() {
struct CsiDispatcher {
params: Vec<Vec<i64>>,