Use lz4_flex

This commit is contained in:
widberg 2026-07-05 14:14:57 -04:00
parent 82da18c6f4
commit a91aab85bc
3 changed files with 13 additions and 51 deletions

21
Cargo.lock generated
View file

@ -133,7 +133,7 @@ dependencies = [
"impl-trait-for-tuples",
"indexmap",
"itertools",
"lz4",
"lz4_flex",
"mimalloc",
"num-traits",
"pastey",
@ -709,23 +709,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f"
[[package]]
name = "lz4"
version = "1.28.1"
name = "lz4_flex"
version = "0.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4"
dependencies = [
"lz4-sys",
]
[[package]]
name = "lz4-sys"
version = "1.11.1+lz4-1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6"
dependencies = [
"cc",
"libc",
]
checksum = "373f5eceeeab7925e0c1098212f2fbc4d416adec9d35051a6ab251e824c1854a"
[[package]]
name = "manyhow"

View file

@ -23,7 +23,7 @@ hound = "3.5.1"
impl-trait-for-tuples = "0.2.2"
indexmap = { version = "2.0.0", features = ["serde"] }
itertools = "0.14.0"
lz4 = "1.24.0"
lz4_flex = { version = "0.11", default-features = false, features = ["std"] }
num-traits = "0.2.15"
pastey = "0.2.1"
petgraph = "0.8.1"

View file

@ -39,23 +39,7 @@ pub fn lz4_decompress_body_parser(
#[binrw::writer(writer)]
pub fn lz4_compress_data_writer(data: &[u8]) -> BinResult<()> {
// TODO: Not the same parameters used by the game.
let compress_bound = unsafe { lz4::liblz4::LZ4_compressBound(data.len() as i32) as usize };
let mut compressed_buffer: Vec<u8> = Vec::with_capacity(compress_bound);
unsafe {
let result = lz4::liblz4::LZ4_compress_default(
data.as_ptr() as *const i8,
compressed_buffer.as_mut_ptr() as *mut i8,
data.len() as i32,
compressed_buffer.capacity() as i32,
);
if result < 0 {
return BinResult::Err(binrw::Error::AssertFail {
pos: writer.stream_position()?,
message: format!("LZ4 compression failed with code {}", result),
});
}
compressed_buffer.set_len(result as usize);
}
let compressed_buffer = lz4_flex::block::compress(data);
writer.write_all(&compressed_buffer)?;
Ok(())
}
@ -95,22 +79,13 @@ pub fn lz4_decompress_data_parser(
if compressed_size != 0 {
let compressed_buffer =
Vec::<u8>::read_args(reader, args! { count: compressed_size as usize })?;
let mut decompressed_buffer: Vec<u8> = Vec::with_capacity(decompressed_size as usize);
unsafe {
let result = lz4::liblz4::LZ4_decompress_safe(
compressed_buffer.as_ptr() as *const i8,
decompressed_buffer.as_mut_ptr() as *mut i8,
compressed_size as i32,
decompressed_size as i32,
);
if result < 0 {
return BinResult::Err(binrw::Error::AssertFail {
pos: reader.stream_position()?,
message: format!("LZ4 decompression failed with code {}", result),
});
}
decompressed_buffer.set_len(result as usize);
}
let decompressed_buffer =
lz4_flex::block::decompress(&compressed_buffer, decompressed_size as usize).map_err(
|e| binrw::Error::AssertFail {
pos: reader.stream_position().unwrap_or_default(),
message: format!("LZ4 decompression failed: {}", e),
},
)?;
if decompressed_buffer.len() != decompressed_size as usize {
return BinResult::Err(binrw::Error::AssertFail {
pos: reader.stream_position()?,