Merge pull request #4324 from FernetMenta/wasapi
[vuplus_xbmc] / lib / UnrarXLib / crc.cpp
1 #include "rar.hpp"
2
3 uint CRCTab[256];
4
5 void InitCRC()
6 {
7   for (int I=0;I<256;I++)
8   {
9     uint C=I;
10     for (int J=0;J<8;J++)
11       C=(C & 1) ? (C>>1)^0xEDB88320L : (C>>1);
12     CRCTab[I]=C;
13   }
14 }
15
16
17 uint CRC(uint StartCRC,const void *Addr,uint Size)
18 {
19   if (CRCTab[1]==0)
20     InitCRC();
21   byte *Data=(byte *)Addr;
22 #if defined(LITTLE_ENDIAN) && defined(PRESENT_INT32)
23   while (Size>0 && ((intptr_t)Data & 7))
24   {
25     StartCRC=CRCTab[(byte)(StartCRC^Data[0])]^(StartCRC>>8);
26     Size--;
27     Data++;
28   }
29   while (Size>=8)
30   {
31     StartCRC^=*(uint32 *)Data;
32     StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
33     StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
34     StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
35     StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
36     StartCRC^=*(uint32 *)(Data+4);
37     StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
38     StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
39     StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
40     StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
41     Data+=8;
42     Size-=8;
43   }
44 #endif
45   for (unsigned int I=0;I<Size;I++)
46     StartCRC=CRCTab[(byte)(StartCRC^Data[I])]^(StartCRC>>8);
47   return(StartCRC);
48 }
49
50 #ifndef SFX_MODULE
51 ushort OldCRC(ushort StartCRC,const void *Addr,uint Size)
52 {
53   byte *Data=(byte *)Addr;
54   for (unsigned int I=0;I<Size;I++)
55   {
56     StartCRC=(StartCRC+Data[I])&0xffff;
57     StartCRC=((StartCRC<<1)|(StartCRC>>15))&0xffff;
58   }
59   return(StartCRC);
60 }
61 #endif