diff --git a/src/input_common.rs b/src/input_common.rs index 72f16cfdb..22054a328 100644 --- a/src/input_common.rs +++ b/src/input_common.rs @@ -1349,28 +1349,34 @@ fn parse_ss3(&mut self, buffer: &mut Vec) -> Option { Some(key) } - fn parse_xtversion(&mut self, buffer: &mut Vec) { - assert!(buffer.len() == 3); + fn read_until_sequence_terminator(&mut self, buffer: &mut Vec) -> Option<()> { + let mut escape = false; loop { - match self.try_readb(buffer) { - None => return, - Some(b'\x1b') => break, - Some(_) => continue, + let b = self.try_readb(buffer)?; + if escape && b == b'\\' { + break; } + escape = b == b'\x1b'; } - if self.try_readb(buffer) != Some(b'\\') { - return; - } - if buffer[3] != b'|' { - return; + buffer.pop(); + buffer.pop(); + Some(()) + } + + fn parse_xtversion(&mut self, buffer: &mut Vec) -> Option<()> { + assert_eq!(buffer, b"\x1bP>"); + self.read_until_sequence_terminator(buffer)?; + if buffer.get(3)? != &b'|' { + return None; } FLOG!( reader, format!( "Received XTVERSION response: {}", - str2wcstring(&buffer[4..buffer.len() - 2]), + str2wcstring(&buffer[4..buffer.len()]) ) ); + None } fn parse_dcs(&mut self, buffer: &mut Vec) -> Option { @@ -1393,12 +1399,7 @@ fn parse_dcs(&mut self, buffer: &mut Vec) -> Option { if self.try_readb(buffer)? != b'r' { return None; } - while self.try_readb(buffer)? != b'\x1b' {} - if self.try_readb(buffer)? != b'\\' { - return None; - } - buffer.pop(); - buffer.pop(); + self.read_until_sequence_terminator(buffer)?; // \e P 1 r + Pn ST // \e P 0 r + msg ST let buffer = &buffer[5..];