module Crc32

Constants

VERSION

Public Class Methods

calculate(p1, p2, p3) click to toggle source
VALUE method_crc32_calculate(VALUE self, VALUE data, VALUE length, VALUE previousCrc32) {
  uint32_t datalen;
  uint32_t crc;
  uint32_t one, two;
  char *bindata;
  uint32_t* current;
  unsigned char* currentChar;
  VALUE crc32;

  datalen = NUM2UINT(length);
  bindata = StringValuePtr(data);
  crc = NUM2UINT(previousCrc32) ^ ~ 0U;

  current = (uint32_t*) bindata;
  // process eight bytes at once
  while (datalen >= 8)
  {
    one = *current++ ^ crc;
    two = *current++;
    crc = Crc32Lookup[7][ one  & 0xFF] ^
      Crc32Lookup[6][(one>> 8) & 0xFF] ^
      Crc32Lookup[5][(one>>16) & 0xFF] ^
      Crc32Lookup[4][ one>>24        ] ^
      Crc32Lookup[3][ two      & 0xFF] ^
      Crc32Lookup[2][(two>> 8) & 0xFF] ^
      Crc32Lookup[1][(two>>16) & 0xFF] ^
      Crc32Lookup[0][ two>>24        ];
    datalen -= 8;
  }

  currentChar = (unsigned char*) current;
  // remaining 1 to 7 bytes
  while (datalen--)
    crc = (crc >> 8) ^ Crc32Lookup[0][(crc & 0xFF) ^ *currentChar++];
  crc =  crc ^ ~0U;
  crc32=UINT2NUM(crc);
  return crc32;
}