use std::io::Read; /// Decode variable int numbers from a `Read` implementation. /// /// Note: currently overflow checks are only done in debug mode. #[inline] pub fn leb64_from_read(mut r: impl Read) -> Result<(u64, usize), std::io::Error> { let mut b = [0u8; 1]; let mut i = 0; r.read_exact(&mut b)?; i += 1; let mut value = b[0] as u64 & 0x7f; while b[0] & 0x80 != 0 { r.read_exact(&mut b)?; i += 1; debug_assert!(i <= 10, "Would overflow value at 11th iteration"); value += 1; value = (value << 7) + (b[0] as u64 & 0x7f) } Ok((value, i)) } /// Decode variable int numbers. #[inline] pub fn leb64(d: &[u8]) -> (u64, usize) { let mut i = 0; let mut c = d[i]; i += 1; let mut value = c as u64 & 0x7f; while c & 0x80 != 0 { c = d[i]; i += 1; debug_assert!(i <= 10, "Would overflow value at 11th iteration"); value += 1; value = (value << 7) + (c as u64 & 0x7f) } (value, i) }