libdeflate_sys/
lib.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4#![allow(dead_code)]
5#![allow(bad_style)]
6
7#[repr(C)]
8pub struct libdeflate_compressor { _unused : [ u8 ; 0 ] , }
9#[repr(C)]
10pub struct libdeflate_decompressor { _unused : [ u8 ; 0 ] , }
11pub const libdeflate_result_LIBDEFLATE_SUCCESS: libdeflate_result = 0;
12pub const libdeflate_result_LIBDEFLATE_BAD_DATA: libdeflate_result = 1;
13pub const libdeflate_result_LIBDEFLATE_SHORT_OUTPUT: libdeflate_result = 2;
14pub const libdeflate_result_LIBDEFLATE_INSUFFICIENT_SPACE: libdeflate_result = 3;
15pub type libdeflate_result = u32 ;
16
17extern "C" {
18    pub fn libdeflate_alloc_decompressor() -> *mut libdeflate_decompressor;
19    pub fn libdeflate_free_decompressor(decompressor: *mut libdeflate_decompressor);
20
21    pub fn libdeflate_gzip_decompress(decompressor: *mut libdeflate_decompressor,
22                                      in_: *const ::std::os::raw::c_void,
23                                      in_nbytes: usize ,
24                                      out: *mut ::std::os::raw::c_void,
25                                      out_nbytes_avail: usize,
26                                      actual_out_nbytes_ret: *mut usize) -> libdeflate_result;
27
28    pub fn libdeflate_zlib_decompress(decompressor: *mut libdeflate_decompressor,
29                                      in_: *const ::std::os::raw::c_void,
30                                      in_nbytes: usize,
31                                      out: *mut ::std::os::raw::c_void,
32                                      out_nbytes_avail: usize,
33                                      actual_out_nbytes_ret: *mut usize) -> libdeflate_result;
34
35    pub fn libdeflate_deflate_decompress(decompressor: *mut libdeflate_decompressor,
36                                         in_: *const ::std::os::raw::c_void,
37                                         in_nbytes: usize,
38                                         out: *mut ::std::os::raw::c_void,
39                                         out_nbytes_avail: usize,
40                                         actual_out_nbytes_ret: *mut usize) -> libdeflate_result;
41
42    pub fn libdeflate_alloc_compressor(compression_level: ::std::os::raw::c_int) -> *mut libdeflate_compressor;
43
44    pub fn libdeflate_deflate_compress_bound(compressor: *mut libdeflate_compressor,
45                                             in_nbytes: usize) -> usize;
46
47
48    pub fn libdeflate_deflate_compress(compressor: *mut libdeflate_compressor,
49                                       in_: *const ::std::os::raw::c_void,
50                                       in_nbytes: usize,
51                                       out: *mut ::std::os::raw::c_void,
52                                       out_nbytes_avail: usize) -> usize;
53
54    pub fn libdeflate_zlib_compress_bound(compressor: *mut libdeflate_compressor,
55                                          in_nbytes: usize) -> usize;
56
57    pub fn libdeflate_zlib_compress(compressor: *mut libdeflate_compressor,
58                                    in_: *const ::std::os::raw::c_void,
59                                    in_nbytes: usize,
60                                    out: *mut ::std::os::raw::c_void,
61                                    out_nbytes_avail: usize) -> usize;
62
63    pub fn libdeflate_gzip_compress_bound(compressor: *mut libdeflate_compressor,
64                                          in_nbytes: usize) -> usize;
65
66    pub fn libdeflate_gzip_compress(compressor: *mut libdeflate_compressor,
67                                    in_: *const ::std::os::raw::c_void,
68                                    in_nbytes: usize,
69                                    out: *mut ::std::os::raw::c_void,
70                                    out_nbytes_avail: usize ) -> usize;
71
72    pub fn libdeflate_free_compressor (compressor : * mut libdeflate_compressor);
73
74    pub fn libdeflate_crc32(crc32: u32,
75                            buffer: *const ::std::os::raw::c_void,
76                            len: usize) -> u32;
77
78    pub fn libdeflate_adler32(adler32: u32,
79                              buffer: *const ::std::os::raw::c_void,
80                              len: usize) -> u32;
81
82    pub fn libdeflate_set_memory_allocator(malloc_func: unsafe extern "C" fn(size: usize) -> *mut ::std::os::raw::c_void,
83                                           free_func: unsafe extern "C" fn(ptr: *mut ::std::os::raw::c_void));
84}
85
86// Basic tests for Rust-to-C bindings. These tests are just for quick
87// internal checks to make sure that the bindgen build script built
88// something sane-looking. User-facing tests are in `tests/`
89#[cfg(test)]
90mod tests {
91    use super::*;
92
93    const MIN_COMP_LVL: i32 = 0;
94    const MAX_COMP_LVL: i32 = 12;
95
96    #[test]
97    fn can_make_decompressor_at_each_compression_lvl() {
98        unsafe {
99            for lvl in MIN_COMP_LVL..MAX_COMP_LVL+1 {
100                let ptr = libdeflate_alloc_compressor(lvl);
101
102                assert!(!ptr.is_null());
103
104                libdeflate_free_compressor(ptr);
105            }
106        }
107    }
108
109    #[test]
110    fn making_compressor_with_negative_compression_lvl_fails() {
111        unsafe {
112            let ptr = libdeflate_alloc_compressor(-1);
113            assert!(ptr.is_null());
114        }
115    }
116
117    #[test]
118    fn making_compressor_with_too_large_compression_lvl_fails() {
119        unsafe {
120            let ptr = libdeflate_alloc_compressor(MAX_COMP_LVL+1);
121
122            assert!(ptr.is_null());
123        }
124    }
125
126    #[test]
127    fn can_use_compressor_to_compress_trivially_compressable_data() {
128        unsafe {
129            let in_data: [u8; 1<<16] = [0; 1<<16];
130            let mut out_data: [u8; 1<<16] = [0; 1<<16];
131            let compressor = libdeflate_alloc_compressor(MAX_COMP_LVL);
132            let sz = libdeflate_deflate_compress(compressor,
133                                                 in_data.as_ptr() as *const core::ffi::c_void,
134                                                 in_data.len(),
135                                                 out_data.as_mut_ptr() as *mut core::ffi::c_void,
136                                                 out_data.len());
137            assert_ne!(sz, 0);
138            assert!(sz < 100);
139        }
140    }
141
142    #[test]
143    fn can_call_crc32() {
144        let init = 0;
145        let buf: [u8; 4] = [0x31, 0x33, 0x33, 0x37];
146
147        unsafe {
148            let ret = libdeflate_crc32(init,
149                                       buf.as_ptr() as *const core::ffi::c_void,
150                                       buf.len());
151
152            assert_ne!(ret, init);
153        }
154    }
155
156    #[test]
157    fn can_call_adler32() {
158        let init = 0;
159        let buf: [u8; 4] = [0x31, 0x33, 0x33, 0x37];
160
161        unsafe {
162            let ret = libdeflate_adler32(init,
163                                         buf.as_ptr() as *const core::ffi::c_void,
164                                         buf.len());
165
166            assert_ne!(ret, init);
167        }
168    }
169}