Maraiah/source/marathon/defl.rs

63 lines
1.1 KiB
Rust

//! DEFLATE loader.
use crate::durandal::err::*;
/// Loads a GZIP file header.
pub fn load_gzip_header(b: &[u8]) -> ResultS<usize>
{
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<usize>
{
if let Some(i) = b.iter().position(|&n| n == 0) {
Ok(i)
} else {
bail!("no end of zero terminated item");
}
}
// EOF