From f490f8c2762fdf741b10f7005277075348c3e59b Mon Sep 17 00:00:00 2001 From: elfein727 Date: Thu, 23 Dec 2021 01:38:15 -0800 Subject: [PATCH] brub --- src/reader.rs | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/reader.rs b/src/reader.rs index aef512f..62ee18b 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -1,5 +1,8 @@ use std::fs::File; -use std::io::{self, Read, Seek, SeekFrom}; +use std::io::{self, Read, Seek, SeekFrom, Write}; +use std::slice; + +type BytesRead = usize; pub struct Reader { file: File, @@ -14,22 +17,26 @@ impl Reader { } } - pub fn prev_line(&mut self) -> std::io::Result> { + pub fn prev_line(&mut self, their_buf: &mut impl Write) -> std::io::Result { let file = &mut self.file; if self.last_line_start == 0 { - return Ok(None); + Ok(0) } else { + let mut temp = vec![]; for sub in 1..self.last_line_start { file.seek(SeekFrom::Start(self.last_line_start - sub))?; - let mut buf = [0u8]; - file.read_exact(&mut buf)?; - if buf[0] == b'\n' { - let mut buf = vec![0u8; (sub - 1) as usize]; - file.read_exact(&mut buf)?; - self.last_line_start -= sub; + let mut byte = 0u8; + file.read_exact(slice::from_mut(&mut byte))?; + if byte == b'\n' || sub == self.last_line_start { + their_buf.write_all(&[byte])?; + temp.reverse(); + their_buf.write_all(&temp)?; + return Ok(sub as usize); + } else { + temp.push(byte); } } + Ok(0) } - Ok(None) } }