windows-nt/Source/XPSP1/NT/ds/xpress/xprs-crc.c
2020-09-26 16:20:57 +08:00

110 lines
2.4 KiB
C

/* ------------------------------------------------------------------------ */
/* */
/* Copyright (c) Microsoft Corporation, 2000-2001. All rights reserved. */
/* Copyright (c) Andrew Kadatch, 1991-2001. All rights reserved. */
/* */
/* Microsoft Confidential -- do not redistribute. */
/* */
/* ------------------------------------------------------------------------ */
#include "xpress.h"
#include "xprs.h"
/* ------------------------ CRC-32 ---------------------------- */
/* ------ */
static uint32 crc32_table[256];
static int crc32_initialized = 0;
static void crc32_init (void)
{
xint i, j;
uint32 k, m = 0xedb88320L;
if (crc32_initialized) return;
for (i = 0; i < 256; ++i)
{
k = i;
j = 8;
do {
if ((k&1) == 0)
k >>= 1;
else
{
k >>= 1;
k ^= m;
};
--j;
} while (j);
crc32_table[i] = k;
}
crc32_initialized = 1;
}
static uint32 crc32 (const uchar *p, xint n, uint32 k)
{
uint32 *table;
if (n <= 0)
return (k);
k ^= (uint32) 0xffffffffL;
table = crc32_table;
#define X(i) k = table[((uchar) k) ^ p[i]] ^ (k >> 8)
if ((n -= 32) >= 0) do
{
X(000); X(001); X(002); X(003); X(004); X(005); X(006); X(007);
X(010); X(011); X(012); X(013); X(014); X(015); X(016); X(017);
X(020); X(021); X(022); X(023); X(024); X(025); X(026); X(027);
X(030); X(031); X(032); X(033); X(034); X(035); X(036); X(037);
p += 32;
}
while ((n -= 32) >= 0);
if ((n += 32) > 0) do
{
X (0);
++p;
--n;
}
while (n);
#undef X
k ^= (uint32) 0xffffffffL;
return (k);
}
int
XPRESS_CALL
XpressCrc32
(
const void *data, // beginning of data block
int bytes, // number of bytes
int crc // initial value
)
{
if (!crc32_initialized)
crc32_init ();
return (crc32 (data, bytes, crc));
}
#if 0
int main (void)
{
int i = 0;
crc32_init ();
printf ("{\n");
for (;;)
{
printf (" 0x%08lx", (unsigned long) crc32_table[i]);
++i;
if (i & 3)
printf (",");
else if (i == 256)
break;
else printf (",\n");
}
printf ("\n}\n");
return (0);
}
#endif