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#[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}