h1emu-core 0.8.12

Utility library used in h1emu.
Documentation
#[path = "./crc/crc_table.rs"]
mod crc_table;
use byteorder::{BigEndian, WriteBytesExt};
use crc_table::get_crc_table;
use wasm_bindgen::prelude::*;

pub fn append_crc(data: &mut Vec<u8>, crc_seed: u32) -> () {
    let crc = crc32(&data, (crc_seed >> 0) as usize);
    data.write_u16::<BigEndian>((crc & 0xffff) as u16).unwrap();
}

pub fn crc32(data: &&mut Vec<u8>, crc_seed: usize) -> u32 {
    let crc32_table = get_crc_table();
    let mut crc = crc32_table[!crc_seed & 0xff];
    crc ^= 0x00ffffff;
    let mut index = (crc_seed >> 8) ^ crc as usize;
    crc = (crc >> 8) & 0x00ffffff;
    crc ^= crc32_table[index & 0xff];
    index = (crc_seed >> 16) ^ crc as usize;
    crc = (crc >> 8) & 0x00ffffff;
    crc ^= crc32_table[index & 0xff];
    index = (crc_seed >> 24) ^ crc as usize;
    crc = (crc >> 8) & 0x00ffffff;
    crc ^= crc32_table[index & 0xff];
    for i in 0..data.len() {
        index = data[i] as usize ^ crc as usize;
        crc = (crc >> 8) & 0x00ffffff;
        crc ^= crc32_table[index & 0xff];
    }
    return !crc >> 0;
}

#[wasm_bindgen]
pub fn append_crc_legacy(data: &[u8], crc_seed: usize) -> std::vec::Vec<u8> {
    let mut data_mut = data.to_vec();
    let crc = crc32_legacy(&data_mut, crc_seed >> 0);
    data_mut
        .write_u16::<BigEndian>((crc & 0xffff) as u16)
        .unwrap();
    return data_mut;
}

#[wasm_bindgen]
pub fn crc32_legacy(data: &[u8], crc_seed: usize) -> u32 {
    let crc32_table = get_crc_table();
    let mut crc = crc32_table[!crc_seed & 0xff];
    crc ^= 0x00ffffff;
    let mut index = (crc_seed >> 8) ^ crc as usize;
    crc = (crc >> 8) & 0x00ffffff;
    crc ^= crc32_table[index & 0xff];
    index = (crc_seed >> 16) ^ crc as usize;
    crc = (crc >> 8) & 0x00ffffff;
    crc ^= crc32_table[index & 0xff];
    index = (crc_seed >> 24) ^ crc as usize;
    crc = (crc >> 8) & 0x00ffffff;
    crc ^= crc32_table[index & 0xff];
    for i in 0..data.len() {
        index = data[i] as usize ^ crc as usize;
        crc = (crc >> 8) & 0x00ffffff;
        crc ^= crc32_table[index & 0xff];
    }
    return !crc >> 0;
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn crc32_test() {
        let mut data: Vec<u8> = [0, 21, 0, 0, 2].to_vec();
        crc32(&&mut data, 0);
        assert_eq!(crc32(&&mut data, 0), 1874907695)
    }
    #[test]
    fn append_crc_test() {
        let mut data: Vec<u8> = [
            0, 9, 0, 0, 0, 169, 183, 185, 67, 241, 64, 164, 5, 143, 19, 35, 87, 21, 163, 205, 26,
            83, 24, 212,
        ]
        .to_vec();
        append_crc(&mut data, 0);
        assert_eq!(
            data,
            [
                0, 9, 0, 0, 0, 169, 183, 185, 67, 241, 64, 164, 5, 143, 19, 35, 87, 21, 163, 205,
                26, 83, 24, 212, 220, 81
            ]
        )
    }
    #[test]
    fn crc32_legacy_test() {
        let data: [u8; 5] = [0, 21, 0, 0, 2];
        assert_eq!(crc32_legacy(&data, 0), 1874907695)
    }
    #[test]
    fn append_crc_legacy_test() {
        let data: [u8; 24] = [
            0, 9, 0, 0, 0, 169, 183, 185, 67, 241, 64, 164, 5, 143, 19, 35, 87, 21, 163, 205, 26,
            83, 24, 212,
        ];
        assert_eq!(
            append_crc_legacy(&data, 0),
            [
                0, 9, 0, 0, 0, 169, 183, 185, 67, 241, 64, 164, 5, 143, 19, 35, 87, 21, 163, 205,
                26, 83, 24, 212, 220, 81
            ]
        )
    }
}