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