brub
parent
16a17a6274
commit
f490f8c276
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue