diff options
author | Brad King <brad.king@kitware.com> | 2014-07-21 18:31:04 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2014-07-21 19:54:44 (GMT) |
commit | 133d42fe59e2f15610afaed287ef80ec4ff6f888 (patch) | |
tree | ea0831dc0601b3e91c3881d9f182c085ad4fffe2 /Utilities/cmliblzma/liblzma/check/crc64_tablegen.c | |
parent | 8510533f0e713abeedf53a737c702d683b636ecb (diff) | |
parent | c289e63491982dd8aed7c6b6f54d390df91aaf95 (diff) | |
download | CMake-133d42fe59e2f15610afaed287ef80ec4ff6f888.zip CMake-133d42fe59e2f15610afaed287ef80ec4ff6f888.tar.gz CMake-133d42fe59e2f15610afaed287ef80ec4ff6f888.tar.bz2 |
Merge branch 'liblzma-upstream' into add-liblzma
Diffstat (limited to 'Utilities/cmliblzma/liblzma/check/crc64_tablegen.c')
-rw-r--r-- | Utilities/cmliblzma/liblzma/check/crc64_tablegen.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/Utilities/cmliblzma/liblzma/check/crc64_tablegen.c b/Utilities/cmliblzma/liblzma/check/crc64_tablegen.c new file mode 100644 index 0000000..fddaa7e --- /dev/null +++ b/Utilities/cmliblzma/liblzma/check/crc64_tablegen.c @@ -0,0 +1,88 @@ +/////////////////////////////////////////////////////////////////////////////// +// +/// \file crc64_tablegen.c +/// \brief Generate crc64_table_le.h and crc64_table_be.h +/// +/// Compiling: gcc -std=c99 -o crc64_tablegen crc64_tablegen.c +/// Add -DWORDS_BIGENDIAN to generate big endian table. +// +// Author: Lasse Collin +// +// This file has been put into the public domain. +// You can do whatever you want with this file. +// +/////////////////////////////////////////////////////////////////////////////// + +#include <stdio.h> +#include "../../common/tuklib_integer.h" + + +static uint64_t crc64_table[4][256]; + + +extern void +init_crc64_table(void) +{ + static const uint64_t poly64 = UINT64_C(0xC96C5795D7870F42); + + for (size_t s = 0; s < 4; ++s) { + for (size_t b = 0; b < 256; ++b) { + uint64_t r = s == 0 ? b : crc64_table[s - 1][b]; + + for (size_t i = 0; i < 8; ++i) { + if (r & 1) + r = (r >> 1) ^ poly64; + else + r >>= 1; + } + + crc64_table[s][b] = r; + } + } + +#ifdef WORDS_BIGENDIAN + for (size_t s = 0; s < 4; ++s) + for (size_t b = 0; b < 256; ++b) + crc64_table[s][b] = bswap64(crc64_table[s][b]); +#endif + + return; +} + + +static void +print_crc64_table(void) +{ + printf("/* This file has been automatically generated by " + "crc64_tablegen.c. */\n\n" + "const uint64_t lzma_crc64_table[4][256] = {\n\t{"); + + for (size_t s = 0; s < 4; ++s) { + for (size_t b = 0; b < 256; ++b) { + if ((b % 2) == 0) + printf("\n\t\t"); + + printf("UINT64_C(0x%016" PRIX64 ")", + crc64_table[s][b]); + + if (b != 255) + printf(",%s", (b+1) % 2 == 0 ? "" : " "); + } + + if (s == 3) + printf("\n\t}\n};\n"); + else + printf("\n\t}, {"); + } + + return; +} + + +int +main(void) +{ + init_crc64_table(); + print_crc64_table(); + return 0; +} |