(root)/
xz-5.4.5/
src/
liblzma/
check/
crc64_small.c
       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  
      16  static uint64_t crc64_table[256];
      17  
      18  
      19  #ifdef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR
      20  __attribute__((__constructor__))
      21  #endif
      22  static void
      23  crc64_init(void)
      24  {
      25  	static const uint64_t poly64 = UINT64_C(0xC96C5795D7870F42);
      26  
      27  	for (size_t b = 0; b < 256; ++b) {
      28  		uint64_t r = b;
      29  		for (size_t i = 0; i < 8; ++i) {
      30  			if (r & 1)
      31  				r = (r >> 1) ^ poly64;
      32  			else
      33  				r >>= 1;
      34  		}
      35  
      36  		crc64_table[b] = r;
      37  	}
      38  
      39  	return;
      40  }
      41  
      42  
      43  extern LZMA_API(uint64_t)
      44  lzma_crc64(const uint8_t *buf, size_t size, uint64_t crc)
      45  {
      46  #ifndef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR
      47  	mythread_once(crc64_init);
      48  #endif
      49  
      50  	crc = ~crc;
      51  
      52  	while (size != 0) {
      53  		crc = crc64_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8);
      54  		--size;
      55  	}
      56  
      57  	return ~crc;
      58  }