1///////////////////////////////////////////////////////////////////////////////
2//
3/// \file       crc64_small.c
4/// \brief      CRC64 calculation (size-optimized)
5//
6//  Author:     Lasse Collin
7//
8//  This file has been put into the public domain.
9//  You can do whatever you want with this file.
10//
11///////////////////////////////////////////////////////////////////////////////
12
13#include "check.h"
14
15
16static uint64_t crc64_table[256];
17
18
19static void
20crc64_init(void)
21{
22	static const uint64_t poly64 = UINT64_C(0xC96C5795D7870F42);
23
24	for (size_t b = 0; b < 256; ++b) {
25		uint64_t r = b;
26		for (size_t i = 0; i < 8; ++i) {
27			if (r & 1)
28				r = (r >> 1) ^ poly64;
29			else
30				r >>= 1;
31		}
32
33		crc64_table[b] = r;
34	}
35
36	return;
37}
38
39
40extern LZMA_API(uint64_t)
41lzma_crc64(const uint8_t *buf, size_t size, uint64_t crc)
42{
43	mythread_once(crc64_init);
44
45	crc = ~crc;
46
47	while (size != 0) {
48		crc = crc64_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8);
49		--size;
50	}
51
52	return ~crc;
53}
54