mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-09-25 08:24:58 +00:00
rar5: unpack wip
This commit is contained in:
@@ -89,23 +89,36 @@ public void Init(size_t WinSize)
|
||||
}
|
||||
|
||||
|
||||
byte& operator [](size_t Item)
|
||||
{
|
||||
byte this[size_t Item] {
|
||||
get {
|
||||
if (Item<MemSize[0])
|
||||
return Mem[0][Item];
|
||||
for (uint I=1;I<ASIZE(MemSize);I++)
|
||||
for (uint I=1;I<MemSize.Length;I++)
|
||||
if (Item<MemSize[I])
|
||||
return Mem[I][Item-MemSize[I-1]];
|
||||
return Mem[0][0]; // Must never happen;
|
||||
}
|
||||
set {
|
||||
if (Item<MemSize[0]) {
|
||||
Mem[0][Item] = value;
|
||||
return;
|
||||
}
|
||||
for (uint I=1;I<MemSize.Length;I++)
|
||||
if (Item<MemSize[I]) {
|
||||
Mem[I][Item-MemSize[I-1]] = value;
|
||||
return;
|
||||
}
|
||||
Mem[0][0] = value; // Must never happen;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void CopyString(uint Length,uint Distance,size_t &UnpPtr,size_t MaxWinMask)
|
||||
public void CopyString(uint Length,uint Distance,ref size_t UnpPtr,size_t MaxWinMask)
|
||||
{
|
||||
size_t SrcPtr=UnpPtr-Distance;
|
||||
while (Length-- > 0)
|
||||
{
|
||||
(*this)[UnpPtr]=(*this)[SrcPtr++ & MaxWinMask];
|
||||
this[UnpPtr]=this[SrcPtr++ & MaxWinMask];
|
||||
// We need to have masked UnpPtr after quit from loop, so it must not
|
||||
// be replaced with '(*this)[UnpPtr++ & MaxWinMask]'
|
||||
UnpPtr=(UnpPtr+1) & MaxWinMask;
|
||||
@@ -116,13 +129,13 @@ public void CopyString(uint Length,uint Distance,size_t &UnpPtr,size_t MaxWinMas
|
||||
void CopyData(byte *Dest,size_t WinPos,size_t Size)
|
||||
{
|
||||
for (size_t I=0;I<Size;I++)
|
||||
Dest[I]=(*this)[WinPos+I];
|
||||
Dest[I]=this[WinPos+I];
|
||||
}
|
||||
|
||||
|
||||
public size_t GetBlockSize(size_t StartPos,size_t RequiredSize)
|
||||
{
|
||||
for (uint I=0;I<ASIZE(MemSize);I++)
|
||||
for (uint I=0;I<MemSize.Length;I++)
|
||||
if (StartPos<MemSize[I])
|
||||
return Math.Min(MemSize[I]-StartPos,RequiredSize);
|
||||
return 0; // Must never be here.
|
||||
|
||||
@@ -96,7 +96,7 @@ void Unpack5(bool Solid)
|
||||
else
|
||||
{
|
||||
DBits=DistSlot/2 - 1;
|
||||
Distance+=(2 | (DistSlot & 1)) << DBits;
|
||||
Distance+=(2 | (DistSlot & 1)) << (int)DBits;
|
||||
}
|
||||
|
||||
if (DBits>0)
|
||||
@@ -105,7 +105,7 @@ void Unpack5(bool Solid)
|
||||
{
|
||||
if (DBits>4)
|
||||
{
|
||||
Distance+=((Inp.getbits32()>>(36-DBits))<<4);
|
||||
Distance+=((Inp.getbits32()>>(int)(36-DBits))<<4);
|
||||
Inp.addbits(DBits-4);
|
||||
}
|
||||
uint LowDist=DecodeNumber(Inp,BlockTables.LDD);
|
||||
@@ -113,7 +113,7 @@ void Unpack5(bool Solid)
|
||||
}
|
||||
else
|
||||
{
|
||||
Distance+=Inp.getbits32()>>(32-DBits);
|
||||
Distance+=Inp.getbits32()>>(int)(32-DBits);
|
||||
Inp.addbits(DBits);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user