Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /* CRC32 function; Author PaulCodeman */
  2. :dword crc32Table = 0;
  3. :dword makeCRCTable(void)
  4. {
  5.         dword i = 0;
  6.         dword c = 0;
  7.         dword ii = 0;
  8.         dword crcTable = 0;
  9.         IF (crc32Table) RETURN 0;
  10.         crc32Table = malloc(4*256);
  11.         crcTable = crc32Table;
  12.         WHILE (i < 256)
  13.         {
  14.                 c = i;
  15.                 ii = 0;
  16.                 WHILE (ii < 8)
  17.                 {
  18.                         IF (c&1)
  19.                         {
  20.                                 c >>= 1;
  21.                                 c ^= 0xEDB88320;
  22.                         }
  23.                         ELSE c >>= 1;
  24.                         ii++;
  25.                 }
  26.                 DSDWORD[crcTable] = c;
  27.                 crcTable += 4;
  28.                 i++;
  29.         }
  30. }
  31. :dword crc32(dword bytes, length)
  32. {
  33.         dword crc = 0;
  34.         dword i = 0;
  35.         byte b = 0;
  36.         IF (!crc32Table) makeCRCTable();
  37.         crc = 0xFFFFFFFF;
  38.         WHILE (i < length)
  39.         {
  40.                 b = DSBYTE[bytes];
  41.                 bytes++;
  42.                 EDX = crc^b;
  43.                 EDX &= 0xFF;
  44.                 EDX <<= 2;
  45.                 EDX += crc32Table;
  46.                 crc >>= 8;
  47.                 crc ^= DSDWORD[EDX];
  48.                 i++;
  49.         }
  50.         RETURN crc ^ 0xFFFFFFFF;
  51. }
  52.  
  53. /* EXAMPLE
  54. dword str = 0;
  55. str = "Kevin van Zonneveld";
  56. crc32(str, strlen(str));
  57. IF (EAX == 1249991249) ExitProcess();
  58. */