LZ7 compress
This commit is contained in:
parent
54a460b514
commit
543a4c69a8
|
@ -9,6 +9,7 @@ edition = "2021"
|
|||
byteorder = "*"
|
||||
cdtypes = {path = "../cdtypes"}
|
||||
clap = {version = "*", features = ["derive"]}
|
||||
lz4 = "*"
|
||||
paste = "*"
|
||||
roxmltree = "*"
|
||||
tool_helper = {path = "../tool_helper"}
|
|
@ -1,6 +1,7 @@
|
|||
use super::File;
|
||||
use std::path::PathBuf;
|
||||
use byteorder::{ByteOrder, BigEndian, LittleEndian};
|
||||
use lz4::EncoderBuilder;
|
||||
use tool_helper::{Error, format_if_error, read_file};
|
||||
|
||||
#[repr(packed)]
|
||||
|
@ -17,14 +18,38 @@ impl OverlayHeader {
|
|||
}
|
||||
|
||||
pub fn load_from(file_path: PathBuf) -> Result<File, Error> {
|
||||
let content = read_file(&file_path)?;
|
||||
let overlay_header_size = std::mem::size_of::<OverlayHeader>();
|
||||
let mut content = read_file(&file_path)?;
|
||||
|
||||
if content.len() < std::mem::size_of::<OverlayHeader>() {
|
||||
if content.len() < overlay_header_size {
|
||||
return Err(Error::from_text(format!("Overlay {} has no header!", file_path.to_string_lossy())));
|
||||
}
|
||||
|
||||
let lba_count = LittleEndian::read_u16(&content[OverlayHeader::lba_count_offset()..]);
|
||||
println!("Dino: {}", lba_count);
|
||||
let lba_count = LittleEndian::read_u16(&content[OverlayHeader::lba_count_offset()..]) as usize;
|
||||
let lba_header_size = lba_count*std::mem::size_of::<u32>();
|
||||
let lba_header = &mut content[overlay_header_size..(overlay_header_size+lba_header_size)];
|
||||
|
||||
if lba_header.is_empty() {
|
||||
return Err(Error::from_text(format!("LBA header of overlay {} is smaller then {} elements", file_path.to_string_lossy(), lba_count)));
|
||||
}
|
||||
|
||||
let mut count = 0;
|
||||
for byte in lba_header {
|
||||
*byte = count as u8;
|
||||
count += 1;
|
||||
}
|
||||
|
||||
let mut lz4_encoder = EncoderBuilder::new().level(16).build(Vec::<u8>::new())?;
|
||||
|
||||
std::io::copy(&mut&content[..], &mut lz4_encoder)?;
|
||||
let (output, result) = lz4_encoder.finish();
|
||||
|
||||
match result {
|
||||
Ok(()) => println!("Wuff: {}", output.len()),
|
||||
Err(error) => {
|
||||
return Err(Error::from_error(error));
|
||||
}
|
||||
}
|
||||
|
||||
Err(Error::not_implemented("load_from overlay"))
|
||||
}
|
Loading…
Reference in New Issue