quakeworld 0.2.3

A collection of quakeworld related libraries.
Documentation

mod checksum_table;

pub fn generate_checksum(buffer: impl Into<Vec<u8>>, start: usize, stop: usize, sequence: u32) -> u16 {
    let buffer = buffer.into();
    let mut chkb: [u8; 64] = [0;64];
    let mut length = stop - start;
    if length > 60 {
        length = 60;
    }

    if let Some(chunk) = chkb.chunks_mut(length).next() {
        chunk.clone_from_slice(&buffer[start..start+length]);
    }
    let p: usize =   sequence as usize % (1024 -4);
    let check_table = &checksum_table::CHECKSUM_TABLE;
    chkb[length] = (sequence & 0xff) as u8  ^ check_table[p];
    chkb[length + 1] = check_table[p + 1];
    chkb[length + 2] = (sequence >> 8) as u8 ^ check_table[p + 2];
    chkb[length + 3] = check_table[p + 3];
    length += 4;

    block(chkb, length)
}

pub fn block(buffer: impl Into<Vec<u8>>, length: usize) -> u16 {
    let cst = &checksum_table::CHECKSUM_TABLE_U16;
    let mut crc: u16 = 0xffff;
    let buffer = buffer.into();
    for b in buffer.iter().take(length) {
        crc = (crc << 8) as u16 ^ cst[((crc >> 8) as u8 ^ b) as usize] as u16;
    }
    crc
}