File indexing completed on 2025-02-02 04:25:58
0001 /* Copyright 2015 the unarr project authors (see AUTHORS file). 0002 License: LGPLv3 */ 0003 0004 #include "unarr-imp.h" 0005 0006 #ifndef HAVE_ZLIB 0007 0008 /* code adapted from https://gnunet.org/svn/gnunet/src/util/crypto_crc.c (public domain) */ 0009 0010 static bool crc_table_ready = false; 0011 static uint32_t crc_table[256]; 0012 0013 uint32_t ar_crc32(uint32_t crc32, const unsigned char *data, size_t data_len) 0014 { 0015 if (!crc_table_ready) { 0016 uint32_t i, j; 0017 uint32_t h = 1; 0018 crc_table[0] = 0; 0019 for (i = 128; i; i >>= 1) { 0020 h = (h >> 1) ^ ((h & 1) ? 0xEDB88320 : 0); 0021 for (j = 0; j < 256; j += 2 * i) { 0022 crc_table[i + j] = crc_table[j] ^ h; 0023 } 0024 } 0025 crc_table_ready = true; 0026 } 0027 0028 crc32 = crc32 ^ 0xFFFFFFFF; 0029 while (data_len-- > 0) { 0030 crc32 = (crc32 >> 8) ^ crc_table[(crc32 ^ *data++) & 0xFF]; 0031 } 0032 return crc32 ^ 0xFFFFFFFF; 0033 } 0034 0035 #else 0036 0037 #include <zlib.h> 0038 0039 uint32_t ar_crc32(uint32_t crc, const unsigned char *data, size_t data_len) 0040 { 0041 #if SIZE_MAX > UINT32_MAX 0042 while (data_len > UINT32_MAX) { 0043 crc = crc32(crc, data, UINT32_MAX); 0044 data += UINT32_MAX; 0045 data_len -= UINT32_MAX; 0046 } 0047 #endif 0048 return crc32(crc, data, (uint32_t)data_len); 0049 } 0050 0051 #endif