22 lines · 724 B · Rust
RawDownload
use std::io::Read; /// Decode variable int numbers from a `Read` implementation.#[inline]pub fn leb64_from_read(mut r: impl Read) -> Result<(u64, usize), std::io::Error> {    let mut byte = [0u8; 1];    r.read_exact(&mut byte)?;    let mut c = byte[0];    let mut i = 1;    let mut value = u64::from(c) & 0x7f;    while c & 0x80 != 0 {        r.read_exact(&mut byte)?;        c = byte[0];        i += 1;        value = value            .checked_add(1)            .and_then(|value| value.checked_shl(7))            .and_then(|value| value.checked_add(u64::from(c) & 0x7f))            .ok_or_else(|| std::io::Error::new(std::io::ErrorKind::InvalidData, "LEB64 value overflowed"))?;    }    Ok((value, i))}