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