parent
4777affc2b
commit
09151b6579
@ -0,0 +1,56 @@
|
||||
use std::str;
|
||||
|
||||
use nom::IResult;
|
||||
use nom::bytes::complete::{tag, take};
|
||||
use nom::multi::count;
|
||||
use nom::number::complete::*;
|
||||
use nom::sequence::tuple;
|
||||
|
||||
use crate::parsers::common::{sjis_to_string, take_cstring};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct ParamdefHeader {
|
||||
pub file_size: u32,
|
||||
pub header_size: u16,
|
||||
pub data_version: u16,
|
||||
pub num_entries: u16,
|
||||
pub entry_size: u16,
|
||||
pub param_name: Vec<u8>,
|
||||
pub endianness: u8,
|
||||
pub unicode: u8,
|
||||
pub format_version: u16,
|
||||
}
|
||||
|
||||
fn parse_header(i: &[u8]) -> IResult<&[u8], ParamdefHeader> {
|
||||
let p_u32 = if i[0x2C] == 0xFF { be_u32 } else { le_u32 };
|
||||
let p_u16 = if i[0x2C] == 0xFF { be_u16 } else { le_u16 };
|
||||
let (i, (file_size, header_size, data_version, num_entries, entry_size)) =
|
||||
tuple((p_u32, p_u16, p_u16, p_u16, p_u16))(i)?;
|
||||
let (_, param_name) = take_cstring(&i[..0x20])?;
|
||||
let (i, (endianness, unicode, format_version)) =
|
||||
tuple((le_u8, le_u8, p_u16))(&i[0x20..])?;
|
||||
Ok((
|
||||
i,
|
||||
ParamdefHeader {
|
||||
file_size,
|
||||
header_size,
|
||||
data_version,
|
||||
num_entries,
|
||||
entry_size,
|
||||
param_name: param_name.to_vec(),
|
||||
endianness,
|
||||
unicode,
|
||||
format_version,
|
||||
}
|
||||
))
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Paramdef {
|
||||
pub header: ParamdefHeader,
|
||||
}
|
||||
|
||||
pub fn parse(i: &[u8]) -> IResult<&[u8], Paramdef> {
|
||||
let (i, header) = parse_header(i)?;
|
||||
Ok((i, Paramdef { header }))
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
use std::path;
|
||||
|
||||
use nom::Err::{Error as NomError, Failure as NomFailure};
|
||||
|
||||
use crate::parsers::paramdef;
|
||||
use crate::unpackers::errors::UnpackError;
|
||||
use crate::utils::fs as utils_fs;
|
||||
|
||||
pub fn load_paramdef_file(paramdef_path: &str) -> Result<paramdef::Paramdef, UnpackError> {
|
||||
let paramdef_data = utils_fs::open_file_to_vec(path::Path::new(paramdef_path))?;
|
||||
Ok(load_paramdef(¶mdef_data)?)
|
||||
}
|
||||
|
||||
pub fn load_paramdef(paramdef_data: &[u8]) -> Result<paramdef::Paramdef, UnpackError> {
|
||||
match paramdef::parse(paramdef_data) {
|
||||
Ok((_, result)) => Ok(result),
|
||||
Err(NomError(e)) | Err(NomFailure(e)) => Err(UnpackError::parsing_err("PARAMDEF", e.1)),
|
||||
e => Err(UnpackError::Unknown(format!("Unknown error: {:?}", e))),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn print_paramdef(paramdef: ¶mdef::Paramdef) {
|
||||
println!("{:?}", paramdef);
|
||||
}
|
Loading…
Reference in new issue