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