From 2f2b8cf0678ea8641b332773cd9b2e68742cd61b Mon Sep 17 00:00:00 2001 From: Emma Tebibyte Date: Wed, 12 Nov 2025 16:18:46 -0700 Subject: [PATCH] libdelimit: updates to make API easier to use; fop(1): updated to new libdelimit API --- src/fop.rs | 4 ++-- src/libdelimit.rs | 30 +++++++++++++++++------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/fop.rs b/src/fop.rs index 2b91963..53c9917 100644 --- a/src/fop.rs +++ b/src/fop.rs @@ -94,7 +94,7 @@ fn main() -> ExitCode { let stdin = stdin().lock(); - let mut input = Delimited::new(stdin, d.clone().as_bytes()); + let mut input = Delimited::new(stdin, d.clone()); let mut n = 0; let mut fopped = false; @@ -104,7 +104,7 @@ fn main() -> ExitCode { Ok(v) => v, Err(e) => { err(&argv[0], e); - exit(EX_IOERR.into()); + return EX_IOERR.into(); }, }; diff --git a/src/libdelimit.rs b/src/libdelimit.rs index b7de4a9..c228e7c 100644 --- a/src/libdelimit.rs +++ b/src/libdelimit.rs @@ -31,13 +31,25 @@ pub struct Delimited { } impl Delimited where T: Read { - pub fn new(stream: T, delimiter: &[u8]) -> Self { + pub fn new(stream: T, delimiter: R) -> Self where R: AsRef<[u8]> { Delimited { stream, - delimiter: delimiter.to_vec(), + delimiter: delimiter.as_ref().to_vec(), buffer: Vec::with_capacity(BUFFER_SIZE), } } + + fn find_subslice(&self) -> Option { + match self.delimiter.len() { + /* TODO: is this optimization necessary? */ + 1 => self.buffer.iter().position(|&b| b == self.delimiter[0]), + _ => { + self.buffer + .windows(self.delimiter.len()) + .position(|w| w == self.delimiter) + }, + } + } } impl Iterator for Delimited where T: Read { @@ -47,7 +59,7 @@ impl Iterator for Delimited where T: Read { let mut buf = [0; BUFFER_SIZE]; loop { - if let Some(p) = find_subslice(&self.buffer, &self.delimiter) { + if let Some(p) = self.find_subslice() { let chunk = self.buffer.drain(..p).collect::>(); let _ = self.buffer.drain(..self.delimiter.len()); @@ -56,7 +68,7 @@ impl Iterator for Delimited where T: Read { } match self.stream.read(&mut buf) { - Ok(0) => { + Ok(0) => { /* no bytes read, we’re probably done */ let _ = self.buffer.is_empty() && return None; return Some(Ok(mem::take(&mut self.buffer))); @@ -72,14 +84,6 @@ impl Iterator for Delimited where T: Read { } } -fn find_subslice(stack: &[u8], key: &[u8]) -> Option { - match key.len() { - /* TODO: is this optimization necessary? */ - 1 => stack.iter().position(|&b| b == key[0]), - _ => stack.windows(key.len()).position(|w| w == key), - } -} - #[cfg(test)] mod tests { use Delimited; @@ -90,7 +94,7 @@ mod tests { let input = vec!["meow", "woof", "ribbit"]; let r = input.join(&d); - let mut output = Delimited::new(r.as_bytes(), d.as_bytes()); + let mut output = Delimited::new(r.as_bytes(), d); let mut i = 0; while let Some(item) = output.next() {