MCPcopy Create free account
hub / github.com/abbeycode/UnrarKit / Decode

Method Decode

Libraries/unrar/encname.cpp:14–69  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

12
13
14void EncodeFileName::Decode(char *Name,size_t NameSize,byte *EncName,size_t EncSize,
15 wchar *NameW,size_t MaxDecSize)
16{
17 size_t EncPos=0,DecPos=0;
18 byte HighByte=EncPos<EncSize ? EncName[EncPos++] : 0;
19 while (EncPos<EncSize && DecPos<MaxDecSize)
20 {
21 if (FlagBits==0)
22 {
23 if (EncPos>=EncSize)
24 break;
25 Flags=EncName[EncPos++];
26 FlagBits=8;
27 }
28 switch(Flags>>6)
29 {
30 case 0:
31 if (EncPos>=EncSize)
32 break;
33 NameW[DecPos++]=EncName[EncPos++];
34 break;
35 case 1:
36 if (EncPos>=EncSize)
37 break;
38 NameW[DecPos++]=EncName[EncPos++]+(HighByte<<8);
39 break;
40 case 2:
41 if (EncPos+1>=EncSize)
42 break;
43 NameW[DecPos++]=EncName[EncPos]+(EncName[EncPos+1]<<8);
44 EncPos+=2;
45 break;
46 case 3:
47 {
48 if (EncPos>=EncSize)
49 break;
50 int Length=EncName[EncPos++];
51 if ((Length & 0x80)!=0)
52 {
53 if (EncPos>=EncSize)
54 break;
55 byte Correction=EncName[EncPos++];
56 for (Length=(Length&0x7f)+2;Length>0 && DecPos<MaxDecSize && DecPos<NameSize;Length--,DecPos++)
57 NameW[DecPos]=((Name[DecPos]+Correction)&0xff)+(HighByte<<8);
58 }
59 else
60 for (Length+=2;Length>0 && DecPos<MaxDecSize && DecPos<NameSize;Length--,DecPos++)
61 NameW[DecPos]=Name[DecPos];
62 }
63 break;
64 }
65 Flags<<=2;
66 FlagBits-=2;
67 }
68 NameW[DecPos<MaxDecSize ? DecPos:MaxDecSize-1]=0;
69}

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected