xref: /aosp_15_r20/external/lzma/CPP/Common/CrcReg.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // CrcReg.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../C/7zCrc.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../C/CpuArch.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyCom.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "../7zip/Common/RegisterCodec.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_2(
17*f6dc9357SAndroid Build Coastguard Worker   CCrcHasher
18*f6dc9357SAndroid Build Coastguard Worker   , IHasher
19*f6dc9357SAndroid Build Coastguard Worker   , ICompressSetCoderProperties
20*f6dc9357SAndroid Build Coastguard Worker )
21*f6dc9357SAndroid Build Coastguard Worker   UInt32 _crc;
22*f6dc9357SAndroid Build Coastguard Worker   Z7_CRC_UPDATE_FUNC _updateFunc;
23*f6dc9357SAndroid Build Coastguard Worker 
24*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CCrcHasher)
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker   bool SetFunctions(UInt32 tSize);
27*f6dc9357SAndroid Build Coastguard Worker public:
28*f6dc9357SAndroid Build Coastguard Worker   Byte _mtDummy[1 << 7];  // it's public to eliminate clang warning: unused private field
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker   CCrcHasher(): _crc(CRC_INIT_VAL) { SetFunctions(0); }
31*f6dc9357SAndroid Build Coastguard Worker };
32*f6dc9357SAndroid Build Coastguard Worker 
33*f6dc9357SAndroid Build Coastguard Worker bool CCrcHasher::SetFunctions(UInt32 tSize)
34*f6dc9357SAndroid Build Coastguard Worker {
35*f6dc9357SAndroid Build Coastguard Worker   const Z7_CRC_UPDATE_FUNC f = z7_GetFunc_CrcUpdate(tSize);
36*f6dc9357SAndroid Build Coastguard Worker   if (!f)
37*f6dc9357SAndroid Build Coastguard Worker   {
38*f6dc9357SAndroid Build Coastguard Worker     _updateFunc = CrcUpdate;
39*f6dc9357SAndroid Build Coastguard Worker     return false;
40*f6dc9357SAndroid Build Coastguard Worker   }
41*f6dc9357SAndroid Build Coastguard Worker   _updateFunc = f;
42*f6dc9357SAndroid Build Coastguard Worker   return true;
43*f6dc9357SAndroid Build Coastguard Worker }
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CCrcHasher::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *coderProps, UInt32 numProps))
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker   for (UInt32 i = 0; i < numProps; i++)
48*f6dc9357SAndroid Build Coastguard Worker   {
49*f6dc9357SAndroid Build Coastguard Worker     if (propIDs[i] == NCoderPropID::kDefaultProp)
50*f6dc9357SAndroid Build Coastguard Worker     {
51*f6dc9357SAndroid Build Coastguard Worker       const PROPVARIANT &prop = coderProps[i];
52*f6dc9357SAndroid Build Coastguard Worker       if (prop.vt != VT_UI4)
53*f6dc9357SAndroid Build Coastguard Worker         return E_INVALIDARG;
54*f6dc9357SAndroid Build Coastguard Worker       if (!SetFunctions(prop.ulVal))
55*f6dc9357SAndroid Build Coastguard Worker         return E_NOTIMPL;
56*f6dc9357SAndroid Build Coastguard Worker     }
57*f6dc9357SAndroid Build Coastguard Worker   }
58*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
59*f6dc9357SAndroid Build Coastguard Worker }
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CCrcHasher::Init())
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker   _crc = CRC_INIT_VAL;
64*f6dc9357SAndroid Build Coastguard Worker }
65*f6dc9357SAndroid Build Coastguard Worker 
66*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CCrcHasher::Update(const void *data, UInt32 size))
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker   _crc = _updateFunc(_crc, data, size);
69*f6dc9357SAndroid Build Coastguard Worker }
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CCrcHasher::Final(Byte *digest))
72*f6dc9357SAndroid Build Coastguard Worker {
73*f6dc9357SAndroid Build Coastguard Worker   const UInt32 val = CRC_GET_DIGEST(_crc);
74*f6dc9357SAndroid Build Coastguard Worker   SetUi32(digest, val)
75*f6dc9357SAndroid Build Coastguard Worker }
76*f6dc9357SAndroid Build Coastguard Worker 
77*f6dc9357SAndroid Build Coastguard Worker REGISTER_HASHER(CCrcHasher, 0x1, "CRC32", 4)
78