use lzrw_sys::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum LzrwAlgorithm {
Lzrw1,
Lzrw1a,
Lzrw2,
Lzrw3,
Lzrw3a,
Lzrw5,
}
fn get_compress_fn(algorithm: LzrwAlgorithm) -> CompressFn {
match algorithm {
LzrwAlgorithm::Lzrw1 => lzrw1_compress,
LzrwAlgorithm::Lzrw1a => lzrw1a_compress,
LzrwAlgorithm::Lzrw2 => lzrw2_compress,
LzrwAlgorithm::Lzrw3 => lzrw3_compress,
LzrwAlgorithm::Lzrw3a => lzrw3a_compress,
LzrwAlgorithm::Lzrw5 => lzrw5_compress,
}
}
pub fn compress(algorithm: LzrwAlgorithm, src: &[u8]) -> Vec<u8> {
let compress_fn = get_compress_fn(algorithm);
let wrk_mem_size = get_wrk_mem_size(compress_fn);
let mut working_mem = vec![0u8; wrk_mem_size];
let mut out = vec![0u8; src.len() + COMPRESS_OVERRUN];
let mut out_len = 0;
unsafe {
compress_fn(
COMPRESS_ACTION_COMPRESS,
working_mem.as_mut_ptr(),
src.as_ptr(),
src.len() as u32,
out.as_mut_ptr(),
&mut out_len,
);
}
out.truncate(out_len as usize);
out
}
pub fn decompress(algorithm: LzrwAlgorithm, src: &[u8]) -> Vec<u8> {
let compress_fn = get_compress_fn(algorithm);
let wrk_mem_size = get_wrk_mem_size(compress_fn);
let mut working_mem = vec![0u8; wrk_mem_size];
let mut out = vec![0u8; src.len() * 10];
let mut out_len = 0;
unsafe {
compress_fn(
COMPRESS_ACTION_DECOMPRESS,
working_mem.as_mut_ptr(),
src.as_ptr() as *mut u8,
src.len() as u32,
out.as_mut_ptr(),
&mut out_len,
);
}
out.truncate(out_len as usize);
out
}