use crate::Result;
use crate::common::errors::DecompressionError;
#[link(name = "kraken_static")]
unsafe extern "C" {
fn Kraken_Decompress(
buffer: *const u8,
bufferSize: usize,
outputBuffer: *mut u8,
outputBufferSize: usize,
) -> i32;
}
pub unsafe fn decompress(
compressed_buffer: &[u8],
output_buffer: &mut Vec<u8>,
size: usize,
) -> Result<i32> {
unsafe {
let mut buffer = vec![0; size * 2];
let result = Kraken_Decompress(
compressed_buffer.as_ptr(),
compressed_buffer.len(),
buffer.as_mut_ptr(),
size,
);
if result < 0 {
return Err(DecompressionError::DecompressionFailed(result).into());
}
let result_usize =
usize::try_from(result).map_err(|_| DecompressionError::BufferSizeOverflow)?;
if result_usize > buffer.len() {
return Err(DecompressionError::BufferSizeOverflow.into());
}
buffer.resize(result_usize, 0);
*output_buffer = buffer;
Ok(result)
}
}