aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/check/crc32_tablegen.c
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2008-12-31 00:30:49 +0200
committerLasse Collin <lasse.collin@tukaani.org>2008-12-31 00:30:49 +0200
commit7ed9d943b31d3ee9c5fb2387e84a241ba33afe90 (patch)
tree5f9107c718aa996be6850b431ba319584064c9d7 /src/liblzma/check/crc32_tablegen.c
parentUse 28 MiB as memory usage limit for encoding in test_compress.sh. (diff)
downloadxz-7ed9d943b31d3ee9c5fb2387e84a241ba33afe90.tar.xz
Remove lzma_init() and other init functions from liblzma API.
Half of developers were already forgetting to use these functions, which could have caused total breakage in some future liblzma version or even now if --enable-small was used. Now liblzma uses pthread_once() to do the initializations unless it has been built with --disable-threads which make these initializations thread-unsafe. When --enable-small isn't used, liblzma currently gets needlessly linked against libpthread (on systems that have it). While it is stupid for now, liblzma will need threads in future anyway, so this stupidity will be temporary only. When --enable-small is used, different code CRC32 and CRC64 is now used than without --enable-small. This made the resulting binary slightly smaller, but the main reason was to clean it up and to handle the lack of lzma_init_check(). The pkg-config file lzma.pc was renamed to liblzma.pc. I'm not sure if it works correctly and portably for static linking (Libs.private includes -pthread or other operating system specific flags). Hopefully someone complains if it is bad. lzma_rc_prices[] is now included as a precomputed array even with --enable-small. It's just 128 bytes now that it uses uint8_t instead of uint32_t. Smaller array seemed to be at least as fast as the more bloated uint32_t array on x86; hopefully it's not bad on other architectures.
Diffstat (limited to '')
-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;
}