diff options
author | metamuffin <metamuffin@disroot.org> | 2025-02-10 17:38:55 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-02-10 17:38:55 +0100 |
commit | d8d00eb146241978ef21ed4d6c35ac9c68b1a86e (patch) | |
tree | c075bd4f9aa17e30aa05aa74db23377c72cf6823 /src/helper.rs | |
parent | 3dade4b3815db7bfa1baf3fbb4fb332b29aba363 (diff) | |
download | unity-tools-d8d00eb146241978ef21ed4d6c35ac9c68b1a86e.tar unity-tools-d8d00eb146241978ef21ed4d6c35ac9c68b1a86e.tar.bz2 unity-tools-d8d00eb146241978ef21ed4d6c35ac9c68b1a86e.tar.zst |
read serialized file tables
Diffstat (limited to 'src/helper.rs')
-rw-r--r-- | src/helper.rs | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/helper.rs b/src/helper.rs index 0b126ad..cb52b8c 100644 --- a/src/helper.rs +++ b/src/helper.rs @@ -1,4 +1,4 @@ -use std::io::{Read, Result}; +use std::io::{Read, Result, Seek}; #[derive(Debug, Clone, Copy, PartialEq)] pub enum Endianness { @@ -23,9 +23,13 @@ pub trait ReadExt { fn read_u64(&mut self, e: Endianness) -> Result<u64>; fn read_u64_be(&mut self) -> Result<u64>; fn read_u64_le(&mut self) -> Result<u64>; + fn read_i64(&mut self, e: Endianness) -> Result<i64>; + fn read_i64_be(&mut self) -> Result<i64>; + fn read_i64_le(&mut self) -> Result<i64>; fn read_u128_be(&mut self) -> Result<u128>; fn read_cstr(&mut self) -> Result<String>; } + impl<T: Read> ReadExt for T { fn read_u8(&mut self) -> Result<u8> { let mut buf = [0; 1]; @@ -112,6 +116,22 @@ impl<T: Read> ReadExt for T { self.read_exact(&mut buf)?; Ok(u64::from_le_bytes(buf)) } + fn read_i64(&mut self, e: Endianness) -> Result<i64> { + match e { + Endianness::Big => self.read_i64_be(), + Endianness::Little => self.read_i64_le(), + } + } + fn read_i64_be(&mut self) -> Result<i64> { + let mut buf = [0; 8]; + self.read_exact(&mut buf)?; + Ok(i64::from_be_bytes(buf)) + } + fn read_i64_le(&mut self) -> Result<i64> { + let mut buf = [0; 8]; + self.read_exact(&mut buf)?; + Ok(i64::from_le_bytes(buf)) + } fn read_u128_be(&mut self) -> Result<u128> { let mut buf = [0; 16]; self.read_exact(&mut buf)?; @@ -130,3 +150,16 @@ impl<T: Read> ReadExt for T { Ok(String::from_utf8_lossy(&s).to_string()) } } + +pub trait AlignExt { + fn align(&mut self, size: u64) -> Result<()>; +} +impl<T: Seek> AlignExt for T { + fn align(&mut self, size: u64) -> Result<()> { + let off = self.stream_position()? % size; + if off != 0 { + self.seek_relative((size - off) as i64)?; + } + Ok(()) + } +} |