wkwrap 1.6.0

webKNOSSOS wrapper is a file format designed for large-scale, three-dimensional voxel datasets. It was optimized for high-speed access to data subvolumes, and supports multi-channel data and dataset compression.
Documentation
extern crate lz4 as lz4_crate;
use self::lz4_crate::liblz4;
use Result;

pub fn compress_bound(input_size: usize) -> usize {
    unsafe { liblz4::LZ4_compressBound(input_size as i32) as usize }
}

pub fn compress_hc(src_buf: &[u8], dst_buf: &mut [u8]) -> Result<usize> {
    let src_size = src_buf.len() as i32;
    let dst_capacity = dst_buf.len() as i32;
    let compression_level = 9;

    let dst_len = unsafe {
        liblz4::LZ4_compress_HC(
            std::mem::transmute::<&[u8], &[i8]>(src_buf).as_ptr(),
            std::mem::transmute::<&mut [u8], &mut [i8]>(dst_buf).as_mut_ptr(),
            src_size,
            dst_capacity,
            compression_level,
        )
    };

    match dst_len == 0 {
        true => Err(String::from("Error in LZ4_compress_HC")),
        false => Ok(dst_len as usize),
    }
}

pub fn decompress_safe(src_buf: &[u8], dst_buf: &mut [u8]) -> Result<usize> {
    let compressed_size = src_buf.len() as i32;
    let max_decompressed_size = dst_buf.len() as i32;

    let dst_len = unsafe {
        liblz4::LZ4_decompress_safe(
            std::mem::transmute::<&[u8], &[i8]>(src_buf).as_ptr(),
            std::mem::transmute::<&mut [u8], &mut [i8]>(dst_buf).as_mut_ptr(),
            compressed_size,
            max_decompressed_size,
        )
    };

    match dst_len < 0 {
        true => Err(String::from("Error in LZ4_decompress_safe")),
        false => Ok(dst_len as usize),
    }
}