diff options
author | Luke Leighton <lkcl@samba.org> | 1998-10-06 21:43:58 +0000 |
---|---|---|
committer | Luke Leighton <lkcl@samba.org> | 1998-10-06 21:43:58 +0000 |
commit | 73667141af2f707fe306a0fda4853d160e55bd97 (patch) | |
tree | 41de1c7372a18e533ac52fc403611f5383045880 /source/lib/crc32.c | |
parent | 1c08cc2466f7bf615a3508e028f0b65f120d2e5d (diff) | |
download | samba-73667141af2f707fe306a0fda4853d160e55bd97.tar.gz |
crc32 algorithm. obtained from dr dobb's journal
http://www.ddj.com/ftp/1992/1992.05/crcman.zip.
copyright 1992 mark r nelson.
Diffstat (limited to 'source/lib/crc32.c')
-rw-r--r-- | source/lib/crc32.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/source/lib/crc32.c b/source/lib/crc32.c new file mode 100644 index 00000000000..ef9cefea18d --- /dev/null +++ b/source/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; +} + |