1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-11 05:18:09 +03:00

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 73667141af)
This commit is contained in:
Luke Leighton 1998-10-06 21:43:58 +00:00
parent f8a3e2df11
commit b960514077

70
source3/lib/crc32.c Normal file
View File

@ -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;
}