use super::UNDEF_ADDR;
pub(crate) fn read_le_uint(buf: &[u8], n: usize) -> u64 {
let n = n.min(8).min(buf.len());
let mut tmp = [0u8; 8];
tmp[..n].copy_from_slice(&buf[..n]);
u64::from_le_bytes(tmp)
}
pub(crate) fn read_le_addr(buf: &[u8], n: usize) -> u64 {
let n = n.min(8).min(buf.len());
if n != 0 && buf[..n].iter().all(|&b| b == 0xFF) {
UNDEF_ADDR
} else {
read_le_uint(buf, n)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn uint_basic_widths() {
assert_eq!(read_le_uint(&[0x01, 0x02, 0x03, 0x04], 4), 0x0403_0201);
assert_eq!(
read_le_uint(&[1, 0, 0, 0, 0, 0, 0, 0x80], 8),
0x8000_0000_0000_0001
);
assert_eq!(read_le_uint(&[0xAB], 1), 0xAB);
}
#[test]
fn uint_clamps_oversized_n_without_panic() {
assert_eq!(read_le_uint(&[0xFF; 8], 16), u64::MAX);
assert_eq!(read_le_uint(&[0x01, 0x02], 8), 0x0201);
assert_eq!(read_le_uint(&[], 8), 0);
}
#[test]
fn addr_all_ones_is_undef() {
assert_eq!(read_le_addr(&[0xFF; 8], 8), UNDEF_ADDR);
assert_eq!(read_le_addr(&[0xFF; 4], 4), UNDEF_ADDR);
assert_eq!(read_le_addr(&[0xFF, 0xFF, 0x00, 0xFF], 4), 0xFF00_FFFF);
}
#[test]
fn addr_empty_buffer_is_not_undef() {
assert_eq!(read_le_addr(&[], 8), 0);
}
}