Annotation of elwix/tools/oldlzma/SRC/7zip/Archive/7z_C/7zCrc.c, revision 1.1
1.1 ! misho 1: /* 7zCrc.c */
! 2:
! 3: #include "7zCrc.h"
! 4:
! 5: #define kCrcPoly 0xEDB88320
! 6:
! 7: UInt32 g_CrcTable[256];
! 8:
! 9: void InitCrcTable()
! 10: {
! 11: UInt32 i;
! 12: for (i = 0; i < 256; i++)
! 13: {
! 14: UInt32 r = i;
! 15: int j;
! 16: for (j = 0; j < 8; j++)
! 17: if (r & 1)
! 18: r = (r >> 1) ^ kCrcPoly;
! 19: else
! 20: r >>= 1;
! 21: g_CrcTable[i] = r;
! 22: }
! 23: }
! 24:
! 25: void CrcInit(UInt32 *crc) { *crc = 0xFFFFFFFF; }
! 26: UInt32 CrcGetDigest(UInt32 *crc) { return *crc ^ 0xFFFFFFFF; }
! 27:
! 28: void CrcUpdateByte(UInt32 *crc, Byte b)
! 29: {
! 30: *crc = g_CrcTable[((Byte)(*crc)) ^ b] ^ (*crc >> 8);
! 31: }
! 32:
! 33: void CrcUpdateUInt16(UInt32 *crc, UInt16 v)
! 34: {
! 35: CrcUpdateByte(crc, (Byte)v);
! 36: CrcUpdateByte(crc, (Byte)(v >> 8));
! 37: }
! 38:
! 39: void CrcUpdateUInt32(UInt32 *crc, UInt32 v)
! 40: {
! 41: int i;
! 42: for (i = 0; i < 4; i++)
! 43: CrcUpdateByte(crc, (Byte)(v >> (8 * i)));
! 44: }
! 45:
! 46: void CrcUpdateUInt64(UInt32 *crc, UInt64 v)
! 47: {
! 48: int i;
! 49: for (i = 0; i < 8; i++)
! 50: {
! 51: CrcUpdateByte(crc, (Byte)(v));
! 52: v >>= 8;
! 53: }
! 54: }
! 55:
! 56: void CrcUpdate(UInt32 *crc, const void *data, size_t size)
! 57: {
! 58: UInt32 v = *crc;
! 59: const Byte *p = (const Byte *)data;
! 60: for (; size > 0 ; size--, p++)
! 61: v = g_CrcTable[((Byte)(v)) ^ *p] ^ (v >> 8);
! 62: *crc = v;
! 63: }
! 64:
! 65: UInt32 CrcCalculateDigest(const void *data, size_t size)
! 66: {
! 67: UInt32 crc;
! 68: CrcInit(&crc);
! 69: CrcUpdate(&crc, data, size);
! 70: return CrcGetDigest(&crc);
! 71: }
! 72:
! 73: int CrcVerifyDigest(UInt32 digest, const void *data, size_t size)
! 74: {
! 75: return (CrcCalculateDigest(data, size) == digest);
! 76: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>