1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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;
}