mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-08 01:45:32 +00:00
Adds a precompiled header for kmdecomp so that we can simply #include "pch.h" in the common vkeys.h, and updates refs to vkeys.h for kmdecomp.
69 lines
1.4 KiB
C++
69 lines
1.4 KiB
C++
#include "pch.h"
|
|
|
|
/*
|
|
* 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.
|
|
*/
|
|
|
|
#define CRC32_POLYNOMIAL 0xEDB88320L
|
|
|
|
unsigned long CRCTable[256];
|
|
|
|
static void BuildCRCTable(void)
|
|
{
|
|
static BOOL TableBuilt = FALSE;
|
|
int i;
|
|
int j;
|
|
unsigned long crc;
|
|
|
|
if(!TableBuilt)
|
|
{
|
|
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. It accepts an original value for the crc,
|
|
* and returns the updated value.
|
|
*/
|
|
|
|
static unsigned long CalculateBufferCRC(unsigned long count, BYTE *p)
|
|
{
|
|
unsigned long temp1;
|
|
unsigned long temp2;
|
|
unsigned long crc = 0xFFFFFFFFL;
|
|
|
|
while (count-- != 0)
|
|
{
|
|
temp1 = ( crc >> 8 ) & 0x00FFFFFFL;
|
|
temp2 = CRCTable[((int) crc ^ *p++) & 0xff];
|
|
crc = temp1 ^ temp2;
|
|
}
|
|
|
|
return crc;
|
|
}
|
|
|
|
|
|
BOOL VerifyChecksum(LPBYTE buf, LPDWORD CheckSum, DWORD sz)
|
|
{
|
|
DWORD tempcs;
|
|
|
|
tempcs = *CheckSum;
|
|
*CheckSum = 0;
|
|
|
|
BuildCRCTable();
|
|
return tempcs == CalculateBufferCRC(sz, buf);
|
|
}
|