1 | ///////////////////////////////////////////////////////////////////////////////
|
---|
2 | //
|
---|
3 | /// \file crc32_tablegen.c
|
---|
4 | /// \brief Generate crc32_table_le.h and crc32_table_be.h
|
---|
5 | ///
|
---|
6 | /// Compiling: gcc -std=c99 -o crc32_tablegen crc32_tablegen.c
|
---|
7 | /// Add -DWORDS_BIGENDIAN to generate big endian table.
|
---|
8 | /// Add -DLZ_HASH_TABLE to generate lz_encoder_hash_table.h (little endian).
|
---|
9 | //
|
---|
10 | // Author: Lasse Collin
|
---|
11 | //
|
---|
12 | // This file has been put into the public domain.
|
---|
13 | // You can do whatever you want with this file.
|
---|
14 | //
|
---|
15 | ///////////////////////////////////////////////////////////////////////////////
|
---|
16 |
|
---|
17 | #include <stdio.h>
|
---|
18 | #include "../../common/tuklib_integer.h"
|
---|
19 |
|
---|
20 |
|
---|
21 | static uint32_t crc32_table[8][256];
|
---|
22 |
|
---|
23 |
|
---|
24 | static void
|
---|
25 | init_crc32_table(void)
|
---|
26 | {
|
---|
27 | static const uint32_t poly32 = UINT32_C(0xEDB88320);
|
---|
28 |
|
---|
29 | for (size_t s = 0; s < 8; ++s) {
|
---|
30 | for (size_t b = 0; b < 256; ++b) {
|
---|
31 | uint32_t r = s == 0 ? b : crc32_table[s - 1][b];
|
---|
32 |
|
---|
33 | for (size_t i = 0; i < 8; ++i) {
|
---|
34 | if (r & 1)
|
---|
35 | r = (r >> 1) ^ poly32;
|
---|
36 | else
|
---|
37 | r >>= 1;
|
---|
38 | }
|
---|
39 |
|
---|
40 | crc32_table[s][b] = r;
|
---|
41 | }
|
---|
42 | }
|
---|
43 |
|
---|
44 | #ifdef WORDS_BIGENDIAN
|
---|
45 | for (size_t s = 0; s < 8; ++s)
|
---|
46 | for (size_t b = 0; b < 256; ++b)
|
---|
47 | crc32_table[s][b] = bswap32(crc32_table[s][b]);
|
---|
48 | #endif
|
---|
49 |
|
---|
50 | return;
|
---|
51 | }
|
---|
52 |
|
---|
53 |
|
---|
54 | static void
|
---|
55 | print_crc32_table(void)
|
---|
56 | {
|
---|
57 | printf("/* This file has been automatically generated by "
|
---|
58 | "crc32_tablegen.c. */\n\n"
|
---|
59 | "const uint32_t lzma_crc32_table[8][256] = {\n\t{");
|
---|
60 |
|
---|
61 | for (size_t s = 0; s < 8; ++s) {
|
---|
62 | for (size_t b = 0; b < 256; ++b) {
|
---|
63 | if ((b % 4) == 0)
|
---|
64 | printf("\n\t\t");
|
---|
65 |
|
---|
66 | printf("0x%08" PRIX32, crc32_table[s][b]);
|
---|
67 |
|
---|
68 | if (b != 255)
|
---|
69 | printf(",%s", (b+1) % 4 == 0 ? "" : " ");
|
---|
70 | }
|
---|
71 |
|
---|
72 | if (s == 7)
|
---|
73 | printf("\n\t}\n};\n");
|
---|
74 | else
|
---|
75 | printf("\n\t}, {");
|
---|
76 | }
|
---|
77 |
|
---|
78 | return;
|
---|
79 | }
|
---|
80 |
|
---|
81 |
|
---|
82 | static void
|
---|
83 | print_lz_table(void)
|
---|
84 | {
|
---|
85 | printf("/* This file has been automatically generated by "
|
---|
86 | "crc32_tablegen.c. */\n\n"
|
---|
87 | "const uint32_t lzma_lz_hash_table[256] = {");
|
---|
88 |
|
---|
89 | for (size_t b = 0; b < 256; ++b) {
|
---|
90 | if ((b % 4) == 0)
|
---|
91 | printf("\n\t");
|
---|
92 |
|
---|
93 | printf("0x%08" PRIX32, crc32_table[0][b]);
|
---|
94 |
|
---|
95 | if (b != 255)
|
---|
96 | printf(",%s", (b+1) % 4 == 0 ? "" : " ");
|
---|
97 | }
|
---|
98 |
|
---|
99 | printf("\n};\n");
|
---|
100 |
|
---|
101 | return;
|
---|
102 | }
|
---|
103 |
|
---|
104 |
|
---|
105 | int
|
---|
106 | main(void)
|
---|
107 | {
|
---|
108 | init_crc32_table();
|
---|
109 |
|
---|
110 | #ifdef LZ_HASH_TABLE
|
---|
111 | print_lz_table();
|
---|
112 | #else
|
---|
113 | print_crc32_table();
|
---|
114 | #endif
|
---|
115 |
|
---|
116 | return 0;
|
---|
117 | }
|
---|