diff options
Diffstat (limited to 'grep-searcher/src/searcher/glue.rs')
-rw-r--r-- | grep-searcher/src/searcher/glue.rs | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/grep-searcher/src/searcher/glue.rs b/grep-searcher/src/searcher/glue.rs index 3a5d4291..4f362dab 100644 --- a/grep-searcher/src/searcher/glue.rs +++ b/grep-searcher/src/searcher/glue.rs @@ -51,6 +51,7 @@ where M: Matcher, fn fill(&mut self) -> Result<bool, S::Error> { assert!(self.rdr.buffer()[self.core.pos()..].is_empty()); + let already_binary = self.rdr.binary_byte_offset().is_some(); let old_buf_len = self.rdr.buffer().len(); let consumed = self.core.roll(self.rdr.buffer()); self.rdr.consume(consumed); @@ -58,7 +59,14 @@ where M: Matcher, Err(err) => return Err(S::Error::error_io(err)), Ok(didread) => didread, }; - if !didread || self.rdr.binary_byte_offset().is_some() { + if !already_binary { + if let Some(offset) = self.rdr.binary_byte_offset() { + if !self.core.binary_data(offset)? { + return Ok(false); + } + } + } + if !didread || self.should_binary_quit() { return Ok(false); } // If rolling the buffer didn't result in consuming anything and if @@ -71,6 +79,11 @@ where M: Matcher, } Ok(true) } + + fn should_binary_quit(&self) -> bool { + self.rdr.binary_byte_offset().is_some() + && self.config.binary.quit_byte().is_some() + } } #[derive(Debug)] @@ -103,7 +116,7 @@ impl<'s, M: Matcher, S: Sink> SliceByLine<'s, M, S> { DEFAULT_BUFFER_CAPACITY, ); let binary_range = Range::new(0, binary_upto); - if !self.core.detect_binary(self.slice, &binary_range) { + if !self.core.detect_binary(self.slice, &binary_range)? { while !self.slice[self.core.pos()..].is_empty() && self.core.match_by_line(self.slice)? @@ -155,7 +168,7 @@ impl<'s, M: Matcher, S: Sink> MultiLine<'s, M, S> { DEFAULT_BUFFER_CAPACITY, ); let binary_range = Range::new(0, binary_upto); - if !self.core.detect_binary(self.slice, &binary_range) { + if !self.core.detect_binary(self.slice, &binary_range)? { let mut keepgoing = true; while !self.slice[self.core.pos()..].is_empty() && keepgoing { keepgoing = self.sink()?; |