/MTA10/mods/shared_logic/utils/zip/crc32.cpp

https://github.com/popovag/multitheftauto · C++ · 81 lines · 58 code · 18 blank · 5 comment · 6 complexity · cebbc54192fb1f67d880869207c2b247 MD5 · raw file

  1. /* CRC-32 calculator
  2. * Adapted from http://www.createwindow.org/programming/crc32/
  3. * Borrowed from Bochs x86 PC emulator(bochs)
  4. */
  5. #include <StdInc.h>
  6. #include "crc32.h"
  7. #include "zlib.h"
  8. CRCGenerator* CRCGenerator::instance = 0;
  9. CRCGenerator::CRCGenerator() {
  10. Init();
  11. }
  12. void CRCGenerator::Init ( void ) {
  13. unsigned long POLYNOMIAL = 0x04c11db7;
  14. int i;
  15. for(i = 0; i<0xFF; i++) {
  16. int j;
  17. crc32_table[i]=Reflect(i,8) << 24;
  18. for(j=0; j<8; j++)
  19. crc32_table[i] = (crc32_table[i]<<1)^(crc32_table[i] & (1<<31) ? POLYNOMIAL : 0);
  20. crc32_table[i] = Reflect(crc32_table[i], 32);
  21. }
  22. }
  23. unsigned long CRCGenerator::Reflect ( unsigned long ref, unsigned char ch ) {
  24. unsigned long value(0);
  25. int i;
  26. for(i=1; i<(ch+1); i++) {
  27. if(ref & 1)
  28. value |= 1 << (ch-i);
  29. ref >>= 1;
  30. }
  31. return value;
  32. }
  33. unsigned long CRCGenerator::GetCRC ( unsigned long * buf, unsigned long buflen ) {
  34. unsigned long ulCRC = 0xFFFFFFFF;
  35. unsigned long len = buflen;
  36. unsigned char * buffer = (unsigned char *)buf;
  37. while(len--)
  38. ulCRC=(ulCRC>>8)^crc32_table[(ulCRC & 0xFF)^*buffer++];
  39. return ulCRC ^ 0xFFFFFFFF;
  40. }
  41. unsigned long CRCGenerator::GetCRC ( char * szFilename )
  42. {
  43. return GetCRC ( szFilename, 0 );
  44. }
  45. unsigned long CRCGenerator::GetCRC ( char * szFilename, unsigned long ucOldCRC )
  46. {
  47. FILE * file = fopen ( szFilename, "rb" );
  48. if ( file )
  49. {
  50. fseek ( file, 0, SEEK_END );
  51. unsigned long ulLength = ftell ( file );
  52. rewind ( file );
  53. char * buffer = new char [ ulLength + 1 ];
  54. memset(buffer, 0, ulLength + 1);
  55. fread ( buffer, 1, ulLength, file );
  56. fclose ( file );
  57. // I assume the zlib version is faster, uncomment the second part if not
  58. unsigned long ulCRC = crc32 ( ucOldCRC, (Bytef *)buffer, ulLength);// GetCRC ( (unsigned long *)buffer, strlen(buffer) + 1 );
  59. delete[] buffer;
  60. return ulCRC;
  61. }
  62. return NULL;
  63. }