lzokay_native/
util.rs

1#[cfg(feature = "decompress")]
2use std::io::{self, Read, Seek, SeekFrom};
3
4#[cfg(feature = "decompress")]
5use byteorder::ReadBytesExt;
6
7/// The various errors that can be reported by this crate.
8#[derive(thiserror::Error, Debug)]
9pub enum Error {
10    /// Unknown error
11    #[error("Unknown Error")]
12    Unknown,
13
14    /// Output overrun
15    #[error("Output overrun")]
16    OutputOverrun,
17
18    /// IOError
19    #[error("read or write failed, source: {0}")]
20    IOError(#[from] std::io::Error),
21}
22
23// pub(crate) static mut MAX_255_COUNT: usize = ((!0) as usize / 255 - 2) as usize;
24#[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}