From eed7aee495b7dd256ddd15f22513566706935857 Mon Sep 17 00:00:00 2001 From: pavelyakov Date: Sat, 21 Mar 2020 10:59:27 +0000 Subject: [PATCH] Addition new function for crc32 checksum! git-svn-id: svn://kolibrios.org@7740 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/cmm/lib/crc32.h | 58 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100755 programs/cmm/lib/crc32.h diff --git a/programs/cmm/lib/crc32.h b/programs/cmm/lib/crc32.h new file mode 100755 index 0000000000..60a6cfca0a --- /dev/null +++ b/programs/cmm/lib/crc32.h @@ -0,0 +1,58 @@ +/* CRC32 function; Author PaulCodeman */ +:dword crc32Table = 0; +:dword makeCRCTable(void) +{ + dword i = 0; + dword c = 0; + dword ii = 0; + dword crcTable = 0; + IF (crc32Table) RETURN 0; + crc32Table = malloc(4*256); + crcTable = crc32Table; + WHILE (i < 256) + { + c = i; + ii = 0; + WHILE (ii < 8) + { + IF (c&1) + { + c >>= 1; + c ^= 0xEDB88320; + } + ELSE c >>= 1; + ii++; + } + DSDWORD[crcTable] = c; + crcTable += 4; + i++; + } +} +:dword crc32(dword bytes, length) +{ + dword crc = 0; + dword i = 0; + byte b = 0; + IF (!crc32Table) makeCRCTable(); + crc = 0xFFFFFFFF; + WHILE (i < length) + { + b = DSBYTE[bytes]; + bytes++; + EDX = crc^b; + EDX &= 0xFF; + EDX <<= 2; + EDX += crc32Table; + crc >>= 8; + crc ^= DSDWORD[EDX]; + i++; + } + RETURN crc ^ 0xFFFFFFFF; +} + +/* EXAMPLE +dword str = 0; +str = "Kevin van Zonneveld"; +crc32(str, strlen(str)); +IF (EAX == 1249991249) ExitProcess(); +*/ \ No newline at end of file