daddy
elfein727 2021-12-23 01:38:15 -08:00
parent 16a17a6274
commit f490f8c276
1 changed files with 17 additions and 10 deletions

View File

@ -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<Option<String>> {
pub fn prev_line(&mut self, their_buf: &mut impl Write) -> std::io::Result<BytesRead> {
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)
}
}