Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/* ------------------------------------------------------------------------ */ /* */ /* 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
|