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