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 ] , }
11
12#[repr(C)]
13pub struct libdeflate_options {
14 pub sizeof_options: usize,
15 pub malloc_func: Option<unsafe extern "C" fn(arg1: usize) -> *mut ::std::os::raw::c_void>,
16 pub free_func: Option<unsafe extern "C" fn(arg1: *mut ::std::os::raw::c_void)>,
17}
18
19pub const libdeflate_result_LIBDEFLATE_SUCCESS: libdeflate_result = 0;
20pub const libdeflate_result_LIBDEFLATE_BAD_DATA: libdeflate_result = 1;
21pub const libdeflate_result_LIBDEFLATE_SHORT_OUTPUT: libdeflate_result = 2;
22pub const libdeflate_result_LIBDEFLATE_INSUFFICIENT_SPACE: libdeflate_result = 3;
23pub type libdeflate_result = ::std::os::raw::c_uint;
24
25extern "C" {
26 pub fn libdeflate_alloc_decompressor() -> *mut libdeflate_decompressor;
27 pub fn libdeflate_alloc_decompressor_ex(options: *const libdeflate_options) -> *mut libdeflate_decompressor;
28 pub fn libdeflate_free_decompressor(decompressor: *mut libdeflate_decompressor);
29
30 pub fn libdeflate_gzip_decompress(decompressor: *mut libdeflate_decompressor,
31 in_: *const ::std::os::raw::c_void,
32 in_nbytes: usize ,
33 out: *mut ::std::os::raw::c_void,
34 out_nbytes_avail: usize,
35 actual_out_nbytes_ret: *mut usize) -> libdeflate_result;
36
37 pub fn libdeflate_gzip_decompress_ex(decompressor: *mut libdeflate_decompressor,
38 in_: *const ::std::os::raw::c_void,
39 in_nbytes: usize,
40 out: *mut ::std::os::raw::c_void,
41 out_nbytes_avail: usize,
42 actual_in_nbytes_ret: *mut usize,
43 actual_out_nbytes_ret: *mut usize) -> libdeflate_result;
44
45 pub fn libdeflate_zlib_decompress(decompressor: *mut libdeflate_decompressor,
46 in_: *const ::std::os::raw::c_void,
47 in_nbytes: usize,
48 out: *mut ::std::os::raw::c_void,
49 out_nbytes_avail: usize,
50 actual_out_nbytes_ret: *mut usize) -> libdeflate_result;
51
52 pub fn libdeflate_zlib_decompress_ex(decompressor: *mut libdeflate_decompressor,
53 in_: *const ::std::os::raw::c_void,
54 in_nbytes: usize,
55 out: *mut ::std::os::raw::c_void,
56 out_nbytes_avail: usize,
57 actual_in_nbytes_ret: *mut usize,
58 actual_out_nbytes_ret: *mut usize) -> libdeflate_result;
59
60 pub fn libdeflate_deflate_decompress(decompressor: *mut libdeflate_decompressor,
61 in_: *const ::std::os::raw::c_void,
62 in_nbytes: usize,
63 out: *mut ::std::os::raw::c_void,
64 out_nbytes_avail: usize,
65 actual_out_nbytes_ret: *mut usize) -> libdeflate_result;
66
67 pub fn libdeflate_deflate_decompress_ex(decompressor: *mut libdeflate_decompressor,
68 in_: *const ::std::os::raw::c_void,
69 in_nbytes: usize,
70 out: *mut ::std::os::raw::c_void,
71 out_nbytes_avail: usize,
72 actual_in_nbytes_ret: *mut usize,
73 actual_out_nbytes_ret: *mut usize) -> libdeflate_result;
74
75 pub fn libdeflate_alloc_compressor(compression_level: ::std::os::raw::c_int) -> *mut libdeflate_compressor;
76
77 pub fn libdeflate_alloc_compressor_ex(compression_level: ::std::ffi::c_int,
78 options: *const libdeflate_options) -> *mut libdeflate_compressor;
79
80 pub fn libdeflate_deflate_compress_bound(compressor: *mut libdeflate_compressor,
81 in_nbytes: usize) -> usize;
82
83
84 pub fn libdeflate_deflate_compress(compressor: *mut libdeflate_compressor,
85 in_: *const ::std::os::raw::c_void,
86 in_nbytes: usize,
87 out: *mut ::std::os::raw::c_void,
88 out_nbytes_avail: usize) -> usize;
89
90 pub fn libdeflate_zlib_compress_bound(compressor: *mut libdeflate_compressor,
91 in_nbytes: usize) -> usize;
92
93 pub fn libdeflate_zlib_compress(compressor: *mut libdeflate_compressor,
94 in_: *const ::std::os::raw::c_void,
95 in_nbytes: usize,
96 out: *mut ::std::os::raw::c_void,
97 out_nbytes_avail: usize) -> usize;
98
99 pub fn libdeflate_gzip_compress_bound(compressor: *mut libdeflate_compressor,
100 in_nbytes: usize) -> usize;
101
102 pub fn libdeflate_gzip_compress(compressor: *mut libdeflate_compressor,
103 in_: *const ::std::os::raw::c_void,
104 in_nbytes: usize,
105 out: *mut ::std::os::raw::c_void,
106 out_nbytes_avail: usize ) -> usize;
107
108 pub fn libdeflate_free_compressor (compressor : * mut libdeflate_compressor);
109
110 pub fn libdeflate_crc32(crc32: u32,
111 buffer: *const ::std::os::raw::c_void,
112 len: usize) -> u32;
113
114 pub fn libdeflate_adler32(adler32: u32,
115 buffer: *const ::std::os::raw::c_void,
116 len: usize) -> u32;
117
118 pub fn libdeflate_set_memory_allocator(malloc_func: unsafe extern "C" fn(size: usize) -> *mut ::std::os::raw::c_void,
119 free_func: unsafe extern "C" fn(ptr: *mut ::std::os::raw::c_void));
120}
121
122#[cfg(test)]
126mod tests {
127 use super::*;
128
129 const MIN_COMP_LVL: i32 = 0;
130 const MAX_COMP_LVL: i32 = 12;
131
132 #[test]
133 fn can_make_decompressor_at_each_compression_lvl() {
134 unsafe {
135 for lvl in MIN_COMP_LVL..MAX_COMP_LVL+1 {
136 let ptr = libdeflate_alloc_compressor(lvl);
137
138 assert!(!ptr.is_null());
139
140 libdeflate_free_compressor(ptr);
141 }
142 }
143 }
144
145 #[test]
146 fn can_make_decompressor_with_null_malloc_free() {
147 unsafe {
148 let options = libdeflate_options {
149 sizeof_options: std::mem::size_of::<libdeflate_options>(),
150 malloc_func: None,
151 free_func: None,
152 };
153 let ptr = libdeflate_alloc_decompressor_ex(&options);
154
155 assert!(!ptr.is_null());
156
157 libdeflate_free_decompressor(ptr);
158 }
159 }
160
161 #[test]
162 fn making_compressor_with_negative_compression_lvl_fails() {
163 unsafe {
164 let ptr = libdeflate_alloc_compressor(-1);
165 assert!(ptr.is_null());
166 }
167 }
168
169 #[test]
170 fn making_compressor_with_too_large_compression_lvl_fails() {
171 unsafe {
172 let ptr = libdeflate_alloc_compressor(MAX_COMP_LVL+1);
173
174 assert!(ptr.is_null());
175 }
176 }
177
178 #[test]
179 fn can_use_compressor_to_compress_trivially_compressable_data() {
180 unsafe {
181 let in_data: [u8; 1<<16] = [0; 1<<16];
182 let mut out_data: [u8; 1<<16] = [0; 1<<16];
183 let compressor = libdeflate_alloc_compressor(MAX_COMP_LVL);
184 let sz = libdeflate_deflate_compress(compressor,
185 in_data.as_ptr() as *const core::ffi::c_void,
186 in_data.len(),
187 out_data.as_mut_ptr() as *mut core::ffi::c_void,
188 out_data.len());
189 assert_ne!(sz, 0);
190 assert!(sz < 100);
191 }
192 }
193
194 #[test]
195 fn can_call_crc32() {
196 let init = 0;
197 let buf: [u8; 4] = [0x31, 0x33, 0x33, 0x37];
198
199 unsafe {
200 let ret = libdeflate_crc32(init,
201 buf.as_ptr() as *const core::ffi::c_void,
202 buf.len());
203
204 assert_ne!(ret, init);
205 }
206 }
207
208 #[test]
209 fn can_call_adler32() {
210 let init = 0;
211 let buf: [u8; 4] = [0x31, 0x33, 0x33, 0x37];
212
213 unsafe {
214 let ret = libdeflate_adler32(init,
215 buf.as_ptr() as *const core::ffi::c_void,
216 buf.len());
217
218 assert_ne!(ret, init);
219 }
220 }
221}