// +++Date last modified: 05-Jul-1997
/*
** CRC Calculator by Paul Johnston
** Version 1.0 Copyright 10/9/96 (September)
** Explicitly released to the public domain 30-Oct-1996 by the author
*/
#include "crc.hpp"
unsigned long Reflect(unsigned long toref, char w)
{
unsigned long v=0;
for (int i = 1; i < (w + 1); i++)
{
if (toref & 1L)
v |= 1L << (w-i);
toref>>=1;
}
return v;
}
unsigned long CrcCalc::Add (unsigned long crc, char *sCrc)
{
crc^=crxo;
if (fcrr)
{
while (*sCrc)
crc = (crc >> 8) ^ acrpt[(crc & 0xFF) ^ *sCrc++];
}
else
{
while (*sCrc)
crc = (crc << 8) ^ acrpt[((crc>>(crwd-8))&0xFF) ^ *sCrc++];
}
return (crc^crxo)&(-1l>>(32-crwd));
}
unsigned long CrcCalc::Add (unsigned long crc, PData sCrc)
{
crc^=crxo;
if (fcrr)
{
while (sCrc.l--)
crc = (crc >> 8) ^ acrpt[(crc & 0xFF) ^
*((unsigned char *)sCrc.pData)++];
}
else
{
while (sCrc.l--)
crc = (crc << 8) ^ acrpt[((crc>>(crwd-8))&0xFF) ^
*((unsigned char *)sCrc.pData)++];
}
return (crc^crxo)&(-1l>>(32-crwd));
}
unsigned long CrcCalc::Add (unsigned long crc, unsigned char sCrc)
{
crc^=crxo;
if (fcrr)
crc = (crc >> 8) ^ acrpt[(crc & 0xFF) ^ sCrc];
else crc = (crc << 8) ^ acrpt[((crc>>(crwd-8))&0xFF) ^ sCrc];
return (crc^crxo)&(-1l>>(32-crwd));
}
unsigned long CrcCalc::Init()
{
return fcrr ? Reflect(crgi, crwd)^crxo : crgi^crxo;
}
CrcCalc::CrcCalc (Crst crst)
{
switch(crst)
{
case Crc16: InitCalc (0x1021l, 0xFFFFl, 0l, 0, 16); break;
case Crc32: InitCalc (0x04C11DB7l, -1l, -1l, 1, 32); break;
case JamCrc: InitCalc (0x04C11DB7l, -1l, 0l, 1, 32); break;
case XModemCrc: InitCalc (0x8408l, 0l, 0l, 1, 16); break;
case ZModemCrc16: InitCalc (0x1021l, 0l, 0l, 0, 16); break;
case ZModemCrc32: InitCalc (0x04C11DB7l, -1l, -1l, 1, 32); break;
}
}
CrcCalc::CrcCalc (unsigned long crpNew,
unsigned long crgiNew,
unsigned long crxoNew,
unsigned char fcrrNew,
unsigned char crwdNew)
{
InitCalc (crpNew, crgiNew, crxoNew, fcrrNew, crwdNew);
}
void CrcCalc::InitCalc (unsigned long crpNew,
unsigned long crgiNew,
unsigned long crxoNew,
unsigned char fcrrNew,
unsigned char crwdNew)
{
crp=crpNew;
crgi=crgiNew;
crxo=crxoNew;
fcrr=fcrrNew;
crwd=crwdNew;
// Calculate look-up table
for (unsigned long i = 0; i <= 0xFF; i++)
{
acrpt[i]=(fcrr ? Reflect(i,8) : i)<<(crwd-8);
for (unsigned long j = 0; j < 8; j++)
acrpt[i]=(acrpt[i]<<1)^(acrpt[i]&(1l<<(crwd-1)) ? crp : 0);
if (fcrr) acrpt[i]=Reflect(acrpt[i],crwd);
}
}