/* FILE: crc.c */ #include "crc.h" CRC_TYPE crc( unsigned char *ptr, register int len ) { static int tblInitialized = 0; static CRC_TYPE crcReg, crcTbl[ 256 ]; unsigned long i, j, k; if( !tblInitialized ){ /* init crc lookup table only once */ #ifdef CRC8 for( i=0; i < 256; i++ ){ j = i; for( k=8; k--; ){ j = j & 0x80? (j << 1) ^ POLY : j << 1; } crcTbl[ i ] = (CRC_TYPE)j; } #endif #ifdef CRC10 for( i=0; i < 256; i++ ){ j = i << 2; for( k=8; k--; ){ if( (j <<= 1) & 0x0400 ){ j ^= POLY; } } crcTbl[ i ] = (CRC_TYPE)j; } #endif #ifdef XMODEM for( i=0; i < 256; i++ ){ j = i << 8; for( k=8; k--; ){ j = j & 0x8000? (j << 1) ^ POLY : j << 1; } crcTbl[ i ] = (CRC_TYPE)j; } #endif #if defined X25 || CRC16 || MILSTD188 || AUTODINII for( i=0; i < 256; i++ ){ j = i; for( k=8; k--; ){ j = j & 1? (j >> 1) ^ POLY : j >> 1; } crcTbl[ i ] = (CRC_TYPE)j; } #endif tblInitialized = 1; } /* end of if(!tblInitialized) */ crcReg = CRC_INIT; /* always init register */ /* calc CRC */ for( ;len--; ){ #ifdef CRC8 crcReg = crcTbl[ crcReg ^ *ptr++ ]; #endif #ifdef CRC10 crcReg = (CRC_TYPE)(((crcReg << 8) & 0x3ff) ^ crcTbl[ ((crcReg >> 2) & 0x00ff) ] ^ *ptr++ ); #endif #ifdef XMODEM crcReg = (CRC_TYPE)((crcReg << 8) ^ crcTbl[ ((crcReg >> 8) & 0x00ff) ^ *ptr++ ]); #endif #if defined X25 || CRC16 || MILSTD188 || AUTODINII crcReg = (CRC_TYPE)((crcReg >> 8) ^ crcTbl[ (crcReg ^ *ptr++) & 0x00ff ]); #endif } /* finish up and return */ #ifdef CRC10 /* flush out with two NULL bytes */ for( len=2; len--; ){ crcReg = (CRC_TYPE)(((crcReg << 8) & 0x3ff) ^ crcTbl[ ((crcReg >> 2) & 0x00ff) ] ); } return( crcReg ); #endif #ifdef X25 /* complement and swap bytes */ return( ~(((crcReg & 0xff) << 8) | (crcReg >> 8)) ); #endif #ifdef AUTODINII /* complement without swap */ return( ~crcReg ); #endif #if defined CRC8 || CRC16 || XMODEM || MILSTD188 return( crcReg ); #endif } /* end of crc() */