From 7c640bfeaf2a0fbc8c3550b4c19790a800a7f6a2 Mon Sep 17 00:00:00 2001 From: Dylan Date: Wed, 26 Aug 2026 23:58:16 +1200 Subject: feat: Added a bunch of stuff Added derive macro for byte encode Added start for PNG reading Added BMP writing --- src/reader.rs | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 4 deletions(-) (limited to 'src/reader.rs') diff --git a/src/reader.rs b/src/reader.rs index 6f18e0b..2871cae 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -4,7 +4,11 @@ use crate::byte_encode::ByteEncode; pub struct FileReader { - buf_reader: BufReader + buf_reader: BufReader, + le: bool, + checksum_func: Option ()>, + curr_checksum: u32, + checksum_start: u32, } impl FileReader { @@ -12,7 +16,11 @@ impl FileReader { { Self { - buf_reader + buf_reader, + le: true, + checksum_func: None, + curr_checksum: 0, + checksum_start: 0 } } @@ -25,10 +33,63 @@ impl FileReader { std::array::from_fn(|_| self.read()) } - pub fn read>(&mut self) -> T + pub fn get_bytes(&mut self, n: usize) -> Vec + { + let mut buff = vec![0u8; n]; + self.buf_reader.read_exact(&mut buff).expect("get_bytes failed to read"); + if let Some(ref f) = self.checksum_func + { + f(&mut self.curr_checksum, buff.as_slice()); + } + buff + } + + pub fn read_bytes(&mut self) -> [u8; N] { let mut data = [0u8; N]; self.buf_reader.read_exact(&mut data).expect("Bad read"); - T::from_le_bytes(&data) + if let Some(ref f) = self.checksum_func + { + f(&mut self.curr_checksum, &data); + } + data + } + + pub fn read>(&mut self) -> T + { + let mut data = self.read_bytes::(); + if self.le + { + T::from_le_bytes(&data) + } + else + { + T::from_be_bytes(&mut data) + } + } + + pub fn set_endianness(&mut self, le: bool) + { + self.le = le; + } + + pub fn set_checksum_handler(&mut self, checksum_func: fn(&mut u32, &[u8]) -> (), checksum_start: u32) + { + self.checksum_func = Some(checksum_func); + self.checksum_start = checksum_start; + self.curr_checksum = checksum_start; + + } + + pub fn reset_checksum(&mut self) -> u32 + { + let old_checksum = self.curr_checksum.clone(); + self.curr_checksum = self.checksum_start.clone(); + old_checksum + } + + pub fn get_checksum(&self) -> u32 + { + self.curr_checksum } } -- cgit v1.3.1