From f2d2d94d1b9be6bbb1d0c694ad0558b442fb98d5 Mon Sep 17 00:00:00 2001 From: coderb Date: Tue, 19 Dec 2017 14:03:53 -0500 Subject: [PATCH] rar5: unpack wip --- .../Rar/UnpackV2017/Unpack.unpack20_cpp.cs | 2 +- .../Rar/UnpackV2017/Unpack.unpack30_cpp.cs | 19 ++++++++++------- .../Rar/UnpackV2017/Unpack.unpack50_cpp.cs | 3 ++- .../Rar/UnpackV2017/Unpack.unpack_cpp.cs | 3 +-- .../Compressors/Rar/UnpackV2017/unpack_hpp.cs | 21 ++++++++++--------- src/SharpCompress/Utility.cs | 8 +++++++ 6 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/SharpCompress/Compressors/Rar/UnpackV2017/Unpack.unpack20_cpp.cs b/src/SharpCompress/Compressors/Rar/UnpackV2017/Unpack.unpack20_cpp.cs index 6e54b90c..7ed33a4b 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV2017/Unpack.unpack20_cpp.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV2017/Unpack.unpack20_cpp.cs @@ -303,7 +303,7 @@ void UnpInitData20(bool Solid) UnpChannels=1; memset(AudV,0,sizeof(AudV)); - memset(UnpOldTable20,0,sizeof(UnpOldTable20)); + Utility.Memset(UnpOldTable20, 0, UnpOldTable20.Length); memset(MD,0,sizeof(MD)); } } diff --git a/src/SharpCompress/Compressors/Rar/UnpackV2017/Unpack.unpack30_cpp.cs b/src/SharpCompress/Compressors/Rar/UnpackV2017/Unpack.unpack30_cpp.cs index ff4252fb..6ccdeb6a 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV2017/Unpack.unpack30_cpp.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV2017/Unpack.unpack30_cpp.cs @@ -766,7 +766,7 @@ void UnpInitData30(bool Solid) if (!Solid) { TablesRead3=false; - Utility.Memset(UnpOldTable,0,(uint)UnpOldTable.Length); + Utility.Memset(UnpOldTable, 0, UnpOldTable.Length); PPMEscChar=2; UnpBlockType=BLOCK_LZ; } @@ -778,16 +778,19 @@ void InitFilters30(bool Solid) { if (!Solid) { - OldFilterLengths.SoftReset(); + //OldFilterLengths.SoftReset(); + OldFilterLengths.Clear(); LastFilter=0; - for (size_t I=0;I(this.OldDist, 0, this.OldDist.Length); OldDistPtr=0; LastDist=LastLength=0; // memset(Window,0,MaxWinSize); diff --git a/src/SharpCompress/Compressors/Rar/UnpackV2017/unpack_hpp.cs b/src/SharpCompress/Compressors/Rar/UnpackV2017/unpack_hpp.cs index 498847eb..909830c9 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV2017/unpack_hpp.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV2017/unpack_hpp.cs @@ -264,13 +264,14 @@ internal partial class Unpack byte *ReadBufMT; #endif - List FilterSrcMemory = new List(); - List FilterDstMemory = new List(); + readonly List FilterSrcMemory = new List(); + readonly List FilterDstMemory = new List(); // Filters code, one entry per filter. - List Filters = new List(); + readonly List Filters = new List(); - uint OldDist[4],OldDistPtr; + readonly uint[] OldDist = new uint[4]; + uint OldDistPtr; uint LastLength; // LastDist is necessary only for RAR2 and older with circular OldDist @@ -294,7 +295,7 @@ internal partial class Unpack byte[] Window; - FragmentedWindow FragWindow = new FragmentedWindow(); + readonly FragmentedWindow FragWindow = new FragmentedWindow(); bool Fragmented; @@ -331,7 +332,7 @@ internal partial class Unpack DecodeTable MD[4]; // Decode multimedia data, up to 4 channels. - byte UnpOldTable20[MC20*4]; + readonly byte[] UnpOldTable20 = new byte[MC20*4]; bool UnpAudioBlock; uint UnpChannels,UnpCurChannel; int UnpChannelDelta; @@ -381,18 +382,18 @@ internal partial class Unpack // Buffer to read VM filters code. We moved it here from AddVMCode // function to reduce time spent in BitInput constructor. - BitInput VMCodeInp; + readonly BitInput VMCodeInp = new BitInput(true); // Filters code, one entry per filter. - List Filters30 = new List(); + readonly List Filters30 = new List(); // Filters stack, several entrances of same filter are possible. - List PrgStack = new List(); + readonly List PrgStack = new List(); // Lengths of preceding data blocks, one length of one last block // for every filter. Used to reduce the size required to write // the data block length if lengths are repeating. - List OldFilterLengths = new List(); + readonly List OldFilterLengths = new List(); int LastFilter; /***************************** Unpack v 3.0 *********************************/ diff --git a/src/SharpCompress/Utility.cs b/src/SharpCompress/Utility.cs index f24528c8..a334af06 100644 --- a/src/SharpCompress/Utility.cs +++ b/src/SharpCompress/Utility.cs @@ -115,6 +115,14 @@ namespace SharpCompress } #endif + public static void Memset(T[] array, T what, int length) + { + for(var i = 0; i < length; i++) + { + array[i] = what; + } + } + /// /// Fills the array with an specific value.