//! DEFLATE loader. use crate::durandal::err::*; /// Loads a GZIP file header. pub fn load_gzip_header(b: &[u8]) -> ResultS { const FHCRC: u8 = 1 << 1; const FEXTRA: u8 = 1 << 2; const FNAME: u8 = 1 << 3; const FCOMMENT: u8 = 1 << 4; read_data! { 10, LE in b => id = u16[0]; cm = u8[2]; fl = u8[3]; } if id != 0x8B1F || cm != 8 { bail!("not gzip format"); } let mut p = 10; if fl & FEXTRA != 0 { read_data!(p + 2, LE in b => xlen = u16[p] usize;); if p + 2 + xlen > b.len() { bail!("not enough data"); } p += xlen; } if fl & FNAME != 0 { p = skip_zero_terminated_item(&b[p..])?; } if fl & FCOMMENT != 0 { p = skip_zero_terminated_item(&b[p..])?; } if fl & FHCRC != 0 { read_data!(p + 2, LE in b => _crc = u16[p];); p += 2; } Ok(p) } fn skip_zero_terminated_item(b: &[u8]) -> ResultS { if let Some(i) = b.iter().position(|&n| n == 0) { Ok(i) } else { bail!("no end of zero terminated item"); } } // EOF