use std::ptr;
pub const COMPRESS_ACTION_IDENTITY: u16 = 0;
pub const COMPRESS_ACTION_COMPRESS: u16 = 1;
pub const COMPRESS_ACTION_DECOMPRESS: u16 = 2;
pub const COMPRESS_OVERRUN: usize = 1024;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct CompressIdentity {
pub id: u32,
pub memory: u32,
pub name: *const u8,
pub version: *const u8,
pub date: *const u8,
pub copyright: *const u8,
pub author: *const u8,
}
unsafe extern "C" {
pub unsafe fn lzrw1_compress(
action: u16,
wrk_mem: *mut u8,
src_adr: *const u8,
src_len: u32,
dst_adr: *mut u8,
dst_len: *mut u32,
);
pub unsafe fn lzrw1a_compress(
action: u16,
wrk_mem: *mut u8,
src_adr: *const u8,
src_len: u32,
dst_adr: *mut u8,
dst_len: *mut u32,
);
pub unsafe fn lzrw2_compress(
action: u16,
wrk_mem: *mut u8,
src_adr: *const u8,
src_len: u32,
dst_adr: *mut u8,
dst_len: *mut u32,
);
pub unsafe fn lzrw3_compress(
action: u16,
wrk_mem: *mut u8,
src_adr: *const u8,
src_len: u32,
dst_adr: *mut u8,
dst_len: *mut u32,
);
pub unsafe fn lzrw3a_compress(
action: u16,
wrk_mem: *mut u8,
src_adr: *const u8,
src_len: u32,
dst_adr: *mut u8,
dst_len: *mut u32,
);
pub unsafe fn lzrw5_compress(
action: u16,
wrk_mem: *mut u8,
src_adr: *const u8,
src_len: u32,
dst_adr: *mut u8,
dst_len: *mut u32,
);
}
pub type CompressFn = unsafe extern "C" fn(
action: u16,
wrk_mem: *mut u8,
src_adr: *const u8,
src_len: u32,
dst_adr: *mut u8,
dst_len: *mut u32,
);
pub fn get_wrk_mem_size(compress_fn: CompressFn) -> usize {
let mut identity_addr: usize = 0;
unsafe {
compress_fn(
COMPRESS_ACTION_IDENTITY,
ptr::null_mut(),
ptr::null(),
0,
ptr::null_mut(),
&mut identity_addr as *mut usize as *mut u32,
);
}
if identity_addr == 0 {
return 0;
}
let identity_ptr = identity_addr as *const CompressIdentity;
unsafe { (*identity_ptr).memory as usize }
}