frnsc_prefetch/decompress/
mod.rs

1use 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)?, // Can't happen
44        CompressionAlgorithm::CompressionFormatXpressHuff => {
45            xpress_huff::decompress(in_buf, out_buf)?
46        }
47    }
48    Ok(())
49}