use std::os::raw::{c_int, c_ulong};
extern "C" {
pub fn lzmaspec_uncompress(
dest: *mut u8,
dest_len: *mut c_ulong,
source: *const u8,
source_len: c_ulong,
lc: c_int,
lp: c_int,
pb: c_int,
dictionary_size: c_int,
offset: c_int,
) -> c_int;
}
pub fn decompress_lzma(
source: &[u8],
lc: u32,
lp: u32,
pb: u32,
dictionary_size: u32,
offset: usize,
max_output_size: usize,
) -> Result<Vec<u8>, i32> {
if offset >= source.len() {
return Err(-1); }
let mut output = vec![0u8; max_output_size];
let mut dest_len = max_output_size as c_ulong;
let result = unsafe {
lzmaspec_uncompress(
output.as_mut_ptr(),
&mut dest_len,
source.as_ptr(),
source.len() as c_ulong,
lc as c_int,
lp as c_int,
pb as c_int,
dictionary_size as c_int,
offset as c_int,
)
};
if result == 0 && dest_len > 0 {
output.truncate(dest_len as usize);
Ok(output)
} else {
Err(result)
}
}