LZ7 compress

This commit is contained in:
Jaby 2022-12-06 03:12:31 +01:00
parent 54a460b514
commit 543a4c69a8
2 changed files with 30 additions and 4 deletions

View File

@ -9,6 +9,7 @@ edition = "2021"
byteorder = "*" byteorder = "*"
cdtypes = {path = "../cdtypes"} cdtypes = {path = "../cdtypes"}
clap = {version = "*", features = ["derive"]} clap = {version = "*", features = ["derive"]}
lz4 = "*"
paste = "*" paste = "*"
roxmltree = "*" roxmltree = "*"
tool_helper = {path = "../tool_helper"} tool_helper = {path = "../tool_helper"}

View File

@ -1,6 +1,7 @@
use super::File; use super::File;
use std::path::PathBuf; use std::path::PathBuf;
use byteorder::{ByteOrder, BigEndian, LittleEndian}; use byteorder::{ByteOrder, BigEndian, LittleEndian};
use lz4::EncoderBuilder;
use tool_helper::{Error, format_if_error, read_file}; use tool_helper::{Error, format_if_error, read_file};
#[repr(packed)] #[repr(packed)]
@ -17,14 +18,38 @@ impl OverlayHeader {
} }
pub fn load_from(file_path: PathBuf) -> Result<File, Error> { 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()))); 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()..]); let lba_count = LittleEndian::read_u16(&content[OverlayHeader::lba_count_offset()..]) as usize;
println!("Dino: {}", lba_count); 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")) Err(Error::not_implemented("load_from overlay"))
} }