From b960514077419ddd13dcd8824f40ad1b0e3555d1 Mon Sep 17 00:00:00 2001 From: Luke Leighton Date: Tue, 6 Oct 1998 21:43:58 +0000 Subject: crc32 algorithm. obtained from dr dobb's journal http://www.ddj.com/ftp/1992/1992.05/crcman.zip. copyright 1992 mark r nelson. (This used to be commit 73667141af2f707fe306a0fda4853d160e55bd97) --- source3/lib/crc32.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 source3/lib/crc32.c (limited to 'source3') diff --git a/source3/lib/crc32.c b/source3/lib/crc32.c new file mode 100644 index 0000000000..ef9cefea18 --- /dev/null +++ b/source3/lib/crc32.c @@ -0,0 +1,70 @@ +/* + * Dr Dobb's Journal: http://www.ddj.com/ftp/1992/1992.05/crcman.zip + * + * Copyright Mark R. Nelson 1992 + * + */ + +#include "includes.h" + +#define CRC32_POLYNOMIAL 0xEDB88320L + +/***************************************************************** + Instead of performing a straightforward calculation of the 32 bit + CRC using a series of logical operations, this program uses the + faster table lookup method. This routine is called once when the + program starts up to build the table which will be used later + when calculating the CRC values. + *****************************************************************/ + +static uint32 CRCTable[256]; + +void crc32_build_table(void) +{ + int i; + int j; + uint32 crc; + + for ( i = 0; i <= 255 ; i++ ) + { + crc = i; + for ( j = 8 ; j > 0; j-- ) + { + if ( crc & 1 ) + { + crc = ( crc >> 1 ) ^ CRC32_POLYNOMIAL; + } + else + { + crc >>= 1; + } + } + CRCTable[ i ] = crc; + } +} + +/***************************************************************** + This routine calculates the CRC for a block of data using the + table lookup method. + *****************************************************************/ + +uint32 crc32_calc_buffer( uint32 count, uchar *buffer) +{ + uchar *p; + uint32 crc; + + p = buffer; + crc = 0xffffffff; + + while ( count-- != 0 ) + { + uint32 temp1; + uint32 temp2; + + temp1 = ( crc >> 8 ) & 0x00FFFFFFL; + temp2 = CRCTable[ ( (int) crc ^ *p++ ) & 0xff ]; + crc = temp1 ^ temp2; + } + return crc; +} + -- cgit