1#[cfg(feature = "decompress")]
2use std::io::{self, Read, Seek, SeekFrom};
3
4#[cfg(feature = "decompress")]
5use byteorder::ReadBytesExt;
6
7#[derive(thiserror::Error, Debug)]
9pub enum Error {
10 #[error("Unknown Error")]
12 Unknown,
13
14 #[error("Output overrun")]
16 OutputOverrun,
17
18 #[error("read or write failed, source: {0}")]
20 IOError(#[from] std::io::Error),
21}
22
23#[cfg(feature = "compress")]
25pub static mut M1_MAX_OFFSET: u32 = 0x400;
26#[cfg(feature = "compress")]
27pub static mut M2_MAX_OFFSET: u32 = 0x800;
28#[cfg(feature = "compress")]
29pub static mut M3_MAX_OFFSET: u32 = 0x4000;
30#[cfg(feature = "compress")]
31pub static mut M2_MIN_LEN: u32 = 3;
32#[cfg(feature = "compress")]
33pub static mut M2_MAX_LEN: u32 = 8;
34#[cfg(feature = "compress")]
35pub static mut M3_MAX_LEN: u32 = 33;
36#[cfg(feature = "compress")]
37pub static mut M4_MAX_LEN: u32 = 9;
38#[cfg(feature = "compress")]
39pub static mut M1_MARKER: u32 = 0;
40#[cfg(any(feature = "compress", feature = "decompress"))]
41pub const M3_MARKER: u32 = 0x20;
42#[cfg(any(feature = "compress", feature = "decompress"))]
43pub const M4_MARKER: u32 = 0x10;
44
45#[cfg(feature = "decompress")]
46pub fn peek_u8<I>(reader: &mut I) -> io::Result<u8>
47where
48 I: Read + Seek,
49{
50 let pos = reader.stream_position()?;
51 let ret = reader.read_u8()?;
52 reader.seek(SeekFrom::Start(pos))?;
53 Ok(ret)
54}
55
56#[cfg(feature = "decompress")]
57pub fn read_bytes<I>(reader: &mut I, size: usize) -> io::Result<Vec<u8>>
58where
59 I: Read + Seek,
60{
61 let mut buf = vec![0u8; size];
62 reader.read_exact(&mut buf)?;
63 Ok(buf)
64}
65
66#[cfg(feature = "decompress")]
67pub fn consume_zero_byte_length_stream<I>(reader: &mut I) -> Result<u64, crate::Error>
68where
69 I: Read + Seek,
70{
71 let old_pos = reader.stream_position()?;
72
73 while peek_u8(reader)? == 0 {
74 reader.seek(SeekFrom::Current(1))?;
75 }
76
77 let offset = reader.stream_position()? - old_pos;
78
79 Ok(offset)
80}