summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorToby Vincent <tobyv13@gmail.com>2022-12-02 02:36:21 -0600
committerToby Vincent <tobyv13@gmail.com>2022-12-02 02:38:42 -0600
commit5428e226a372e29f7e757c51e13c91416a30e59a (patch)
treeb2c2c65013e78e3a13818f77b125d05147389e2d
parent2fd31cf87160ae90cb4aa9e319360b4bfab6da40 (diff)
refactor: switch to reading lines instead of bytes
-rw-r--r--src/cli.rs48
-rw-r--r--src/input.rs2
2 files changed, 22 insertions, 28 deletions
diff --git a/src/cli.rs b/src/cli.rs
index d47c1e1..bab0b84 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -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()),