aboutsummaryrefslogtreecommitdiff
path: root/src/helper.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-02-10 17:38:55 +0100
committermetamuffin <metamuffin@disroot.org>2025-02-10 17:38:55 +0100
commitd8d00eb146241978ef21ed4d6c35ac9c68b1a86e (patch)
treec075bd4f9aa17e30aa05aa74db23377c72cf6823 /src/helper.rs
parent3dade4b3815db7bfa1baf3fbb4fb332b29aba363 (diff)
downloadunity-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.rs35
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(())
+ }
+}