1 /////////////////////////////////////////////////////////////////////////////// 2 // 3 /// \file crc32_small.c 4 /// \brief CRC32 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 uint32_t lzma_crc32_table[1][256]; 17 18 19 #ifdef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR 20 __attribute__((__constructor__)) 21 #endif 22 static void 23 crc32_init(void) 24 { 25 static const uint32_t poly32 = UINT32_C(0xEDB88320); 26 27 for (size_t b = 0; b < 256; ++b) { 28 uint32_t r = b; 29 for (size_t i = 0; i < 8; ++i) { 30 if (r & 1) 31 r = (r >> 1) ^ poly32; 32 else 33 r >>= 1; 34 } 35 36 lzma_crc32_table[0][b] = r; 37 } 38 39 return; 40 } 41 42 43 #ifndef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR 44 extern void 45 lzma_crc32_init(void) 46 { 47 mythread_once(crc32_init); 48 return; 49 } 50 #endif 51 52 53 extern LZMA_API(uint32_t) 54 lzma_crc32(const uint8_t *buf, size_t size, uint32_t crc) 55 { 56 #ifndef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR 57 lzma_crc32_init(); 58 #endif 59 60 crc = ~crc; 61 62 while (size != 0) { 63 crc = lzma_crc32_table[0][*buf++ ^ (crc & 0xFF)] ^ (crc >> 8); 64 --size; 65 } 66 67 return ~crc; 68 } 69