minilz4 0.2.0

Minimal interface for the LZ4 compression library frame format
Documentation
use libc::{c_char, c_uint, c_void, size_t};

pub const LZ4F_VERSION: c_uint = 100;

#[derive(Clone, Copy, Debug)]
#[repr(u32)]
pub enum BlockSize {
    Default  = 0,
    Max64KB  = 4,
    Max256KB = 5,
    Max1MB   = 6,
    Max4MB   = 7,
}
impl BlockSize {
    pub fn bytes(&self) -> usize {
        match self {
            BlockSize::Default => 64 * 1024,
            BlockSize::Max64KB => 64 * 1024,
            BlockSize::Max256KB => 256 * 1024,
            BlockSize::Max1MB => 1024 * 1024,
            BlockSize::Max4MB => 4096 * 1024,
        }
    }
}

#[derive(Clone, Copy)]
#[repr(u32)]
pub enum BlockMode {
    Linked      = 0,
    Independent = 1,
}

#[derive(Clone, Copy)]
#[repr(u32)]
pub enum ContentChecksum {
    NoChecksum      = 0,
    ChecksumEnabled = 1,
}

#[repr(C)]
pub struct LZ4FFrameInfo {
    pub block_size_id:         BlockSize,
    pub block_mode:            BlockMode,
    pub content_checksum_flag: ContentChecksum,
    pub reserved:              [c_uint; 5],
}

#[repr(C)]
pub struct LZ4FPreferences {
    pub frame_info:        LZ4FFrameInfo,
    pub compression_level: c_uint,
    pub auto_flush:        c_uint,
    pub reserved:          [c_uint; 4],
}

#[repr(C)]
pub struct LZ4FCompressOptions {
    pub stable_src: c_uint,
    pub reserved:   [c_uint; 3],
}

#[repr(C)]
pub struct LZ4FDecompressOptions {
    pub stable_dst: c_uint,
    pub reserved:   [c_uint; 3],
}

#[derive(Clone, Copy)]
#[repr(C)]
pub struct LZ4FCDict(pub *mut c_void);
unsafe impl Send for LZ4FCDict {}
unsafe impl Sync for LZ4FCDict {}

pub type LZ4FCompressionContextPtr = *mut c_void;
pub type LZ4FDecompressionContextPtr = *mut c_void;

pub type LZ4FErrorCode = size_t;

extern "C" {
    pub fn LZ4F_isError(code: size_t) -> c_uint;
    pub fn LZ4F_getErrorName(code: size_t) -> *const c_char;
    pub fn LZ4F_createCompressionContext(
        ctx: &mut LZ4FCompressionContextPtr, version: c_uint,
    ) -> LZ4FErrorCode;
    pub fn LZ4F_freeCompressionContext(ctx: LZ4FCompressionContextPtr) -> LZ4FErrorCode;
    pub fn LZ4F_compressBegin(
        ctx: LZ4FCompressionContextPtr, dstBuffer: *mut u8, dstMaxSize: size_t,
        preferencesPtr: *const LZ4FPreferences,
    ) -> LZ4FErrorCode;
    pub fn LZ4F_compressBound(
        srcSize: size_t, preferencesPtr: *const LZ4FPreferences,
    ) -> LZ4FErrorCode;
    pub fn LZ4F_compressUpdate(
        ctx: LZ4FCompressionContextPtr, dstBuffer: *mut u8, dstMaxSize: size_t,
        srcBuffer: *const u8, srcSize: size_t, compressOptionsPtr: *const LZ4FCompressOptions,
    ) -> size_t;
    pub fn LZ4F_flush(
        ctx: LZ4FCompressionContextPtr, dstBuffer: *mut u8, dstMaxSize: size_t,
        compressOptionsPtr: *const LZ4FCompressOptions,
    ) -> LZ4FErrorCode;
    pub fn LZ4F_compressEnd(
        ctx: LZ4FCompressionContextPtr, dstBuffer: *mut u8, dstMaxSize: size_t,
        compressOptionsPtr: *const LZ4FCompressOptions,
    ) -> LZ4FErrorCode;
    pub fn LZ4F_createDecompressionContext(
        ctx: &mut LZ4FDecompressionContextPtr, version: c_uint,
    ) -> LZ4FErrorCode;
    pub fn LZ4F_freeDecompressionContext(ctx: LZ4FDecompressionContextPtr) -> LZ4FErrorCode;
    pub fn LZ4F_decompress(
        ctx: LZ4FDecompressionContextPtr, dstBuffer: *mut u8, dstSizePtr: &mut size_t,
        srcBuffer: *const u8, srcSizePtr: &mut size_t, optionsPtr: *const LZ4FDecompressOptions,
    ) -> LZ4FErrorCode;
}