aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bin/parse.rs18
-rw-r--r--src/helper.rs2
-rw-r--r--src/object.rs13
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
}