mirror of
https://github.com/ziglang/zig.git
synced 2024-11-15 00:26:57 +00:00
Rewrite update_crc_catalog in zig and move tests to separate file
This commit is contained in:
parent
6089ed9ee7
commit
33682a29c6
@ -14,13 +14,11 @@ pub usingnamespace @import("crc/catalog.zig");
|
||||
|
||||
pub fn Algorithm(comptime W: type) type {
|
||||
return struct {
|
||||
poly: W,
|
||||
init: W,
|
||||
refin: bool,
|
||||
refout: bool,
|
||||
xorout: W,
|
||||
check: W,
|
||||
residue: W,
|
||||
polynomial: W,
|
||||
initial: W,
|
||||
reflect_input: bool,
|
||||
reflect_output: bool,
|
||||
xor_output: W,
|
||||
};
|
||||
}
|
||||
|
||||
@ -31,15 +29,15 @@ pub fn Crc(comptime W: type, comptime algorithm: Algorithm(W)) type {
|
||||
const lookup_table = blk: {
|
||||
@setEvalBranchQuota(2500);
|
||||
|
||||
const poly = if (algorithm.refin)
|
||||
@bitReverse(@as(I, algorithm.poly)) >> (@bitSizeOf(I) - @bitSizeOf(W))
|
||||
const poly = if (algorithm.reflect_input)
|
||||
@bitReverse(@as(I, algorithm.polynomial)) >> (@bitSizeOf(I) - @bitSizeOf(W))
|
||||
else
|
||||
@as(I, algorithm.poly) << (@bitSizeOf(I) - @bitSizeOf(W));
|
||||
@as(I, algorithm.polynomial) << (@bitSizeOf(I) - @bitSizeOf(W));
|
||||
|
||||
var table: [256]I = undefined;
|
||||
for (table) |*e, i| {
|
||||
var crc: I = i;
|
||||
if (algorithm.refin) {
|
||||
if (algorithm.reflect_input) {
|
||||
var j: usize = 0;
|
||||
while (j < 8) : (j += 1) {
|
||||
crc = (crc >> 1) ^ ((crc & 1) * poly);
|
||||
@ -59,10 +57,10 @@ pub fn Crc(comptime W: type, comptime algorithm: Algorithm(W)) type {
|
||||
crc: I,
|
||||
|
||||
pub fn init() Self {
|
||||
const initial = if (algorithm.refin)
|
||||
@bitReverse(@as(I, algorithm.init)) >> (@bitSizeOf(I) - @bitSizeOf(W))
|
||||
const initial = if (algorithm.reflect_input)
|
||||
@bitReverse(@as(I, algorithm.initial)) >> (@bitSizeOf(I) - @bitSizeOf(W))
|
||||
else
|
||||
@as(I, algorithm.init) << (@bitSizeOf(I) - @bitSizeOf(W));
|
||||
@as(I, algorithm.initial) << (@bitSizeOf(I) - @bitSizeOf(W));
|
||||
return Self{ .crc = initial };
|
||||
}
|
||||
|
||||
@ -76,7 +74,7 @@ pub fn Crc(comptime W: type, comptime algorithm: Algorithm(W)) type {
|
||||
while (i < bytes.len) : (i += 1) {
|
||||
self.crc = tableEntry(self.crc ^ bytes[i]);
|
||||
}
|
||||
} else if (algorithm.refin) {
|
||||
} else if (algorithm.reflect_input) {
|
||||
while (i < bytes.len) : (i += 1) {
|
||||
const table_index = self.crc ^ bytes[i];
|
||||
self.crc = tableEntry(table_index) ^ (self.crc >> 8);
|
||||
@ -91,13 +89,13 @@ pub fn Crc(comptime W: type, comptime algorithm: Algorithm(W)) type {
|
||||
|
||||
pub fn final(self: Self) W {
|
||||
var c = self.crc;
|
||||
if (algorithm.refin != algorithm.refout) {
|
||||
if (algorithm.reflect_input != algorithm.reflect_output) {
|
||||
c = @bitReverse(c);
|
||||
}
|
||||
if (!algorithm.refout) {
|
||||
if (!algorithm.reflect_output) {
|
||||
c >>= @bitSizeOf(I) - @bitSizeOf(W);
|
||||
}
|
||||
return @intCast(W, c ^ algorithm.xorout);
|
||||
return @intCast(W, c ^ algorithm.xor_output);
|
||||
}
|
||||
|
||||
pub fn hash(bytes: []const u8) W {
|
||||
|
File diff suppressed because it is too large
Load Diff
1237
lib/std/hash/crc/catalog_test.zig
Normal file
1237
lib/std/hash/crc/catalog_test.zig
Normal file
File diff suppressed because it is too large
Load Diff
113
tools/crc/catalog.txt
Normal file
113
tools/crc/catalog.txt
Normal file
@ -0,0 +1,113 @@
|
||||
# https://reveng.sourceforge.io/crc-catalogue/all.htm
|
||||
width=3 poly=0x3 init=0x0 refin=false refout=false xorout=0x7 check=0x4 residue=0x2 name="CRC-3/GSM"
|
||||
width=3 poly=0x3 init=0x7 refin=true refout=true xorout=0x0 check=0x6 residue=0x0 name="CRC-3/ROHC"
|
||||
width=4 poly=0x3 init=0x0 refin=true refout=true xorout=0x0 check=0x7 residue=0x0 name="CRC-4/G-704"
|
||||
width=4 poly=0x3 init=0xf refin=false refout=false xorout=0xf check=0xb residue=0x2 name="CRC-4/INTERLAKEN"
|
||||
width=5 poly=0x09 init=0x09 refin=false refout=false xorout=0x00 check=0x00 residue=0x00 name="CRC-5/EPC-C1G2"
|
||||
width=5 poly=0x15 init=0x00 refin=true refout=true xorout=0x00 check=0x07 residue=0x00 name="CRC-5/G-704"
|
||||
width=5 poly=0x05 init=0x1f refin=true refout=true xorout=0x1f check=0x19 residue=0x06 name="CRC-5/USB"
|
||||
width=6 poly=0x27 init=0x3f refin=false refout=false xorout=0x00 check=0x0d residue=0x00 name="CRC-6/CDMA2000-A"
|
||||
width=6 poly=0x07 init=0x3f refin=false refout=false xorout=0x00 check=0x3b residue=0x00 name="CRC-6/CDMA2000-B"
|
||||
width=6 poly=0x19 init=0x00 refin=true refout=true xorout=0x00 check=0x26 residue=0x00 name="CRC-6/DARC"
|
||||
width=6 poly=0x03 init=0x00 refin=true refout=true xorout=0x00 check=0x06 residue=0x00 name="CRC-6/G-704"
|
||||
width=6 poly=0x2f init=0x00 refin=false refout=false xorout=0x3f check=0x13 residue=0x3a name="CRC-6/GSM"
|
||||
width=7 poly=0x09 init=0x00 refin=false refout=false xorout=0x00 check=0x75 residue=0x00 name="CRC-7/MMC"
|
||||
width=7 poly=0x4f init=0x7f refin=true refout=true xorout=0x00 check=0x53 residue=0x00 name="CRC-7/ROHC"
|
||||
width=7 poly=0x45 init=0x00 refin=false refout=false xorout=0x00 check=0x61 residue=0x00 name="CRC-7/UMTS"
|
||||
width=8 poly=0x2f init=0xff refin=false refout=false xorout=0xff check=0xdf residue=0x42 name="CRC-8/AUTOSAR"
|
||||
width=8 poly=0xa7 init=0x00 refin=true refout=true xorout=0x00 check=0x26 residue=0x00 name="CRC-8/BLUETOOTH"
|
||||
width=8 poly=0x9b init=0xff refin=false refout=false xorout=0x00 check=0xda residue=0x00 name="CRC-8/CDMA2000"
|
||||
width=8 poly=0x39 init=0x00 refin=true refout=true xorout=0x00 check=0x15 residue=0x00 name="CRC-8/DARC"
|
||||
width=8 poly=0xd5 init=0x00 refin=false refout=false xorout=0x00 check=0xbc residue=0x00 name="CRC-8/DVB-S2"
|
||||
width=8 poly=0x1d init=0x00 refin=false refout=false xorout=0x00 check=0x37 residue=0x00 name="CRC-8/GSM-A"
|
||||
width=8 poly=0x49 init=0x00 refin=false refout=false xorout=0xff check=0x94 residue=0x53 name="CRC-8/GSM-B"
|
||||
width=8 poly=0x1d init=0xff refin=false refout=false xorout=0x00 check=0xb4 residue=0x00 name="CRC-8/HITAG"
|
||||
width=8 poly=0x07 init=0x00 refin=false refout=false xorout=0x55 check=0xa1 residue=0xac name="CRC-8/I-432-1"
|
||||
width=8 poly=0x1d init=0xfd refin=false refout=false xorout=0x00 check=0x7e residue=0x00 name="CRC-8/I-CODE"
|
||||
width=8 poly=0x9b init=0x00 refin=false refout=false xorout=0x00 check=0xea residue=0x00 name="CRC-8/LTE"
|
||||
width=8 poly=0x31 init=0x00 refin=true refout=true xorout=0x00 check=0xa1 residue=0x00 name="CRC-8/MAXIM-DOW"
|
||||
width=8 poly=0x1d init=0xc7 refin=false refout=false xorout=0x00 check=0x99 residue=0x00 name="CRC-8/MIFARE-MAD"
|
||||
width=8 poly=0x31 init=0xff refin=false refout=false xorout=0x00 check=0xf7 residue=0x00 name="CRC-8/NRSC-5"
|
||||
width=8 poly=0x2f init=0x00 refin=false refout=false xorout=0x00 check=0x3e residue=0x00 name="CRC-8/OPENSAFETY"
|
||||
width=8 poly=0x07 init=0xff refin=true refout=true xorout=0x00 check=0xd0 residue=0x00 name="CRC-8/ROHC"
|
||||
width=8 poly=0x1d init=0xff refin=false refout=false xorout=0xff check=0x4b residue=0xc4 name="CRC-8/SAE-J1850"
|
||||
width=8 poly=0x07 init=0x00 refin=false refout=false xorout=0x00 check=0xf4 residue=0x00 name="CRC-8/SMBUS"
|
||||
width=8 poly=0x1d init=0xff refin=true refout=true xorout=0x00 check=0x97 residue=0x00 name="CRC-8/TECH-3250"
|
||||
width=8 poly=0x9b init=0x00 refin=true refout=true xorout=0x00 check=0x25 residue=0x00 name="CRC-8/WCDMA"
|
||||
width=10 poly=0x233 init=0x000 refin=false refout=false xorout=0x000 check=0x199 residue=0x000 name="CRC-10/ATM"
|
||||
width=10 poly=0x3d9 init=0x3ff refin=false refout=false xorout=0x000 check=0x233 residue=0x000 name="CRC-10/CDMA2000"
|
||||
width=10 poly=0x175 init=0x000 refin=false refout=false xorout=0x3ff check=0x12a residue=0x0c6 name="CRC-10/GSM"
|
||||
width=11 poly=0x385 init=0x01a refin=false refout=false xorout=0x000 check=0x5a3 residue=0x000 name="CRC-11/FLEXRAY"
|
||||
width=11 poly=0x307 init=0x000 refin=false refout=false xorout=0x000 check=0x061 residue=0x000 name="CRC-11/UMTS"
|
||||
width=12 poly=0xf13 init=0xfff refin=false refout=false xorout=0x000 check=0xd4d residue=0x000 name="CRC-12/CDMA2000"
|
||||
width=12 poly=0x80f init=0x000 refin=false refout=false xorout=0x000 check=0xf5b residue=0x000 name="CRC-12/DECT"
|
||||
width=12 poly=0xd31 init=0x000 refin=false refout=false xorout=0xfff check=0xb34 residue=0x178 name="CRC-12/GSM"
|
||||
width=12 poly=0x80f init=0x000 refin=false refout=true xorout=0x000 check=0xdaf residue=0x000 name="CRC-12/UMTS"
|
||||
width=13 poly=0x1cf5 init=0x0000 refin=false refout=false xorout=0x0000 check=0x04fa residue=0x0000 name="CRC-13/BBC"
|
||||
width=14 poly=0x0805 init=0x0000 refin=true refout=true xorout=0x0000 check=0x082d residue=0x0000 name="CRC-14/DARC"
|
||||
width=14 poly=0x202d init=0x0000 refin=false refout=false xorout=0x3fff check=0x30ae residue=0x031e name="CRC-14/GSM"
|
||||
width=15 poly=0x4599 init=0x0000 refin=false refout=false xorout=0x0000 check=0x059e residue=0x0000 name="CRC-15/CAN"
|
||||
width=15 poly=0x6815 init=0x0000 refin=false refout=false xorout=0x0001 check=0x2566 residue=0x6815 name="CRC-15/MPT1327"
|
||||
width=16 poly=0x8005 init=0x0000 refin=true refout=true xorout=0x0000 check=0xbb3d residue=0x0000 name="CRC-16/ARC"
|
||||
width=16 poly=0xc867 init=0xffff refin=false refout=false xorout=0x0000 check=0x4c06 residue=0x0000 name="CRC-16/CDMA2000"
|
||||
width=16 poly=0x8005 init=0xffff refin=false refout=false xorout=0x0000 check=0xaee7 residue=0x0000 name="CRC-16/CMS"
|
||||
width=16 poly=0x8005 init=0x800d refin=false refout=false xorout=0x0000 check=0x9ecf residue=0x0000 name="CRC-16/DDS-110"
|
||||
width=16 poly=0x0589 init=0x0000 refin=false refout=false xorout=0x0001 check=0x007e residue=0x0589 name="CRC-16/DECT-R"
|
||||
width=16 poly=0x0589 init=0x0000 refin=false refout=false xorout=0x0000 check=0x007f residue=0x0000 name="CRC-16/DECT-X"
|
||||
width=16 poly=0x3d65 init=0x0000 refin=true refout=true xorout=0xffff check=0xea82 residue=0x66c5 name="CRC-16/DNP"
|
||||
width=16 poly=0x3d65 init=0x0000 refin=false refout=false xorout=0xffff check=0xc2b7 residue=0xa366 name="CRC-16/EN-13757"
|
||||
width=16 poly=0x1021 init=0xffff refin=false refout=false xorout=0xffff check=0xd64e residue=0x1d0f name="CRC-16/GENIBUS"
|
||||
width=16 poly=0x1021 init=0x0000 refin=false refout=false xorout=0xffff check=0xce3c residue=0x1d0f name="CRC-16/GSM"
|
||||
width=16 poly=0x1021 init=0xffff refin=false refout=false xorout=0x0000 check=0x29b1 residue=0x0000 name="CRC-16/IBM-3740"
|
||||
width=16 poly=0x1021 init=0xffff refin=true refout=true xorout=0xffff check=0x906e residue=0xf0b8 name="CRC-16/IBM-SDLC"
|
||||
width=16 poly=0x1021 init=0xc6c6 refin=true refout=true xorout=0x0000 check=0xbf05 residue=0x0000 name="CRC-16/ISO-IEC-14443-3-A"
|
||||
width=16 poly=0x1021 init=0x0000 refin=true refout=true xorout=0x0000 check=0x2189 residue=0x0000 name="CRC-16/KERMIT"
|
||||
width=16 poly=0x6f63 init=0x0000 refin=false refout=false xorout=0x0000 check=0xbdf4 residue=0x0000 name="CRC-16/LJ1200"
|
||||
width=16 poly=0x5935 init=0xffff refin=false refout=false xorout=0x0000 check=0x772b residue=0x0000 name="CRC-16/M17"
|
||||
width=16 poly=0x8005 init=0x0000 refin=true refout=true xorout=0xffff check=0x44c2 residue=0xb001 name="CRC-16/MAXIM-DOW"
|
||||
width=16 poly=0x1021 init=0xffff refin=true refout=true xorout=0x0000 check=0x6f91 residue=0x0000 name="CRC-16/MCRF4XX"
|
||||
width=16 poly=0x8005 init=0xffff refin=true refout=true xorout=0x0000 check=0x4b37 residue=0x0000 name="CRC-16/MODBUS"
|
||||
width=16 poly=0x080b init=0xffff refin=true refout=true xorout=0x0000 check=0xa066 residue=0x0000 name="CRC-16/NRSC-5"
|
||||
width=16 poly=0x5935 init=0x0000 refin=false refout=false xorout=0x0000 check=0x5d38 residue=0x0000 name="CRC-16/OPENSAFETY-A"
|
||||
width=16 poly=0x755b init=0x0000 refin=false refout=false xorout=0x0000 check=0x20fe residue=0x0000 name="CRC-16/OPENSAFETY-B"
|
||||
width=16 poly=0x1dcf init=0xffff refin=false refout=false xorout=0xffff check=0xa819 residue=0xe394 name="CRC-16/PROFIBUS"
|
||||
width=16 poly=0x1021 init=0xb2aa refin=true refout=true xorout=0x0000 check=0x63d0 residue=0x0000 name="CRC-16/RIELLO"
|
||||
width=16 poly=0x1021 init=0x1d0f refin=false refout=false xorout=0x0000 check=0xe5cc residue=0x0000 name="CRC-16/SPI-FUJITSU"
|
||||
width=16 poly=0x8bb7 init=0x0000 refin=false refout=false xorout=0x0000 check=0xd0db residue=0x0000 name="CRC-16/T10-DIF"
|
||||
width=16 poly=0xa097 init=0x0000 refin=false refout=false xorout=0x0000 check=0x0fb3 residue=0x0000 name="CRC-16/TELEDISK"
|
||||
width=16 poly=0x1021 init=0x89ec refin=true refout=true xorout=0x0000 check=0x26b1 residue=0x0000 name="CRC-16/TMS37157"
|
||||
width=16 poly=0x8005 init=0x0000 refin=false refout=false xorout=0x0000 check=0xfee8 residue=0x0000 name="CRC-16/UMTS"
|
||||
width=16 poly=0x8005 init=0xffff refin=true refout=true xorout=0xffff check=0xb4c8 residue=0xb001 name="CRC-16/USB"
|
||||
width=16 poly=0x1021 init=0x0000 refin=false refout=false xorout=0x0000 check=0x31c3 residue=0x0000 name="CRC-16/XMODEM"
|
||||
width=17 poly=0x1685b init=0x00000 refin=false refout=false xorout=0x00000 check=0x04f03 residue=0x00000 name="CRC-17/CAN-FD"
|
||||
width=21 poly=0x102899 init=0x000000 refin=false refout=false xorout=0x000000 check=0x0ed841 residue=0x000000 name="CRC-21/CAN-FD"
|
||||
width=24 poly=0x00065b init=0x555555 refin=true refout=true xorout=0x000000 check=0xc25a56 residue=0x000000 name="CRC-24/BLE"
|
||||
width=24 poly=0x5d6dcb init=0xfedcba refin=false refout=false xorout=0x000000 check=0x7979bd residue=0x000000 name="CRC-24/FLEXRAY-A"
|
||||
width=24 poly=0x5d6dcb init=0xabcdef refin=false refout=false xorout=0x000000 check=0x1f23b8 residue=0x000000 name="CRC-24/FLEXRAY-B"
|
||||
width=24 poly=0x328b63 init=0xffffff refin=false refout=false xorout=0xffffff check=0xb4f3e6 residue=0x144e63 name="CRC-24/INTERLAKEN"
|
||||
width=24 poly=0x864cfb init=0x000000 refin=false refout=false xorout=0x000000 check=0xcde703 residue=0x000000 name="CRC-24/LTE-A"
|
||||
width=24 poly=0x800063 init=0x000000 refin=false refout=false xorout=0x000000 check=0x23ef52 residue=0x000000 name="CRC-24/LTE-B"
|
||||
width=24 poly=0x864cfb init=0xb704ce refin=false refout=false xorout=0x000000 check=0x21cf02 residue=0x000000 name="CRC-24/OPENPGP"
|
||||
width=24 poly=0x800063 init=0xffffff refin=false refout=false xorout=0xffffff check=0x200fa5 residue=0x800fe3 name="CRC-24/OS-9"
|
||||
width=30 poly=0x2030b9c7 init=0x3fffffff refin=false refout=false xorout=0x3fffffff check=0x04c34abf residue=0x34efa55a name="CRC-30/CDMA"
|
||||
width=31 poly=0x04c11db7 init=0x7fffffff refin=false refout=false xorout=0x7fffffff check=0x0ce9e46c residue=0x4eaf26f1 name="CRC-31/PHILIPS"
|
||||
width=32 poly=0x814141ab init=0x00000000 refin=false refout=false xorout=0x00000000 check=0x3010bf7f residue=0x00000000 name="CRC-32/AIXM"
|
||||
width=32 poly=0xf4acfb13 init=0xffffffff refin=true refout=true xorout=0xffffffff check=0x1697d06a residue=0x904cddbf name="CRC-32/AUTOSAR"
|
||||
width=32 poly=0xa833982b init=0xffffffff refin=true refout=true xorout=0xffffffff check=0x87315576 residue=0x45270551 name="CRC-32/BASE91-D"
|
||||
width=32 poly=0x04c11db7 init=0xffffffff refin=false refout=false xorout=0xffffffff check=0xfc891918 residue=0xc704dd7b name="CRC-32/BZIP2"
|
||||
width=32 poly=0x8001801b init=0x00000000 refin=true refout=true xorout=0x00000000 check=0x6ec2edc4 residue=0x00000000 name="CRC-32/CD-ROM-EDC"
|
||||
width=32 poly=0x04c11db7 init=0x00000000 refin=false refout=false xorout=0xffffffff check=0x765e7680 residue=0xc704dd7b name="CRC-32/CKSUM"
|
||||
width=32 poly=0x1edc6f41 init=0xffffffff refin=true refout=true xorout=0xffffffff check=0xe3069283 residue=0xb798b438 name="CRC-32/ISCSI"
|
||||
width=32 poly=0x04c11db7 init=0xffffffff refin=true refout=true xorout=0xffffffff check=0xcbf43926 residue=0xdebb20e3 name="CRC-32/ISO-HDLC"
|
||||
width=32 poly=0x04c11db7 init=0xffffffff refin=true refout=true xorout=0x00000000 check=0x340bc6d9 residue=0x00000000 name="CRC-32/JAMCRC"
|
||||
width=32 poly=0x741b8cd7 init=0xffffffff refin=true refout=true xorout=0x00000000 check=0xd2c22f51 residue=0x00000000 name="CRC-32/MEF"
|
||||
width=32 poly=0x04c11db7 init=0xffffffff refin=false refout=false xorout=0x00000000 check=0x0376e6e7 residue=0x00000000 name="CRC-32/MPEG-2"
|
||||
width=32 poly=0x000000af init=0x00000000 refin=false refout=false xorout=0x00000000 check=0xbd0be338 residue=0x00000000 name="CRC-32/XFER"
|
||||
width=40 poly=0x0004820009 init=0x0000000000 refin=false refout=false xorout=0xffffffffff check=0xd4164fc646 residue=0xc4ff8071ff name="CRC-40/GSM"
|
||||
width=64 poly=0x42f0e1eba9ea3693 init=0x0000000000000000 refin=false refout=false xorout=0x0000000000000000 check=0x6c40df5f0b497347 residue=0x0000000000000000 name="CRC-64/ECMA-182"
|
||||
width=64 poly=0x000000000000001b init=0xffffffffffffffff refin=true refout=true xorout=0xffffffffffffffff check=0xb90956c775a41001 residue=0x5300000000000000 name="CRC-64/GO-ISO"
|
||||
width=64 poly=0x259c84cba6426349 init=0xffffffffffffffff refin=true refout=true xorout=0x0000000000000000 check=0x75d4b74f024eceea residue=0x0000000000000000 name="CRC-64/MS"
|
||||
width=64 poly=0xad93d23594c935a9 init=0x0000000000000000 refin=true refout=true xorout=0x0000000000000000 check=0xe9c6d914c4b8d9ca residue=0x0000000000000000 name="CRC-64/REDIS"
|
||||
width=64 poly=0x42f0e1eba9ea3693 init=0xffffffffffffffff refin=false refout=false xorout=0xffffffffffffffff check=0x62ec59e3f1a4f00a residue=0xfcacbebd5931a992 name="CRC-64/WE"
|
||||
width=64 poly=0x42f0e1eba9ea3693 init=0xffffffffffffffff refin=true refout=true xorout=0xffffffffffffffff check=0x995dc9bbdf1939fa residue=0x49958c9abd7d353f name="CRC-64/XZ"
|
||||
width=82 poly=0x0308c0111011401440411 init=0x000000000000000000000 refin=true refout=true xorout=0x000000000000000000000 check=0x09ea83f625023801fd612 residue=0x000000000000000000000 name="CRC-82/DARC"
|
@ -1,40 +0,0 @@
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "Usage: $0 /path/git/zig"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
filepath=$1/lib/std/hash/crc/catalog.zig
|
||||
|
||||
cat <<EOS >$filepath
|
||||
//! This file is auto-generated by tools/update_crc_catalog.sh.
|
||||
|
||||
const std = @import("../../std.zig");
|
||||
const testing = std.testing;
|
||||
const crc = @import("../crc.zig");
|
||||
const Algorithm = crc.Algorithm;
|
||||
const Crc = crc.Crc;
|
||||
EOS
|
||||
|
||||
curl -s https://reveng.sourceforge.io/crc-catalogue/all.htm | grep -o 'width.*name.*"' | while read -r line; do
|
||||
width=$(echo $line | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\1/')
|
||||
params=$(echo $line | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\2/' | sed 's/ /, ./g' | sed 's/=/ = /g')
|
||||
name=$(echo $line | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\3/')
|
||||
snakecase=$(echo $name | sed 's/[-\/]/_/g' | tr '[:upper:]' '[:lower:]')
|
||||
camelcase=$(echo $snakecase | perl -pe 's/(^|_)(\w)/\U$2/g')
|
||||
|
||||
cat <<EOS >>$filepath
|
||||
|
||||
const $snakecase: Algorithm(u$width) = .{ .$params };
|
||||
|
||||
pub const $camelcase = Crc(u$width, $snakecase);
|
||||
|
||||
test "$name" {
|
||||
try testing.expectEqual($snakecase.check, $camelcase.hash("123456789"));
|
||||
|
||||
var c = $camelcase.init();
|
||||
c.update("1234");
|
||||
c.update("56789");
|
||||
try testing.expectEqual($snakecase.check, c.final());
|
||||
}
|
||||
EOS
|
||||
done
|
169
tools/update_crc_catalog.zig
Normal file
169
tools/update_crc_catalog.zig
Normal file
@ -0,0 +1,169 @@
|
||||
const std = @import("std");
|
||||
const fs = std.fs;
|
||||
const mem = std.mem;
|
||||
const ascii = std.ascii;
|
||||
|
||||
const catalog_txt = @embedFile("crc/catalog.txt");
|
||||
|
||||
pub fn main() anyerror!void {
|
||||
var arena_state = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
||||
defer arena_state.deinit();
|
||||
const arena = arena_state.allocator();
|
||||
|
||||
const args = try std.process.argsAlloc(arena);
|
||||
if (args.len <= 1) {
|
||||
usageAndExit(std.io.getStdErr(), args[0], 1);
|
||||
}
|
||||
|
||||
const zig_src_root = args[1];
|
||||
if (mem.startsWith(u8, zig_src_root, "-")) {
|
||||
usageAndExit(std.io.getStdErr(), args[0], 1);
|
||||
}
|
||||
|
||||
var zig_src_dir = try fs.cwd().openDir(zig_src_root, .{});
|
||||
defer zig_src_dir.close();
|
||||
|
||||
const target_sub_path = try fs.path.join(arena, &.{ "lib", "std", "hash", "crc" });
|
||||
var target_dir = try zig_src_dir.makeOpenPath(target_sub_path, .{});
|
||||
defer target_dir.close();
|
||||
|
||||
var zig_code_file = try target_dir.createFile("catalog.zig", .{});
|
||||
defer zig_code_file.close();
|
||||
|
||||
var cbw = std.io.bufferedWriter(zig_code_file.writer());
|
||||
defer cbw.flush() catch unreachable;
|
||||
const code_writer = cbw.writer();
|
||||
|
||||
try code_writer.writeAll(
|
||||
\\//! This file is auto-generated by tools/update_crc_catalog.zig.
|
||||
\\
|
||||
\\const Crc = @import("../crc.zig").Crc;
|
||||
\\
|
||||
\\test {
|
||||
\\ _ = @import("catalog_test.zig");
|
||||
\\}
|
||||
\\
|
||||
);
|
||||
|
||||
var zig_test_file = try target_dir.createFile("catalog_test.zig", .{});
|
||||
defer zig_test_file.close();
|
||||
|
||||
var tbw = std.io.bufferedWriter(zig_test_file.writer());
|
||||
defer tbw.flush() catch unreachable;
|
||||
const test_writer = tbw.writer();
|
||||
|
||||
try test_writer.writeAll(
|
||||
\\//! This file is auto-generated by tools/update_crc_catalog.zig.
|
||||
\\
|
||||
\\const std = @import("../../std.zig");
|
||||
\\const testing = std.testing;
|
||||
\\const catalog = @import("catalog.zig");
|
||||
\\
|
||||
);
|
||||
|
||||
var stream = std.io.fixedBufferStream(catalog_txt);
|
||||
const reader = stream.reader();
|
||||
|
||||
while (try reader.readUntilDelimiterOrEofAlloc(arena, '\n', std.math.maxInt(usize))) |line| {
|
||||
if (line.len == 0 or line[0] == '#')
|
||||
continue;
|
||||
|
||||
var width: []const u8 = undefined;
|
||||
var poly: []const u8 = undefined;
|
||||
var init: []const u8 = undefined;
|
||||
var refin: []const u8 = undefined;
|
||||
var refout: []const u8 = undefined;
|
||||
var xorout: []const u8 = undefined;
|
||||
var check: []const u8 = undefined;
|
||||
var residue: []const u8 = undefined;
|
||||
var name: []const u8 = undefined;
|
||||
|
||||
var it = mem.split(u8, line, " ");
|
||||
while (it.next()) |property| {
|
||||
const i = mem.indexOf(u8, property, "=").?;
|
||||
const key = property[0..i];
|
||||
const value = property[i + 1 ..];
|
||||
if (mem.eql(u8, key, "width")) {
|
||||
width = value;
|
||||
} else if (mem.eql(u8, key, "poly")) {
|
||||
poly = value;
|
||||
} else if (mem.eql(u8, key, "init")) {
|
||||
init = value;
|
||||
} else if (mem.eql(u8, key, "refin")) {
|
||||
refin = value;
|
||||
} else if (mem.eql(u8, key, "refout")) {
|
||||
refout = value;
|
||||
} else if (mem.eql(u8, key, "xorout")) {
|
||||
xorout = value;
|
||||
} else if (mem.eql(u8, key, "check")) {
|
||||
check = value;
|
||||
} else if (mem.eql(u8, key, "residue")) {
|
||||
residue = value;
|
||||
} else if (mem.eql(u8, key, "name")) {
|
||||
name = mem.trim(u8, value, "\"");
|
||||
} else {
|
||||
unreachable;
|
||||
}
|
||||
}
|
||||
|
||||
const snakecase = try ascii.allocLowerString(arena, name);
|
||||
defer arena.free(snakecase);
|
||||
|
||||
_ = mem.replace(u8, snakecase, "-", "_", snakecase);
|
||||
_ = mem.replace(u8, snakecase, "/", "_", snakecase);
|
||||
|
||||
var buf = try std.ArrayList(u8).initCapacity(arena, snakecase.len);
|
||||
defer buf.deinit();
|
||||
|
||||
var prev: u8 = 0;
|
||||
for (snakecase) |c, i| {
|
||||
if (c == '_') {
|
||||
// do nothing
|
||||
} else if (i == 0) {
|
||||
buf.appendAssumeCapacity(ascii.toUpper(c));
|
||||
} else if (prev == '_') {
|
||||
buf.appendAssumeCapacity(ascii.toUpper(c));
|
||||
} else {
|
||||
buf.appendAssumeCapacity(c);
|
||||
}
|
||||
prev = c;
|
||||
}
|
||||
|
||||
const camelcase = buf.items;
|
||||
|
||||
try code_writer.writeAll(try std.fmt.allocPrint(arena,
|
||||
\\
|
||||
\\pub const {s} = Crc(u{s}, .{{
|
||||
\\ .polynomial = {s},
|
||||
\\ .initial = {s},
|
||||
\\ .reflect_input = {s},
|
||||
\\ .reflect_output = {s},
|
||||
\\ .xor_output = {s},
|
||||
\\}});
|
||||
\\
|
||||
, .{ camelcase, width, poly, init, refin, refout, xorout }));
|
||||
|
||||
try test_writer.writeAll(try std.fmt.allocPrint(arena,
|
||||
\\
|
||||
\\test "{0s}" {{
|
||||
\\ const {1s} = catalog.{1s};
|
||||
\\
|
||||
\\ try testing.expectEqual(@as(u{2s}, {3s}), {1s}.hash("123456789"));
|
||||
\\
|
||||
\\ var c = {1s}.init();
|
||||
\\ c.update("1234");
|
||||
\\ c.update("56789");
|
||||
\\ try testing.expectEqual(@as(u{2s}, {3s}), c.final());
|
||||
\\}}
|
||||
\\
|
||||
, .{ name, camelcase, width, check }));
|
||||
}
|
||||
}
|
||||
|
||||
fn usageAndExit(file: fs.File, arg0: []const u8, code: u8) noreturn {
|
||||
file.writer().print(
|
||||
\\Usage: {s} /path/git/zig
|
||||
\\
|
||||
, .{arg0}) catch std.process.exit(1);
|
||||
std.process.exit(code);
|
||||
}
|
Loading…
Reference in New Issue
Block a user