mod bit;
mod crc32;
mod fixed_tables;
#[allow(clippy::module_inception)] mod gzip;
mod huffman;
mod inflate;
mod zlib;
#[cfg(test)]
mod tests;
use alloc::vec::Vec;
pub use crate::error::DecompressError;
pub fn decompress_gzip(
data: &[u8],
max_out: usize,
) -> Result<Vec<u8>, DecompressError> {
gzip::decompress_member_owned(data, max_out)
}
pub(crate) fn decompress_gzip_into(
data: &[u8],
max_out: usize,
out: &mut Vec<u8>,
) -> Result<(), DecompressError> {
gzip::decompress_member(data, max_out, out)
}
pub fn decompress_http_deflate(
data: &[u8],
max_out: usize,
) -> Result<Vec<u8>, DecompressError> {
match zlib::decompress_owned(data, max_out) {
Ok(out) => Ok(out),
Err(DecompressError::LimitExceeded) => Err(DecompressError::LimitExceeded),
Err(DecompressError::InvalidInput) => decompress_raw_deflate(data, max_out),
}
}
pub(crate) fn decompress_http_deflate_into(
data: &[u8],
max_out: usize,
out: &mut Vec<u8>,
) -> Result<(), DecompressError> {
match zlib::decompress(data, max_out, out) {
Ok(()) => Ok(()),
Err(DecompressError::LimitExceeded) => Err(DecompressError::LimitExceeded),
Err(DecompressError::InvalidInput) => {
out.clear();
decompress_raw_deflate_into(data, max_out, out)
},
}
}
pub fn decompress_raw_deflate(
data: &[u8],
max_out: usize,
) -> Result<Vec<u8>, DecompressError> {
let mut none = inflate::RunningChecksum::None;
let (out, _) = inflate::inflate_owned(data, max_out, &mut none)?;
Ok(out)
}
pub(crate) fn decompress_raw_deflate_into(
data: &[u8],
max_out: usize,
out: &mut Vec<u8>,
) -> Result<(), DecompressError> {
let mut none = inflate::RunningChecksum::None;
let _ = inflate::inflate(data, max_out, &mut none, out)?;
Ok(())
}