lzham_checksum.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // File: lzham_checksum.cpp
  2. #include "lzham_core.h"
  3. #include "lzham_checksum.h"
  4. namespace lzham
  5. {
  6. // Originally from the public domain stb.h header.
  7. uint adler32(const void* pBuf, size_t buflen, uint adler32)
  8. {
  9. if (!pBuf)
  10. return cInitAdler32;
  11. const uint8* buffer = static_cast<const uint8*>(pBuf);
  12. const unsigned long ADLER_MOD = 65521;
  13. unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16;
  14. size_t blocklen;
  15. unsigned long i;
  16. blocklen = buflen % 5552;
  17. while (buflen)
  18. {
  19. for (i=0; i + 7 < blocklen; i += 8)
  20. {
  21. s1 += buffer[0], s2 += s1;
  22. s1 += buffer[1], s2 += s1;
  23. s1 += buffer[2], s2 += s1;
  24. s1 += buffer[3], s2 += s1;
  25. s1 += buffer[4], s2 += s1;
  26. s1 += buffer[5], s2 += s1;
  27. s1 += buffer[6], s2 += s1;
  28. s1 += buffer[7], s2 += s1;
  29. buffer += 8;
  30. }
  31. for (; i < blocklen; ++i)
  32. s1 += *buffer++, s2 += s1;
  33. s1 %= ADLER_MOD, s2 %= ADLER_MOD;
  34. buflen -= blocklen;
  35. blocklen = 5552;
  36. }
  37. return static_cast<uint>((s2 << 16) + s1);
  38. }
  39. // Karl Malbrain's compact CRC-32, with pre and post conditioning.
  40. // See "A compact CCITT crc16 and crc32 C implementation that balances processor cache usage against speed":
  41. // http://www.geocities.com/malbrain/
  42. static const lzham_uint32 s_crc32[16] =
  43. {
  44. 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
  45. 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
  46. };
  47. uint crc32(uint crc, const lzham_uint8 *ptr, size_t buf_len)
  48. {
  49. if (!ptr)
  50. return cInitCRC32;
  51. crc = ~crc;
  52. while (buf_len--)
  53. {
  54. lzham_uint8 b = *ptr++;
  55. crc = (crc >> 4) ^ s_crc32[(crc & 0xF) ^ (b & 0xF)];
  56. crc = (crc >> 4) ^ s_crc32[(crc & 0xF) ^ (b >> 4)];
  57. }
  58. return ~crc;
  59. }
  60. } // namespace lzham