Path: blob/master/Utilities/cmliblzma/liblzma/check/crc64_small.c
3153 views
// SPDX-License-Identifier: 0BSD12///////////////////////////////////////////////////////////////////////////////3//4/// \file crc64_small.c5/// \brief CRC64 calculation (size-optimized)6//7// Author: Lasse Collin8//9///////////////////////////////////////////////////////////////////////////////1011#include "check.h"121314static uint64_t crc64_table[256];151617#ifdef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR18__attribute__((__constructor__))19#endif20static void21crc64_init(void)22{23static const uint64_t poly64 = UINT64_C(0xC96C5795D7870F42);2425for (size_t b = 0; b < 256; ++b) {26uint64_t r = b;27for (size_t i = 0; i < 8; ++i) {28if (r & 1)29r = (r >> 1) ^ poly64;30else31r >>= 1;32}3334crc64_table[b] = r;35}3637return;38}394041extern LZMA_API(uint64_t)42lzma_crc64(const uint8_t *buf, size_t size, uint64_t crc)43{44#ifndef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR45mythread_once(crc64_init);46#endif4748crc = ~crc;4950while (size != 0) {51crc = crc64_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8);52--size;53}5455return ~crc;56}575859