hare

The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

commit 7cbaf1dc52bd9f3fdf230bf317097e2ebb4ed544
parent 946d4051a0a8c66d6dbf9721cb894c4f6b1397db
Author: Kiëd Llaentenn <kiedtl@tilde.team>
Date:   Wed, 28 Apr 2021 23:10:05 +0000

Add hash::crc16

Signed-off-by: Kiëd Llaentenn <kiedtl@tilde.team>

Diffstat:
Ahash/crc16/README | 1+
Ahash/crc16/crc16.ha | 281+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mscripts/gen-stdlib | 7+++++++
Mstdlib.mk | 26++++++++++++++++++++++++++
4 files changed, 315 insertions(+), 0 deletions(-)

diff --git a/hash/crc16/README b/hash/crc16/README @@ -0,0 +1 @@ +Implements the CRC-16 checksum algorithm. It is a non-cryptographic checksum. diff --git a/hash/crc16/crc16.ha b/hash/crc16/crc16.ha @@ -0,0 +1,281 @@ +use endian; +use hash; +use io; +use strings; + +// The size, in bytes, of a CRC-16 checksum. +export def SIZE: size = 2; + +// CRC-CCITT polynomial for CRC-16. The most commonly used polynomial, used in +// Bluetooth, X.25, XMODEM, and many other places. Also known as CRC-X25. +export const CCITT: u16 = 0x8408; + +// CMDA200 polynomial for CRC-16. Used in the infrastructure of mobile networks. +export const CMDA2000: u16 = 0xE613; + +// DECT polynomial for CRC-16. Typically used in cordless phones. +export const DECT: u16 = 0x91A0; + +// ANSI polynomial for CRC-16. Another widely used polynomial, it's seen in USB +// devices, Modbus, ANSI X3.28, and many others places. Also known as CRC-IBM. +export const ANSI: u16 = 0xA001; + +// Table of memoized values for each byte with the CCITT polynomial. +export const CCITT_TABLE: [256]u16 = [ + 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, 0x8C48, + 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7, 0x1081, 0x0108, + 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E, 0x9CC9, 0x8D40, 0xBFDB, + 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876, 0x2102, 0x308B, 0x0210, 0x1399, + 0x6726, 0x76AF, 0x4434, 0x55BD, 0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, + 0xFAE7, 0xC87C, 0xD9F5, 0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, + 0x54B5, 0x453C, 0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, + 0xC974, 0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB, + 0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3, 0x5285, + 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A, 0xDECD, 0xCF44, + 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72, 0x6306, 0x728F, 0x4014, + 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9, 0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, + 0xA96A, 0xB8E3, 0x8A78, 0x9BF1, 0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, + 0x242A, 0x16B1, 0x0738, 0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, + 0x9AF9, 0x8B70, 0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, + 0xF0B7, 0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF, + 0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036, 0x18C1, + 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E, 0xA50A, 0xB483, + 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5, 0x2942, 0x38CB, 0x0A50, + 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD, 0xB58B, 0xA402, 0x9699, 0x8710, + 0xF3AF, 0xE226, 0xD0BD, 0xC134, 0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, + 0x6E6E, 0x5CF5, 0x4D7C, 0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, + 0xA33A, 0xB2B3, 0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, + 0x3EFB, 0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232, + 0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A, 0xE70E, + 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1, 0x6B46, 0x7ACF, + 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9, 0xF78F, 0xE606, 0xD49D, + 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330, 0x7BC7, 0x6A4E, 0x58D5, 0x495C, + 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78, +]; + +// Table of memoized values for each byte with the CMDA2000 polynomial. +export const CMDA2000_TABLE: [256]u16 = [ + 0x0000, 0x5A7A, 0xB4F4, 0xEE8E, 0xA5CF, 0xFFB5, 0x113B, 0x4B41, 0x87B9, + 0xDDC3, 0x334D, 0x6937, 0x2276, 0x780C, 0x9682, 0xCCF8, 0xC355, 0x992F, + 0x77A1, 0x2DDB, 0x669A, 0x3CE0, 0xD26E, 0x8814, 0x44EC, 0x1E96, 0xF018, + 0xAA62, 0xE123, 0xBB59, 0x55D7, 0x0FAD, 0x4A8D, 0x10F7, 0xFE79, 0xA403, + 0xEF42, 0xB538, 0x5BB6, 0x01CC, 0xCD34, 0x974E, 0x79C0, 0x23BA, 0x68FB, + 0x3281, 0xDC0F, 0x8675, 0x89D8, 0xD3A2, 0x3D2C, 0x6756, 0x2C17, 0x766D, + 0x98E3, 0xC299, 0x0E61, 0x541B, 0xBA95, 0xE0EF, 0xABAE, 0xF1D4, 0x1F5A, + 0x4520, 0x951A, 0xCF60, 0x21EE, 0x7B94, 0x30D5, 0x6AAF, 0x8421, 0xDE5B, + 0x12A3, 0x48D9, 0xA657, 0xFC2D, 0xB76C, 0xED16, 0x0398, 0x59E2, 0x564F, + 0x0C35, 0xE2BB, 0xB8C1, 0xF380, 0xA9FA, 0x4774, 0x1D0E, 0xD1F6, 0x8B8C, + 0x6502, 0x3F78, 0x7439, 0x2E43, 0xC0CD, 0x9AB7, 0xDF97, 0x85ED, 0x6B63, + 0x3119, 0x7A58, 0x2022, 0xCEAC, 0x94D6, 0x582E, 0x0254, 0xECDA, 0xB6A0, + 0xFDE1, 0xA79B, 0x4915, 0x136F, 0x1CC2, 0x46B8, 0xA836, 0xF24C, 0xB90D, + 0xE377, 0x0DF9, 0x5783, 0x9B7B, 0xC101, 0x2F8F, 0x75F5, 0x3EB4, 0x64CE, + 0x8A40, 0xD03A, 0xE613, 0xBC69, 0x52E7, 0x089D, 0x43DC, 0x19A6, 0xF728, + 0xAD52, 0x61AA, 0x3BD0, 0xD55E, 0x8F24, 0xC465, 0x9E1F, 0x7091, 0x2AEB, + 0x2546, 0x7F3C, 0x91B2, 0xCBC8, 0x8089, 0xDAF3, 0x347D, 0x6E07, 0xA2FF, + 0xF885, 0x160B, 0x4C71, 0x0730, 0x5D4A, 0xB3C4, 0xE9BE, 0xAC9E, 0xF6E4, + 0x186A, 0x4210, 0x0951, 0x532B, 0xBDA5, 0xE7DF, 0x2B27, 0x715D, 0x9FD3, + 0xC5A9, 0x8EE8, 0xD492, 0x3A1C, 0x6066, 0x6FCB, 0x35B1, 0xDB3F, 0x8145, + 0xCA04, 0x907E, 0x7EF0, 0x248A, 0xE872, 0xB208, 0x5C86, 0x06FC, 0x4DBD, + 0x17C7, 0xF949, 0xA333, 0x7309, 0x2973, 0xC7FD, 0x9D87, 0xD6C6, 0x8CBC, + 0x6232, 0x3848, 0xF4B0, 0xAECA, 0x4044, 0x1A3E, 0x517F, 0x0B05, 0xE58B, + 0xBFF1, 0xB05C, 0xEA26, 0x04A8, 0x5ED2, 0x1593, 0x4FE9, 0xA167, 0xFB1D, + 0x37E5, 0x6D9F, 0x8311, 0xD96B, 0x922A, 0xC850, 0x26DE, 0x7CA4, 0x3984, + 0x63FE, 0x8D70, 0xD70A, 0x9C4B, 0xC631, 0x28BF, 0x72C5, 0xBE3D, 0xE447, + 0x0AC9, 0x50B3, 0x1BF2, 0x4188, 0xAF06, 0xF57C, 0xFAD1, 0xA0AB, 0x4E25, + 0x145F, 0x5F1E, 0x0564, 0xEBEA, 0xB190, 0x7D68, 0x2712, 0xC99C, 0x93E6, + 0xD8A7, 0x82DD, 0x6C53, 0x3629, +]; + + +// Table of memoized values for each byte with the DECT polynomial. +export const DECT_TABLE: [256]u16 = [ + 0x0000, 0x49F3, 0x93E6, 0xDA15, 0x048D, 0x4D7E, 0x976B, 0xDE98, 0x091A, + 0x40E9, 0x9AFC, 0xD30F, 0x0D97, 0x4464, 0x9E71, 0xD782, 0x1234, 0x5BC7, + 0x81D2, 0xC821, 0x16B9, 0x5F4A, 0x855F, 0xCCAC, 0x1B2E, 0x52DD, 0x88C8, + 0xC13B, 0x1FA3, 0x5650, 0x8C45, 0xC5B6, 0x2468, 0x6D9B, 0xB78E, 0xFE7D, + 0x20E5, 0x6916, 0xB303, 0xFAF0, 0x2D72, 0x6481, 0xBE94, 0xF767, 0x29FF, + 0x600C, 0xBA19, 0xF3EA, 0x365C, 0x7FAF, 0xA5BA, 0xEC49, 0x32D1, 0x7B22, + 0xA137, 0xE8C4, 0x3F46, 0x76B5, 0xACA0, 0xE553, 0x3BCB, 0x7238, 0xA82D, + 0xE1DE, 0x48D0, 0x0123, 0xDB36, 0x92C5, 0x4C5D, 0x05AE, 0xDFBB, 0x9648, + 0x41CA, 0x0839, 0xD22C, 0x9BDF, 0x4547, 0x0CB4, 0xD6A1, 0x9F52, 0x5AE4, + 0x1317, 0xC902, 0x80F1, 0x5E69, 0x179A, 0xCD8F, 0x847C, 0x53FE, 0x1A0D, + 0xC018, 0x89EB, 0x5773, 0x1E80, 0xC495, 0x8D66, 0x6CB8, 0x254B, 0xFF5E, + 0xB6AD, 0x6835, 0x21C6, 0xFBD3, 0xB220, 0x65A2, 0x2C51, 0xF644, 0xBFB7, + 0x612F, 0x28DC, 0xF2C9, 0xBB3A, 0x7E8C, 0x377F, 0xED6A, 0xA499, 0x7A01, + 0x33F2, 0xE9E7, 0xA014, 0x7796, 0x3E65, 0xE470, 0xAD83, 0x731B, 0x3AE8, + 0xE0FD, 0xA90E, 0x91A0, 0xD853, 0x0246, 0x4BB5, 0x952D, 0xDCDE, 0x06CB, + 0x4F38, 0x98BA, 0xD149, 0x0B5C, 0x42AF, 0x9C37, 0xD5C4, 0x0FD1, 0x4622, + 0x8394, 0xCA67, 0x1072, 0x5981, 0x8719, 0xCEEA, 0x14FF, 0x5D0C, 0x8A8E, + 0xC37D, 0x1968, 0x509B, 0x8E03, 0xC7F0, 0x1DE5, 0x5416, 0xB5C8, 0xFC3B, + 0x262E, 0x6FDD, 0xB145, 0xF8B6, 0x22A3, 0x6B50, 0xBCD2, 0xF521, 0x2F34, + 0x66C7, 0xB85F, 0xF1AC, 0x2BB9, 0x624A, 0xA7FC, 0xEE0F, 0x341A, 0x7DE9, + 0xA371, 0xEA82, 0x3097, 0x7964, 0xAEE6, 0xE715, 0x3D00, 0x74F3, 0xAA6B, + 0xE398, 0x398D, 0x707E, 0xD970, 0x9083, 0x4A96, 0x0365, 0xDDFD, 0x940E, + 0x4E1B, 0x07E8, 0xD06A, 0x9999, 0x438C, 0x0A7F, 0xD4E7, 0x9D14, 0x4701, + 0x0EF2, 0xCB44, 0x82B7, 0x58A2, 0x1151, 0xCFC9, 0x863A, 0x5C2F, 0x15DC, + 0xC25E, 0x8BAD, 0x51B8, 0x184B, 0xC6D3, 0x8F20, 0x5535, 0x1CC6, 0xFD18, + 0xB4EB, 0x6EFE, 0x270D, 0xF995, 0xB066, 0x6A73, 0x2380, 0xF402, 0xBDF1, + 0x67E4, 0x2E17, 0xF08F, 0xB97C, 0x6369, 0x2A9A, 0xEF2C, 0xA6DF, 0x7CCA, + 0x3539, 0xEBA1, 0xA252, 0x7847, 0x31B4, 0xE636, 0xAFC5, 0x75D0, 0x3C23, + 0xE2BB, 0xAB48, 0x715D, 0x38AE, +]; + +// Table of memoized values for each byte with the ANSI polynomial. +export const ANSI_TABLE: [256]u16 = [ + 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, + 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0, + 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, + 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 0xD801, 0x18C0, 0x1980, 0xD941, + 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, + 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, + 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, + 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, + 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 0x3C00, + 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, + 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981, + 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, + 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, + 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, + 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, + 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, + 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, + 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1, + 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, + 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 0xB401, 0x74C0, 0x7580, 0xB541, + 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, + 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, + 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, + 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, + 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 0x8801, + 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, + 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4400, 0x84C1, 0x8581, + 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, + 0x4100, 0x81C1, 0x8081, 0x4040, +]; + +// Populate a user-provided buffer with the memoized values for a custom +// polynomial. +// +// The user-provided polynomial must be in the reversed form. +export fn memoize(polynomial: u16, buf: *[256]u16) void = { + for (let i = 0z; i < 256; i += 1) { + let value = i: u16; + for (let z = 0z; z < 8; z += 1) { + value = if (value & 0x1 == 1) { + (value >> 1) ^ polynomial; + } else { + value >> 1; + }; + }; + buf[i] = value; + }; +}; + +type state = struct { + hash: hash::hash, + table: *[256]u16, + cval: u16, +}; + +// Creates a [[hash::hash]] which computes the CRC-16 algorithm. +// +// It takes a table of memoized values for a given polynomail (for example, +// [[IEEE_TABLE]], [[CASTAGNOLI_TABLE]], or [[KOOPMAN_TABLE]]); a table for a +// custom polynomial, populated by [[memoize]] function, may also be used. +export fn crc16(table: *[256]u16) *hash::hash = alloc(state { + hash = hash::hash { + stream = io::stream { + writer = &write, + closer = &close, + ... + }, + sum = &sum, + reset = &reset, + sz = SIZE, + }, + table = table, + cval = ~0u16, +}): *hash::hash; + +fn close(s: *io::stream) void = free(s); + +fn write(s: *io::stream, buf: const []u8) (size | io::error) = { + let s = s: *state; + for (let i = 0z; i < len(buf); i += 1) { + let rightbits = s.cval & 0xFF; + s.cval = s.table[rightbits ^ buf[i]] ^ (s.cval >> 8); + }; + return len(buf); +}; + +fn reset(h: *hash::hash) void = { + let h = h: *state; + h.cval = ~0u16; +}; + +fn sum(h: *hash::hash, buf: []u8) void = { + let h = h: *state; + endian::host.putu16(buf, ~h.cval); +}; + +export fn sum16(h: *hash::hash) u16 = { + assert(h.reset == &reset); + let h = h: *state; + return ~h.cval; +}; + +@test fn crc16() void = { + const vectors: [](str, u16, u16, u16, u16) = [ + ("", 0, 0, 0), + ("Always be sincere, even if you don't mean it. -- Harry Truman", + 0x38DF, 0x2441, 0x8E44, 0xEF5E), + ("You get along very well with everyone except animals and people.", + 0xB6AE, 0xFED0, 0x8739, 0xCF56), + ("All generalizations are false, including this one. -- Mark Twain", + 0xCA68, 0x65EC, 0x98A, 0x45B4), + ("I want peace and I'm willing to fight for it. -- Harry Truman", + 0xB0E8, 0xFE1F, 0x4659, 0x5062), + ]; + + let crc_ccitt = crc16(&CCITT_TABLE); + defer hash::close(crc_ccitt); + + let crc_cmda2000 = crc16(&CMDA2000_TABLE); + defer hash::close(crc_cmda2000); + + let crc_dect = crc16(&DECT_TABLE); + defer hash::close(crc_dect); + + let crc_ansi = crc16(&ANSI_TABLE); + defer hash::close(crc_ansi); + + let buf: [SIZE]u8 = [0...]; + + for (let i = 0z; i < len(vectors); i += 1) { + let vec = vectors[i]; + + hash::reset(crc_ccitt); + hash::write(crc_ccitt, strings::toutf8(vec.0)); + hash::sum(crc_ccitt, buf); + assert(endian::host.getu16(buf) == vec.1); + assert(sum16(crc_ccitt) == vec.1); + + hash::reset(crc_cmda2000); + hash::write(crc_cmda2000, strings::toutf8(vec.0)); + hash::sum(crc_cmda2000, buf); + assert(endian::host.getu16(buf) == vec.2); + assert(sum16(crc_cmda2000) == vec.2); + + hash::reset(crc_dect); + hash::write(crc_dect, strings::toutf8(vec.0)); + hash::sum(crc_dect, buf); + assert(endian::host.getu16(buf) == vec.3); + assert(sum16(crc_dect) == vec.3); + + hash::reset(crc_ansi); + hash::write(crc_ansi, strings::toutf8(vec.0)); + hash::sum(crc_ansi, buf); + assert(endian::host.getu16(buf) == vec.4); + assert(sum16(crc_ansi) == vec.4); + }; +}; diff --git a/scripts/gen-stdlib b/scripts/gen-stdlib @@ -435,6 +435,12 @@ hash_adler32() { gen_ssa hash::adler32 endian hash io strings } +hash_crc16() { + gen_srcs hash::crc16 \ + crc16.ha + gen_ssa hash::crc16 endian hash io strings +} + hash_crc32() { gen_srcs hash::crc32 \ crc32.ha @@ -724,6 +730,7 @@ hare_parse hare_unparse hash hash_adler32 +hash_crc16 hash_crc32 hash_fnv io diff --git a/stdlib.mk b/stdlib.mk @@ -170,6 +170,9 @@ hare_stdlib_deps+=$(stdlib_hash) stdlib_hash_adler32=$(HARECACHE)/hash/adler32/hash_adler32.o hare_stdlib_deps+=$(stdlib_hash_adler32) +stdlib_hash_crc16=$(HARECACHE)/hash/crc16/hash_crc16.o +hare_stdlib_deps+=$(stdlib_hash_crc16) + stdlib_hash_crc32=$(HARECACHE)/hash/crc32/hash_crc32.o hare_stdlib_deps+=$(stdlib_hash_crc32) @@ -603,6 +606,16 @@ $(HARECACHE)/hash/adler32/hash_adler32.ssa: $(stdlib_hash_adler32_srcs) $(stdlib @HARECACHE=$(HARECACHE) $(HAREC) $(HAREFLAGS) -o $@ -Nhash::adler32 \ -t$(HARECACHE)/hash/adler32/hash_adler32.td $(stdlib_hash_adler32_srcs) +# hash::crc16 +stdlib_hash_crc16_srcs= \ + $(STDLIB)/hash/crc16/crc16.ha + +$(HARECACHE)/hash/crc16/hash_crc16.ssa: $(stdlib_hash_crc16_srcs) $(stdlib_rt) $(stdlib_endian) $(stdlib_hash) $(stdlib_io) $(stdlib_strings) + @printf 'HAREC \t$@\n' + @mkdir -p $(HARECACHE)/hash/crc16 + @HARECACHE=$(HARECACHE) $(HAREC) $(HAREFLAGS) -o $@ -Nhash::crc16 \ + -t$(HARECACHE)/hash/crc16/hash_crc16.td $(stdlib_hash_crc16_srcs) + # hash::crc32 stdlib_hash_crc32_srcs= \ $(STDLIB)/hash/crc32/crc32.ha @@ -1084,6 +1097,9 @@ hare_testlib_deps+=$(testlib_hash) testlib_hash_adler32=$(TESTCACHE)/hash/adler32/hash_adler32.o hare_testlib_deps+=$(testlib_hash_adler32) +testlib_hash_crc16=$(TESTCACHE)/hash/crc16/hash_crc16.o +hare_testlib_deps+=$(testlib_hash_crc16) + testlib_hash_crc32=$(TESTCACHE)/hash/crc32/hash_crc32.o hare_testlib_deps+=$(testlib_hash_crc32) @@ -1532,6 +1548,16 @@ $(TESTCACHE)/hash/adler32/hash_adler32.ssa: $(testlib_hash_adler32_srcs) $(testl @HARECACHE=$(TESTCACHE) $(HAREC) $(TESTHAREFLAGS) -o $@ -Nhash::adler32 \ -t$(TESTCACHE)/hash/adler32/hash_adler32.td $(testlib_hash_adler32_srcs) +# hash::crc16 +testlib_hash_crc16_srcs= \ + $(STDLIB)/hash/crc16/crc16.ha + +$(TESTCACHE)/hash/crc16/hash_crc16.ssa: $(testlib_hash_crc16_srcs) $(testlib_rt) $(testlib_endian) $(testlib_hash) $(testlib_io) $(testlib_strings) + @printf 'HAREC \t$@\n' + @mkdir -p $(TESTCACHE)/hash/crc16 + @HARECACHE=$(TESTCACHE) $(HAREC) $(TESTHAREFLAGS) -o $@ -Nhash::crc16 \ + -t$(TESTCACHE)/hash/crc16/hash_crc16.td $(testlib_hash_crc16_srcs) + # hash::crc32 testlib_hash_crc32_srcs= \ $(STDLIB)/hash/crc32/crc32.ha