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