xref: /freebsd/contrib/xz/src/liblzma/check/crc32_tablegen.c (revision 3b35e7ee8de9b0260149a2b77e87a2b9c7a36244)
1*3b35e7eeSXin LI // SPDX-License-Identifier: 0BSD
2*3b35e7eeSXin LI 
381ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
481ad8388SMartin Matuska //
581ad8388SMartin Matuska /// \file       crc32_tablegen.c
681ad8388SMartin Matuska /// \brief      Generate crc32_table_le.h and crc32_table_be.h
781ad8388SMartin Matuska ///
881ad8388SMartin Matuska /// Compiling: gcc -std=c99 -o crc32_tablegen crc32_tablegen.c
981ad8388SMartin Matuska /// Add -DWORDS_BIGENDIAN to generate big endian table.
1081ad8388SMartin Matuska /// Add -DLZ_HASH_TABLE to generate lz_encoder_hash_table.h (little endian).
1181ad8388SMartin Matuska //
1281ad8388SMartin Matuska //  Author:     Lasse Collin
1381ad8388SMartin Matuska //
1481ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
1581ad8388SMartin Matuska 
1681ad8388SMartin Matuska #include <stdio.h>
1781ad8388SMartin Matuska #include "../../common/tuklib_integer.h"
1881ad8388SMartin Matuska 
1981ad8388SMartin Matuska 
2081ad8388SMartin Matuska static uint32_t crc32_table[8][256];
2181ad8388SMartin Matuska 
2281ad8388SMartin Matuska 
2381ad8388SMartin Matuska static void
2481ad8388SMartin Matuska init_crc32_table(void)
2581ad8388SMartin Matuska {
2681ad8388SMartin Matuska 	static const uint32_t poly32 = UINT32_C(0xEDB88320);
2781ad8388SMartin Matuska 
2881ad8388SMartin Matuska 	for (size_t s = 0; s < 8; ++s) {
2981ad8388SMartin Matuska 		for (size_t b = 0; b < 256; ++b) {
3081ad8388SMartin Matuska 			uint32_t r = s == 0 ? b : crc32_table[s - 1][b];
3181ad8388SMartin Matuska 
3281ad8388SMartin Matuska 			for (size_t i = 0; i < 8; ++i) {
3381ad8388SMartin Matuska 				if (r & 1)
3481ad8388SMartin Matuska 					r = (r >> 1) ^ poly32;
3581ad8388SMartin Matuska 				else
3681ad8388SMartin Matuska 					r >>= 1;
3781ad8388SMartin Matuska 			}
3881ad8388SMartin Matuska 
3981ad8388SMartin Matuska 			crc32_table[s][b] = r;
4081ad8388SMartin Matuska 		}
4181ad8388SMartin Matuska 	}
4281ad8388SMartin Matuska 
4381ad8388SMartin Matuska #ifdef WORDS_BIGENDIAN
4481ad8388SMartin Matuska 	for (size_t s = 0; s < 8; ++s)
4581ad8388SMartin Matuska 		for (size_t b = 0; b < 256; ++b)
46*3b35e7eeSXin LI 			crc32_table[s][b] = byteswap32(crc32_table[s][b]);
4781ad8388SMartin Matuska #endif
4881ad8388SMartin Matuska 
4981ad8388SMartin Matuska 	return;
5081ad8388SMartin Matuska }
5181ad8388SMartin Matuska 
5281ad8388SMartin Matuska 
5381ad8388SMartin Matuska static void
5481ad8388SMartin Matuska print_crc32_table(void)
5581ad8388SMartin Matuska {
56*3b35e7eeSXin LI 	// Split the SPDX string so that it won't accidentally match
57*3b35e7eeSXin LI 	// when tools search for the string.
58*3b35e7eeSXin LI 	printf("// SPDX" "-License-Identifier" ": 0BSD\n\n"
59*3b35e7eeSXin LI 		"// This file has been generated by crc32_tablegen.c.\n\n"
6081ad8388SMartin Matuska 		"const uint32_t lzma_crc32_table[8][256] = {\n\t{");
6181ad8388SMartin Matuska 
6281ad8388SMartin Matuska 	for (size_t s = 0; s < 8; ++s) {
6381ad8388SMartin Matuska 		for (size_t b = 0; b < 256; ++b) {
6481ad8388SMartin Matuska 			if ((b % 4) == 0)
6581ad8388SMartin Matuska 				printf("\n\t\t");
6681ad8388SMartin Matuska 
6781ad8388SMartin Matuska 			printf("0x%08" PRIX32, crc32_table[s][b]);
6881ad8388SMartin Matuska 
6981ad8388SMartin Matuska 			if (b != 255)
7081ad8388SMartin Matuska 				printf(",%s", (b+1) % 4 == 0 ? "" : " ");
7181ad8388SMartin Matuska 		}
7281ad8388SMartin Matuska 
7381ad8388SMartin Matuska 		if (s == 7)
7481ad8388SMartin Matuska 			printf("\n\t}\n};\n");
7581ad8388SMartin Matuska 		else
7681ad8388SMartin Matuska 			printf("\n\t}, {");
7781ad8388SMartin Matuska 	}
7881ad8388SMartin Matuska 
7981ad8388SMartin Matuska 	return;
8081ad8388SMartin Matuska }
8181ad8388SMartin Matuska 
8281ad8388SMartin Matuska 
8381ad8388SMartin Matuska static void
8481ad8388SMartin Matuska print_lz_table(void)
8581ad8388SMartin Matuska {
86*3b35e7eeSXin LI 	// Split the SPDX string so that it won't accidentally match
87*3b35e7eeSXin LI 	// when tools search for the string.
88*3b35e7eeSXin LI 	printf("// SPDX" "-License-Identifier" ": 0BSD\n\n"
89*3b35e7eeSXin LI 		"// This file has been generated by crc32_tablegen.c.\n\n"
9081ad8388SMartin Matuska 		"const uint32_t lzma_lz_hash_table[256] = {");
9181ad8388SMartin Matuska 
9281ad8388SMartin Matuska 	for (size_t b = 0; b < 256; ++b) {
9381ad8388SMartin Matuska 		if ((b % 4) == 0)
9481ad8388SMartin Matuska 			printf("\n\t");
9581ad8388SMartin Matuska 
9681ad8388SMartin Matuska 		printf("0x%08" PRIX32, crc32_table[0][b]);
9781ad8388SMartin Matuska 
9881ad8388SMartin Matuska 		if (b != 255)
9981ad8388SMartin Matuska 			printf(",%s", (b+1) % 4 == 0 ? "" : " ");
10081ad8388SMartin Matuska 	}
10181ad8388SMartin Matuska 
10281ad8388SMartin Matuska 	printf("\n};\n");
10381ad8388SMartin Matuska 
10481ad8388SMartin Matuska 	return;
10581ad8388SMartin Matuska }
10681ad8388SMartin Matuska 
10781ad8388SMartin Matuska 
10881ad8388SMartin Matuska int
10981ad8388SMartin Matuska main(void)
11081ad8388SMartin Matuska {
11181ad8388SMartin Matuska 	init_crc32_table();
11281ad8388SMartin Matuska 
11381ad8388SMartin Matuska #ifdef LZ_HASH_TABLE
11481ad8388SMartin Matuska 	print_lz_table();
11581ad8388SMartin Matuska #else
11681ad8388SMartin Matuska 	print_crc32_table();
11781ad8388SMartin Matuska #endif
11881ad8388SMartin Matuska 
11981ad8388SMartin Matuska 	return 0;
12081ad8388SMartin Matuska }
121