aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/check/crc32_tablegen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/liblzma/check/crc32_tablegen.c')
-rw-r--r--src/liblzma/check/crc32_tablegen.c55
1 files changed, 48 insertions, 7 deletions
diff --git a/src/liblzma/check/crc32_tablegen.c b/src/liblzma/check/crc32_tablegen.c
index f793d594..d0c41caa 100644
--- a/src/liblzma/check/crc32_tablegen.c
+++ b/src/liblzma/check/crc32_tablegen.c
@@ -1,7 +1,7 @@
///////////////////////////////////////////////////////////////////////////////
//
/// \file crc32_tablegen.c
-/// \brief Generates CRC32 crc32_table.c
+/// \brief Generate crc32_table_le.h and crc32_table_be.h
///
/// Compiling: gcc -std=c99 -o crc32_tablegen crc32_tablegen.c
/// Add -DWORDS_BIGENDIAN to generate big endian table.
@@ -14,18 +14,50 @@
//
///////////////////////////////////////////////////////////////////////////////
-#include <sys/types.h>
#include <inttypes.h>
#include <stdio.h>
-#include "crc32_init.c"
+#ifdef WORDS_BIGENDIAN
+# include "../../common/bswap.h"
+#endif
-int
-main()
+static uint32_t crc32_table[8][256];
+
+
+static void
+init_crc32_table(void)
{
- lzma_crc32_init();
+ static const uint32_t poly32 = UINT32_C(0xEDB88320);
+
+ for (size_t s = 0; s < 8; ++s) {
+ for (size_t b = 0; b < 256; ++b) {
+ uint32_t r = s == 0 ? b : crc32_table[s - 1][b];
+
+ for (size_t i = 0; i < 8; ++i) {
+ if (r & 1)
+ r = (r >> 1) ^ poly32;
+ else
+ r >>= 1;
+ }
+
+ crc32_table[s][b] = r;
+ }
+ }
+#ifdef WORDS_BIGENDIAN
+ for (size_t s = 0; s < 8; ++s)
+ for (size_t b = 0; b < 256; ++b)
+ crc32_table[s][b] = bswap_32(crc32_table[s][b]);
+#endif
+
+ return;
+}
+
+
+static void
+print_crc32_table(void)
+{
printf("/* This file has been automatically generated by "
"crc32_tablegen.c. */\n\n"
"const uint32_t lzma_crc32_table[8][256] = {\n\t{");
@@ -35,7 +67,7 @@ main()
if ((b % 4) == 0)
printf("\n\t\t");
- printf("0x%08" PRIX32, lzma_crc32_table[s][b]);
+ printf("0x%08" PRIX32, crc32_table[s][b]);
if (b != 255)
printf(", ");
@@ -47,5 +79,14 @@ main()
printf("\n\t}, {");
}
+ return;
+}
+
+
+int
+main(void)
+{
+ init_crc32_table();
+ print_crc32_table();
return 0;
}