From 29f2cc302b25b45491710e49c3d0c6ab28776e46 Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sat, 23 Nov 2013 03:10:09 -0500 Subject: [PATCH] Add reference tool --- util.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/util.c b/util.c index c73b3be..92e5f75 100644 --- a/util.c +++ b/util.c @@ -455,6 +455,44 @@ uint16_t util_crc16(uint16_t current, const char *k, size_t len) { return h; } +/* + * The table above can be created with the following utility. Which + * just builds the slices and the C array as well. + */ +#if 0 +#include +#include +#include +/* compile with cc -std=c99 */ +int main(void) { + uint16_t tab[8][256]; + for (unsigned i = 0; i < 0x100; ++i) { + uint16_t x = i << 8; + for (int j = 0; j < 8; ++j) + x = (x << 1) ^ ((x & 0x8000) ? 0x1021 : 0); + tab[0][i] = x; + } + for (unsigned i = 0; i < 0x100; ++i) { + uint16_t c = tab[0][i]; + for (unsigned j = 1; j < 8; ++j) { + c = tab[0][c >> 8] ^ (c << 8); + tab[j][i] = c; + } + } + printf("static const uint16_t util_crc16_table[8][256] = {"); + for (int i = 0; i < 8; ++i) { + printf("{\n"); + for (int j = 0; j < 0x100; ++j) { + printf((j & 7) ? " " : " "); + printf((j != 0x100-1) ? "0x%04X," : "0x%04X", tab[i][j]); + if ((j & 7) == 7) + printf("\n"); + } + printf((i != 7) ? "}," : "}"); + } + printf("};\n"); +} +#endif /* * modifier is the match to make and the transposition from it, while add is the upper-value that determines the -- 2.39.2