frnsc_prefetch/decompress/
mod.rs1use forensic_rs::prelude::ForensicResult;
2
3pub mod lz77;
4pub mod xpress_huff;
5
6#[repr(u32)]
7#[derive(Debug, Clone)]
8pub enum CompressionAlgorithm {
9 CompressionFormatNone = 0x0000,
10 CompressionFormatDefault = 0x0001,
11 CompressionFormatLznt1 = 0x0002,
12 CompressionFormatXpress = 0x0003,
13 CompressionFormatXpressHuff = 0x0004,
14}
15
16impl From<u32> for CompressionAlgorithm {
17 fn from(value: u32) -> Self {
18 match value {
19 1 => CompressionAlgorithm::CompressionFormatDefault,
20 2 => CompressionAlgorithm::CompressionFormatLznt1,
21 3 => CompressionAlgorithm::CompressionFormatXpress,
22 4 => CompressionAlgorithm::CompressionFormatXpressHuff,
23 _ => CompressionAlgorithm::CompressionFormatNone,
24 }
25 }
26}
27
28pub fn decompress(
29 in_buf: &[u8],
30 out_buf: &mut Vec<u8>,
31 algorithm: CompressionAlgorithm,
32) -> ForensicResult<()> {
33 match algorithm {
34 CompressionAlgorithm::CompressionFormatNone => {
35 out_buf.copy_from_slice(in_buf);
36 }
37 CompressionAlgorithm::CompressionFormatDefault => {
38 return Err(forensic_rs::err::ForensicError::Other(
39 "Default compression algorithm not supported".into(),
40 ))
41 }
42 CompressionAlgorithm::CompressionFormatLznt1 => lz77::decompress(in_buf, out_buf)?,
43 CompressionAlgorithm::CompressionFormatXpress => xpress_huff::decompress(in_buf, out_buf)?, CompressionAlgorithm::CompressionFormatXpressHuff => {
45 xpress_huff::decompress(in_buf, out_buf)?
46 }
47 }
48 Ok(())
49}