combine crc table fillers

This commit is contained in:
Connor Olding 2012-08-05 19:03:40 -07:00
parent 1847c028fb
commit 34dc1a8df2

47
crc32.c
View File

@ -32,42 +32,23 @@ ulong crc_reflect(ulong input)
return reflected; return reflected;
} }
static void crc_fill_big_endian_table() static void crc_fill_table(int big)
{ {
const ulong lsb = 1 << 31; /* least significant bit */ ulong lsb = (big) ? 1 << 31 : 1; /* least significant bit */
ulong c; ulong poly = (big) ? crc_polynomial : crc_reflect(crc_polynomial);
int i; ulong *tc = (big) ? crc_be_table : crc_le_table;
int c, i;
for (c = 0; c < TABLE_SIZE; c++) { for (c = 0; c < TABLE_SIZE; c++, tc++) {
crc_be_table[c] = c << 24; *tc = (big) ? c << 24 : c;
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
if (crc_be_table[c] & lsb) { if (*tc & lsb) {
crc_be_table[c] <<= 1; *tc = (big) ? *tc << 1 : *tc >> 1;
crc_be_table[c] ^= crc_polynomial; *tc ^= poly;
} else { } else {
crc_be_table[c] <<= 1; *tc = (big) ? *tc << 1 : *tc >> 1;
}
crc_be_table[c] &= 0xFFFFFFFF;
}
}
}
static void crc_fill_little_endian_table()
{
const ulong lsb = 1; /* least significant bit */
const ulong reflected = crc_reflect(crc_polynomial);
ulong c;
int i;
for (c = 0; c < TABLE_SIZE; c++) {
crc_le_table[c] = c;
for (i = 0; i < 8; i++) {
if (crc_le_table[c] & lsb) {
crc_le_table[c] >>= 1;
crc_le_table[c] ^= reflected;
} else {
crc_le_table[c] >>= 1;
} }
*tc &= 0xFFFFFFFF;
} }
} }
} }
@ -76,10 +57,10 @@ static void crc_fill_tables_once()
{ {
static char filled = 0; static char filled = 0;
if (crc_big_endian && !(filled & 1)) { if (crc_big_endian && !(filled & 1)) {
crc_fill_big_endian_table(); crc_fill_table(1);
filled |= 1; filled |= 1;
} else if (!crc_big_endian && !(filled & 2)) { } else if (!crc_big_endian && !(filled & 2)) {
crc_fill_little_endian_table(); crc_fill_table(0);
filled |= 2; filled |= 2;
} }
} }