#[must_use]
pub(crate) fn checksum_region(base: &[u8], input_checksum: u16) -> u16 {
let mut checksum = input_checksum;
for &byte in base {
if checksum & 0x0001_u16 != 0 {
checksum = (checksum >> 1) + 0x8000
} else {
checksum = checksum >> 1;
}
checksum = checksum.overflowing_add(byte as u16).0;
}
checksum
}
#[must_use]
pub(crate) fn checksum_metadata_string(s: &[u8], input_checksum: u16) -> u16 {
if s == b"\0" {
return input_checksum;
}
checksum_region(s, input_checksum)
}
#[must_use]
pub(crate) fn checksum_clue(s: &[u8], input_checksum: u16) -> u16 {
checksum_region(&s[0..s.len() - 1], input_checksum)
}