boxcars 0.9.6

Rocket league replay parser
Documentation
use std::env;
use std::fs::File;
use std::io::{BufWriter, Write};
use std::path::Path;

fn gen_crc_table(poly: u32, size: usize) -> Vec<Vec<u32>> {
    let mut table = vec![vec![0; 256]; size];
    for i in 0..256 {
        let crc = (0..8).fold(i << 24, |acc, _x| {
            if acc & 0x8000_0000 > 0 {
                (acc << 1) ^ poly
            } else {
                acc << 1
            }
        });
        table[0][i as usize] = crc.swap_bytes()
    }

    for i in 0..256 {
        let mut crc = table[0][i].swap_bytes();
        for j in 1..size {
            crc = (table[0][(crc >> 24) as usize]).swap_bytes() ^ (crc << 8);
            table[j][i] = crc.swap_bytes()
        }
    }
    table
}

fn write_crc_table() {
    let path = Path::new(&env::var("OUT_DIR").unwrap()).join("generated_crc.rs");
    let mut file = BufWriter::new(File::create(&path).unwrap());
    let poly = 0x04c1_1db7;
    let size = 16;
    let table = gen_crc_table(poly, size);

    writeln!(
        &mut file,
        "pub (crate) const CRC_TABLE: [[u32; 256]; {}] = [",
        size
    )
    .unwrap();
    for row in table {
        writeln!(&mut file, "\t[").unwrap();
        for i in row {
            write!(&mut file, "0x{:x}, ", i).unwrap()
        }
        writeln!(&mut file, "\t],").unwrap();
    }
    writeln!(&mut file, "];").unwrap();
}

fn main() {
    write_crc_table();
}