diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cli.rs | 48 | ||||
-rw-r--r-- | src/input.rs | 2 |
2 files changed, 22 insertions, 28 deletions
@@ -1,6 +1,6 @@ use std::{ env, - io::{Read, Write}, + io::{BufRead, BufReader, Write}, }; use crate::{Error, Input, Result}; @@ -66,41 +66,35 @@ impl Cli { let mut writer = stdout.lock(); for file in self.files.into_iter() { - let reader = file.lock()?; + let reader = BufReader::new(file.reader()?); - let mut newline = true; - let mut line_nr = 0; + let mut nonblank_line_nr = 0; - for byte in reader.bytes() { - let mut buf = vec![]; + for (index, res) in reader.lines().enumerate() { + let mut line = res?; - if newline && self.opts.show_ends { - buf.push(b'$'); - newline = false; + if line.is_empty() && self.opts.squeeze_blank { + continue; } - match byte? as char { - '\n' if newline && self.opts.squeeze_blank => { - newline = true; - continue; - } - c @ '\n' => { - newline = true; - buf.push(c as u8) - } - '\t' if self.opts.show_tabs => buf.extend_from_slice(&[b'^', b'I']), - c => buf.push(c as u8), - }; + if self.opts.show_ends { + line.push('$'); + } - if newline && self.opts.number { - line_nr += 1; - let fmt_str = format!("\t{} ", line_nr); - buf.extend_from_slice(fmt_str.as_bytes()); + if self.opts.show_tabs { + line = line.replace('\t', "^I"); } - if writer.write(&buf).is_err() { - break; + if self.opts.number_nonblank { + if !line.is_empty() { + nonblank_line_nr += 1; + write!(writer, "{:>6} ", nonblank_line_nr)?; + } + } else if self.opts.number { + write!(writer, "{:>6} ", index + 1)?; } + + writeln!(writer, "{}", line)?; } } diff --git a/src/input.rs b/src/input.rs index 01c73ef..57b4f1a 100644 --- a/src/input.rs +++ b/src/input.rs @@ -19,7 +19,7 @@ impl From<&str> for Input { } impl Input { - pub(crate) fn lock(self) -> Result<InputReader<'static>> { + pub(crate) fn reader(self) -> Result<InputReader<'static>> { Ok(match self { Input::File(p) => InputReader::File(BufReader::new(File::open(p)?)), Input::Stdin => InputReader::Stdin(std::io::stdin().lock()), |