physis/
compression.rs

1// SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4use std::ptr::null_mut;
5
6use libz_rs_sys::*;
7
8pub fn no_header_decompress(in_data: &mut [u8], out_data: &mut [u8]) -> bool {
9    unsafe {
10        let mut strm = z_stream {
11            next_in: null_mut(),
12            avail_in: in_data.len() as u32,
13            total_in: 0,
14            next_out: null_mut(),
15            avail_out: 0,
16            total_out: 0,
17            msg: null_mut(),
18            state: null_mut(),
19            zalloc: None, // the default alloc is fine
20            zfree: None,  // the default free is fine
21            opaque: null_mut(),
22            data_type: 0,
23            adler: 0,
24            reserved: 0,
25        };
26
27        let ret = inflateInit2_(
28            &mut strm,
29            -15,
30            zlibVersion(),
31            core::mem::size_of::<z_stream>() as i32,
32        );
33        if ret != Z_OK {
34            return false;
35        }
36
37        strm.next_in = in_data.as_mut_ptr();
38        strm.avail_out = out_data.len() as u32;
39        strm.next_out = out_data.as_mut_ptr();
40
41        let ret = inflate(&mut strm, Z_NO_FLUSH);
42        if ret != Z_STREAM_END {
43            return false;
44        }
45
46        inflateEnd(&mut strm);
47
48        true
49    }
50}