diff options
-rw-r--r-- | src/bin/parse.rs | 18 | ||||
-rw-r--r-- | src/helper.rs | 2 | ||||
-rw-r--r-- | src/object.rs | 13 |
3 files changed, 20 insertions, 13 deletions
diff --git a/src/bin/parse.rs b/src/bin/parse.rs index d436aad..496f4d3 100644 --- a/src/bin/parse.rs +++ b/src/bin/parse.rs @@ -24,22 +24,22 @@ fn main() -> anyhow::Result<()> { for ob in file.objects { cab.seek(SeekFrom::Start(ob.data_offset))?; - let mut ob_data = cab.by_ref(); //.take(ob.data_size as u64); - eprintln!("{:#?}", ob); + // eprintln!("{:#?}", ob); let typetree = if ob.type_id < 0 { unimplemented!() } else { - file.types - .iter() - .find(|t| t.class_id == ob.type_id) - .expect("unknown type") + // file.types + // .iter() + // .find(|t| t.class_id == ob.type_id) + // .expect("unknown type") + &file.types[ob.type_id as usize] }; - eprintln!("{typetree:#?}"); + // eprintln!("{typetree:#?}"); - let value = read_value(typetree.type_tree.as_ref().unwrap(), e, &mut ob_data)?; + let value = read_value(typetree.type_tree.as_ref().unwrap(), e, &mut cab)?; - eprintln!("{value:#?}") + // eprintln!("{value:#?}") } // eprintln!("{:#?}", file.types); } diff --git a/src/helper.rs b/src/helper.rs index a65d3e8..aada1fd 100644 --- a/src/helper.rs +++ b/src/helper.rs @@ -27,13 +27,13 @@ pub trait ReadExt { 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>; fn read_f32(&mut self, e: Endianness) -> Result<f32>; fn read_f32_be(&mut self) -> Result<f32>; fn read_f32_le(&mut self) -> Result<f32>; fn read_f64(&mut self, e: Endianness) -> Result<f64>; fn read_f64_be(&mut self) -> Result<f64>; fn read_f64_le(&mut self) -> Result<f64>; + fn read_cstr(&mut self) -> Result<String>; } impl<T: Read> ReadExt for T { diff --git a/src/object.rs b/src/object.rs index 5ad1441..5275eb7 100644 --- a/src/object.rs +++ b/src/object.rs @@ -1,7 +1,7 @@ use crate::helper::{AlignExt, Endianness, ReadExt}; use crate::serialized_file::TypeTreeNode; use anyhow::Result; -use log::debug; +use log::{debug, trace}; use std::io::Seek; use std::{collections::BTreeMap, io::Read}; @@ -10,6 +10,7 @@ pub enum Value { Bool(bool), U8(u8), U16(u16), + I16(i16), U32(u32), I32(i32), F32(f32), @@ -28,11 +29,13 @@ pub fn read_value( e: Endianness, data: &mut (impl Read + Seek), ) -> Result<Value> { - match ty.type_string.as_str() { + let r = match ty.type_string.as_str() { "char" => Ok(Value::U8(data.read_u8()?)), "int" => Ok(Value::I32(data.read_i32(e)?)), "unsigned int" => Ok(Value::U32(data.read_u32(e)?)), + "UInt8" => Ok(Value::U8(data.read_u8()?)), "UInt16" => Ok(Value::U16(data.read_u16(e)?)), + "SInt16" => Ok(Value::I16(data.read_i16(e)?)), "SInt64" => Ok(Value::I64(data.read_i64(e)?)), "bool" => Ok(Value::Bool(data.read_u8()? != 0)), "float" => { @@ -63,7 +66,7 @@ pub fn read_value( let Value::I32(size) = read_value(&ty.children[0], e, data)? else { unreachable!() }; - debug!("array of size {size}"); + trace!("array of size {size}"); let mut elems = Vec::new(); for _ in 0..size { elems.push(read_value(&ty.children[1], e, data)?); @@ -83,5 +86,9 @@ pub fn read_value( class: ty.type_string.clone(), }) } + }; + if ty.post_align() { + data.align(4)?; } + r } |