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>