blob: 1b5b4840a9a252de6be26bc9165d2f86f9e85260 [file] [edit]
#include <stdlib.h>
#define BW(ty) (sizeof(ty) * 8)
#define SMIN(ty) (1 << (BW(ty) - 1))
#define CRCINIT_LE(ty, CRCTable, genpoly) \
{ \
ty crc = 1; \
for (size_t i = 128; i; i >>= 1) { \
crc = (crc >> 1) ^ (crc & 1 ? genpoly : 0); \
for (size_t j = 0; j < 256; j += 2 * i) \
CRCTable[i + j] = crc ^ CRCTable[j]; \
} \
}
#define CRCTABLE_LE(ty, CRCTable, crc_init_fn, crc, data) \
{ \
if (CRCTable[255] == 0) \
crc_init_fn(); \
for (size_t i = 0; i < sizeof(data); ++i) { \
uint8_t pos = crc ^ (data >> (i << 3)); \
crc = (BW(ty) == 8 ? 0 : (crc >> 8)) ^ CRCTable[pos]; \
} \
}
#define CRCLOOP_LE(ty, genpoly, crc, data) \
{ \
for (size_t i = 0; i < BW(data); ++i) { \
ty xor_crc_data = crc ^ data; \
ty crc_lshr = crc >> 1; \
crc = (xor_crc_data & 1) ? (crc_lshr ^ genpoly) : crc_lshr; \
data >>= 1; \
} \
}
#define CRCINIT_BE(ty, CRCTable, genpoly) \
{ \
ty crc = SMIN(ty); \
for (size_t i = 1; i < 256; i <<= 1) { \
crc = (crc << 1) ^ (crc & SMIN(ty) ? genpoly : 0); \
for (size_t j = 0; j < i; j++) \
CRCTable[i + j] = crc ^ CRCTable[j]; \
} \
}
#define CRCTABLE_BE(ty, CRCTable, crc_init_fn, crc, data) \
{ \
if (CRCTable[255] == 0) \
crc_init_fn(); \
for (size_t i = 0; i < sizeof(data); ++i) { \
uint8_t pos = (crc ^ (data << (i << 3))) >> (BW(ty) - 8); \
crc = (BW(ty) == 8 ? 0 : (crc << 8)) ^ CRCTable[pos]; \
} \
}
#define CRCLOOP_BE(ty, genpoly, crc, data) \
{ \
for (size_t i = 0; i < BW(data); ++i) { \
ty xor_crc_data = crc ^ data; \
ty crc_shl = crc << 1; \
crc = (xor_crc_data & SMIN(ty)) ? (crc_shl ^ genpoly) : crc_shl; \
data <<= 1; \
} \
}
// sample consists of random hand-picked values.
#define VERIFY_RESULT(goldfn, actualfn, res) \
{ \
static const unsigned sample[8] = {0, 1, 11, 16, 129, 142, 196, 255}; \
for (size_t i = 0; i < 8; ++i) { \
if (goldfn(sample[i], sample[7 - i]) != \
actualfn(sample[i], sample[7 - i])) \
res = 1; \
} \
}