From 3c5ce9f86cdb2a5e915d78770137a7d55a9c1dae Mon Sep 17 00:00:00 2001 From: "Evgeniy Andreev (gsomix)" Date: Sat, 20 Jun 2020 19:00:32 +0400 Subject: [PATCH] Enable non-printable chars for redirected output (#1061) --- CHANGELOG.md | 3 +++ src/controller.rs | 2 +- src/printer.rs | 22 ++++++++++++++++------ tests/examples/nonprintable.txt | Bin 0 -> 18 bytes tests/integration_tests.rs | 10 ++++++++++ 5 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 tests/examples/nonprintable.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index bfd57e69..3e07aa01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ - Added support for the `NO_COLOR` environment variable, see #1021 and #1031 (@eth-p) ## Bugfixes + +- Fixed non-printable characters display for redirected output, see #1061 (@gsomix) + ## Other ## Syntaxes diff --git a/src/controller.rs b/src/controller.rs index e11080f5..3fe44a72 100644 --- a/src/controller.rs +++ b/src/controller.rs @@ -113,7 +113,7 @@ impl<'b> Controller<'b> { }; let mut printer: Box = if self.config.loop_through { - Box::new(SimplePrinter::new()) + Box::new(SimplePrinter::new(&self.config)) } else { Box::new(InteractivePrinter::new( &self.config, diff --git a/src/printer.rs b/src/printer.rs index addc7972..7e369a6e 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -52,15 +52,17 @@ pub(crate) trait Printer { ) -> Result<()>; } -pub struct SimplePrinter; +pub struct SimplePrinter<'a> { + config: &'a Config<'a> +} -impl SimplePrinter { - pub fn new() -> Self { - SimplePrinter {} +impl<'a> SimplePrinter<'a> { + pub fn new(config: &'a Config) -> Self { + SimplePrinter { config } } } -impl Printer for SimplePrinter { +impl<'a> Printer for SimplePrinter<'a> { fn print_header( &mut self, _handle: &mut dyn Write, @@ -86,7 +88,15 @@ impl Printer for SimplePrinter { line_buffer: &[u8], ) -> Result<()> { if !out_of_range { - handle.write_all(line_buffer)?; + if self.config.show_nonprintable { + let line = replace_nonprintable(line_buffer, self.config.tab_width); + write!(handle, "{}", line)?; + if line_buffer.last() == Some(&b'\n') { + writeln!(handle)?; + } + } else { + handle.write_all(line_buffer)? + }; } Ok(()) } diff --git a/tests/examples/nonprintable.txt b/tests/examples/nonprintable.txt new file mode 100644 index 0000000000000000000000000000000000000000..00f60e332ed3f28208cd187079173dcc8184e4e1 GIT binary patch literal 18 Zcmc~u&B@7ED9