From a3268b8791ac4bf54f734b1abdcfeddf5841a96a Mon Sep 17 00:00:00 2001 From: Sharif Haason Date: Tue, 20 Jun 2023 10:45:13 -0400 Subject: [PATCH 1/3] Correctly handle discontinuous input i.e. stdin --- src/lib.rs | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index cc2a04e..ee90929 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -583,11 +583,27 @@ impl<'a, Writer: Write> Printer<'a, Writer> { self.print_header()?; is_empty = false; } - - // perform second check on read - if let Ok(0) = buf.read(&mut self.line_buf[n..]) { - self.line_buf.resize(n, 0); - break Some(n); + let mut leftover = n; + // loop until + break loop { + if let Ok(n) = buf.read(&mut self.line_buf[leftover..]) { + leftover += n; + // there is no more input being read + if n == 0 { + self.line_buf.resize(leftover, 0); + break Some(leftover); + } + // amount read has exceeded line buffer + if leftover >= 8 * self.panels as usize { + self.print_position_panel()?; + self.print_bytes()?; + if self.show_char_panel { + self.print_char_panel()?; + } + self.writer.write_all(b"\n")?; + leftover = 0; + } + } }; } else if n == 0 { // if no bytes are read, that indicates end of file From ef9b530d6a06ec43a59b25351fd862af15e447d9 Mon Sep 17 00:00:00 2001 From: Sharif Haason Date: Tue, 20 Jun 2023 10:46:48 -0400 Subject: [PATCH 2/3] Finish comment --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index ee90929..0e3fc1a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -584,7 +584,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> { is_empty = false; } let mut leftover = n; - // loop until + // loop until input is ceased break loop { if let Ok(n) = buf.read(&mut self.line_buf[leftover..]) { leftover += n; From dfad7b3faf213eade4bf181017a322bae07e8c66 Mon Sep 17 00:00:00 2001 From: Sharif Haason Date: Tue, 20 Jun 2023 10:55:07 -0400 Subject: [PATCH 3/3] Refactor to avoid code duplication --- src/lib.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0e3fc1a..1c0c62e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -585,7 +585,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> { } let mut leftover = n; // loop until input is ceased - break loop { + if let Some(s) = loop { if let Ok(n) = buf.read(&mut self.line_buf[leftover..]) { leftover += n; // there is no more input being read @@ -595,15 +595,11 @@ impl<'a, Writer: Write> Printer<'a, Writer> { } // amount read has exceeded line buffer if leftover >= 8 * self.panels as usize { - self.print_position_panel()?; - self.print_bytes()?; - if self.show_char_panel { - self.print_char_panel()?; - } - self.writer.write_all(b"\n")?; - leftover = 0; + break None; } } + } { + break Some(s); }; } else if n == 0 { // if no bytes are read, that indicates end of file