syncfiles/lib/crc32.c

44 lines
744 B
C

// Copyright 2022 Dietrich Epp.
// This file is part of SyncFiles. SyncFiles is licensed under the terms of the
// Mozilla Public License, version 2.0. See LICENSE.txt for details.
#include "lib/crc32.h"
static int gCRCInitted;
static UInt32 gCRCTable[256];
static void CRC32Init(void)
{
int i, j;
UInt32 v, u;
for (i = 0; i < 256; i++) {
v = i;
for (j = 0; j < 8; j++) {
u = v;
v >>= 1;
if (u & 1) {
v ^= 0xedb88320;
}
}
gCRCTable[i] = v;
}
gCRCInitted = 1;
}
UInt32 CRC32Update(UInt32 crc, const void *ptr, Size size)
{
const UInt8 *p, *e;
if (!gCRCInitted) {
CRC32Init();
}
crc = ~crc;
p = ptr;
e = p + size;
while (p < e) {
crc = (crc >> 8) ^ gCRCTable[(crc & 0xff) ^ *p++];
}
return ~crc;
}