1*5a645f22SBen Gras /////////////////////////////////////////////////////////////////////////////// 2*5a645f22SBen Gras // 3*5a645f22SBen Gras /// \file crc64_tablegen.c 4*5a645f22SBen Gras /// \brief Generate crc64_table_le.h and crc64_table_be.h 5*5a645f22SBen Gras /// 6*5a645f22SBen Gras /// Compiling: gcc -std=c99 -o crc64_tablegen crc64_tablegen.c 7*5a645f22SBen Gras /// Add -DWORDS_BIGENDIAN to generate big endian table. 8*5a645f22SBen Gras // 9*5a645f22SBen Gras // Author: Lasse Collin 10*5a645f22SBen Gras // 11*5a645f22SBen Gras // This file has been put into the public domain. 12*5a645f22SBen Gras // You can do whatever you want with this file. 13*5a645f22SBen Gras // 14*5a645f22SBen Gras /////////////////////////////////////////////////////////////////////////////// 15*5a645f22SBen Gras 16*5a645f22SBen Gras #include <stdio.h> 17*5a645f22SBen Gras #include "../../common/tuklib_integer.h" 18*5a645f22SBen Gras 19*5a645f22SBen Gras 20*5a645f22SBen Gras static uint64_t crc64_table[4][256]; 21*5a645f22SBen Gras 22*5a645f22SBen Gras 23*5a645f22SBen Gras extern void init_crc64_table(void)24*5a645f22SBen Grasinit_crc64_table(void) 25*5a645f22SBen Gras { 26*5a645f22SBen Gras static const uint64_t poly64 = UINT64_C(0xC96C5795D7870F42); 27*5a645f22SBen Gras 28*5a645f22SBen Gras for (size_t s = 0; s < 4; ++s) { 29*5a645f22SBen Gras for (size_t b = 0; b < 256; ++b) { 30*5a645f22SBen Gras uint64_t r = s == 0 ? b : crc64_table[s - 1][b]; 31*5a645f22SBen Gras 32*5a645f22SBen Gras for (size_t i = 0; i < 8; ++i) { 33*5a645f22SBen Gras if (r & 1) 34*5a645f22SBen Gras r = (r >> 1) ^ poly64; 35*5a645f22SBen Gras else 36*5a645f22SBen Gras r >>= 1; 37*5a645f22SBen Gras } 38*5a645f22SBen Gras 39*5a645f22SBen Gras crc64_table[s][b] = r; 40*5a645f22SBen Gras } 41*5a645f22SBen Gras } 42*5a645f22SBen Gras 43*5a645f22SBen Gras #ifdef WORDS_BIGENDIAN 44*5a645f22SBen Gras for (size_t s = 0; s < 4; ++s) 45*5a645f22SBen Gras for (size_t b = 0; b < 256; ++b) 46*5a645f22SBen Gras crc64_table[s][b] = bswap64(crc64_table[s][b]); 47*5a645f22SBen Gras #endif 48*5a645f22SBen Gras 49*5a645f22SBen Gras return; 50*5a645f22SBen Gras } 51*5a645f22SBen Gras 52*5a645f22SBen Gras 53*5a645f22SBen Gras static void print_crc64_table(void)54*5a645f22SBen Grasprint_crc64_table(void) 55*5a645f22SBen Gras { 56*5a645f22SBen Gras printf("/* This file has been automatically generated by " 57*5a645f22SBen Gras "crc64_tablegen.c. */\n\n" 58*5a645f22SBen Gras "const uint64_t lzma_crc64_table[4][256] = {\n\t{"); 59*5a645f22SBen Gras 60*5a645f22SBen Gras for (size_t s = 0; s < 4; ++s) { 61*5a645f22SBen Gras for (size_t b = 0; b < 256; ++b) { 62*5a645f22SBen Gras if ((b % 2) == 0) 63*5a645f22SBen Gras printf("\n\t\t"); 64*5a645f22SBen Gras 65*5a645f22SBen Gras printf("UINT64_C(0x%016" PRIX64 ")", 66*5a645f22SBen Gras crc64_table[s][b]); 67*5a645f22SBen Gras 68*5a645f22SBen Gras if (b != 255) 69*5a645f22SBen Gras printf(",%s", (b+1) % 2 == 0 ? "" : " "); 70*5a645f22SBen Gras } 71*5a645f22SBen Gras 72*5a645f22SBen Gras if (s == 3) 73*5a645f22SBen Gras printf("\n\t}\n};\n"); 74*5a645f22SBen Gras else 75*5a645f22SBen Gras printf("\n\t}, {"); 76*5a645f22SBen Gras } 77*5a645f22SBen Gras 78*5a645f22SBen Gras return; 79*5a645f22SBen Gras } 80*5a645f22SBen Gras 81*5a645f22SBen Gras 82*5a645f22SBen Gras int main(void)83*5a645f22SBen Grasmain(void) 84*5a645f22SBen Gras { 85*5a645f22SBen Gras init_crc64_table(); 86*5a645f22SBen Gras print_crc64_table(); 87*5a645f22SBen Gras return 0; 88*5a645f22SBen Gras } 89