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