[Aaru.Compression] Reformat and cleanup.

This commit is contained in:
2023-10-03 22:51:02 +01:00
parent 3afe84193b
commit 5faa49a031
10 changed files with 132 additions and 101 deletions

View File

@@ -49,6 +49,7 @@ public static class ADC
const int PLAIN = 1; const int PLAIN = 1;
const int TWO_BYTE = 2; const int TWO_BYTE = 2;
const int THREE_BYTE = 3; const int THREE_BYTE = 3;
/// <summary>Set to <c>true</c> if this algorithm is supported, <c>false</c> otherwise.</summary> /// <summary>Set to <c>true</c> if this algorithm is supported, <c>false</c> otherwise.</summary>
public static bool IsSupported => true; public static bool IsSupported => true;
@@ -64,21 +65,21 @@ public static class ADC
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
static int GetChunkSize(byte byt) => GetChunkType(byt) switch static int GetChunkSize(byte byt) => GetChunkType(byt) switch
{ {
PLAIN => (byt & 0x7F) + 1, PLAIN => (byt & 0x7F) + 1,
TWO_BYTE => ((byt & 0x3F) >> 2) + 3, TWO_BYTE => ((byt & 0x3F) >> 2) + 3,
THREE_BYTE => (byt & 0x3F) + 4, THREE_BYTE => (byt & 0x3F) + 4,
_ => -1 _ => -1
}; };
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
static int GetOffset(ReadOnlySpan<byte> chunk) => GetChunkType(chunk[0]) switch static int GetOffset(ReadOnlySpan<byte> chunk) => GetChunkType(chunk[0]) switch
{ {
PLAIN => 0, PLAIN => 0,
TWO_BYTE => ((chunk[0] & 0x03) << 8) + chunk[1], TWO_BYTE => ((chunk[0] & 0x03) << 8) + chunk[1],
THREE_BYTE => (chunk[1] << 8) + chunk[2], THREE_BYTE => (chunk[1] << 8) + chunk[2],
_ => -1 _ => -1
}; };
/// <summary>Decompresses a byte buffer that's compressed with ADC</summary> /// <summary>Decompresses a byte buffer that's compressed with ADC</summary>
/// <param name="source">Compressed buffer</param> /// <param name="source">Compressed buffer</param>
@@ -90,8 +91,8 @@ public static class ADC
if(Native.IsSupported) if(Native.IsSupported)
return AARU_adc_decode_buffer(destination, destination.Length, source, source.Length); return AARU_adc_decode_buffer(destination, destination.Length, source, source.Length);
int inputPosition = 0; var inputPosition = 0;
int outPosition = 0; var outPosition = 0;
Span<byte> temp = stackalloc byte[3]; Span<byte> temp = stackalloc byte[3];
while(inputPosition < source.Length) while(inputPosition < source.Length)
@@ -130,18 +131,20 @@ public static class ADC
{ {
byte lastByte = destination[outPosition - 1]; byte lastByte = destination[outPosition - 1];
for(int i = 0; i < chunkSize; i++) for(var i = 0; i < chunkSize; i++)
{ {
destination[outPosition] = lastByte; destination[outPosition] = lastByte;
outPosition++; outPosition++;
} }
} }
else else
for(int i = 0; i < chunkSize; i++) {
for(var i = 0; i < chunkSize; i++)
{ {
destination[outPosition] = destination[outPosition - offset - 1]; destination[outPosition] = destination[outPosition - offset - 1];
outPosition++; outPosition++;
} }
}
break; break;
case THREE_BYTE: case THREE_BYTE:
@@ -158,24 +161,26 @@ public static class ADC
{ {
byte lastByte = destination[outPosition - 1]; byte lastByte = destination[outPosition - 1];
for(int i = 0; i < chunkSize; i++) for(var i = 0; i < chunkSize; i++)
{ {
destination[outPosition] = lastByte; destination[outPosition] = lastByte;
outPosition++; outPosition++;
} }
} }
else else
for(int i = 0; i < chunkSize; i++) {
for(var i = 0; i < chunkSize; i++)
{ {
destination[outPosition] = destination[outPosition - offset - 1]; destination[outPosition] = destination[outPosition - offset - 1];
outPosition++; outPosition++;
} }
}
break; break;
} }
} }
finished: finished:
return outPosition; return outPosition;
} }

View File

@@ -36,8 +36,8 @@
<NoWarn>CS1591;CS1574</NoWarn> <NoWarn>CS1591;CS1574</NoWarn>
</PropertyGroup> </PropertyGroup>
<ItemGroup Condition=" '$(Configuration)' == 'Debug' "> <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
<InternalsVisibleTo Include="Aaru.Tests" /> <InternalsVisibleTo Include="Aaru.Tests"/>
<InternalsVisibleTo Include="Aaru.Tests.Devices" /> <InternalsVisibleTo Include="Aaru.Tests.Devices"/>
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>
<NrtRevisionFormat>$(Version)+{chash:8}</NrtRevisionFormat> <NrtRevisionFormat>$(Version)+{chash:8}</NrtRevisionFormat>
@@ -50,25 +50,25 @@
</DefaultItemExcludes> </DefaultItemExcludes>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Include="ADC.cs" /> <Compile Include="ADC.cs"/>
<Compile Include="AppleRle.cs" /> <Compile Include="AppleRle.cs"/>
<Compile Include="BZip2.cs" /> <Compile Include="BZip2.cs"/>
<Compile Include="FLAC.cs" /> <Compile Include="FLAC.cs"/>
<Compile Include="LZFSE.cs" /> <Compile Include="LZFSE.cs"/>
<Compile Include="LZIP.cs" /> <Compile Include="LZIP.cs"/>
<Compile Include="LZMA.cs" /> <Compile Include="LZMA.cs"/>
<Compile Include="Native.cs" /> <Compile Include="Native.cs"/>
<Compile Include="NonClosableStream.cs" /> <Compile Include="NonClosableStream.cs"/>
<Compile Include="TeleDiskLzh.cs" /> <Compile Include="TeleDiskLzh.cs"/>
<Compile Include="cuetools.net/CUETools.Codecs/*.cs" /> <Compile Include="cuetools.net/CUETools.Codecs/*.cs"/>
<Compile Include="cuetools.net/CUETools.Codecs/CommandLine/*.cs" /> <Compile Include="cuetools.net/CUETools.Codecs/CommandLine/*.cs"/>
<Compile Include="cuetools.net/CUETools.Codecs/CRC/*.cs" /> <Compile Include="cuetools.net/CUETools.Codecs/CRC/*.cs"/>
<Compile Include="cuetools.net/CUETools.Codecs/NULL/*.cs" /> <Compile Include="cuetools.net/CUETools.Codecs/NULL/*.cs"/>
<Compile Include="cuetools.net/CUETools.Codecs/ViewModel/*.cs" /> <Compile Include="cuetools.net/CUETools.Codecs/ViewModel/*.cs"/>
<Compile Include="cuetools.net/CUETools.Codecs/WAV/*.cs" /> <Compile Include="cuetools.net/CUETools.Codecs/WAV/*.cs"/>
<Compile Include="cuetools.net/CUETools.Codecs.Flake/*.cs" /> <Compile Include="cuetools.net/CUETools.Codecs.Flake/*.cs"/>
<Compile Include="cuetools.net/CUETools.Codecs.Flake/Properties/*.cs" /> <Compile Include="cuetools.net/CUETools.Codecs.Flake/Properties/*.cs"/>
<Compile Include="ZSTD.cs" /> <Compile Include="ZSTD.cs"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="..\LICENSE.LGPL"> <Content Include="..\LICENSE.LGPL">
@@ -76,14 +76,14 @@
</Content> </Content>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Aaru.Compression.Native" Version="6.0.0-alpha.10" /> <PackageReference Include="Aaru.Compression.Native" Version="6.0.0-alpha.10"/>
<PackageReference Include="DotNetZip" Version="1.16.0" /> <PackageReference Include="DotNetZip" Version="1.16.0"/>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3"/>
<PackageReference Include="SharpCompress" Version="0.34.0" /> <PackageReference Include="SharpCompress" Version="0.34.0"/>
<PackageReference Include="System.Resources.Extensions" Version="8.0.0-rc.1.23419.4" /> <PackageReference Include="System.Resources.Extensions" Version="8.0.0-rc.1.23419.4"/>
<PackageReference Include="Unclassified.NetRevisionTask" Version="0.4.3" PrivateAssets="all" /> <PackageReference Include="Unclassified.NetRevisionTask" Version="0.4.3" PrivateAssets="all"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Aaru.Helpers\Aaru.Helpers.csproj" /> <ProjectReference Include="..\Aaru.Helpers\Aaru.Helpers.csproj"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -39,6 +39,7 @@ namespace Aaru.Compression;
public static class AppleRle public static class AppleRle
{ {
const uint DART_CHUNK = 20960; const uint DART_CHUNK = 20960;
/// <summary>Set to <c>true</c> if this algorithm is supported, <c>false</c> otherwise.</summary> /// <summary>Set to <c>true</c> if this algorithm is supported, <c>false</c> otherwise.</summary>
public static bool IsSupported => true; public static bool IsSupported => true;
@@ -54,10 +55,10 @@ public static class AppleRle
if(Native.IsSupported) if(Native.IsSupported)
return AARU_apple_rle_decode_buffer(destination, destination.Length, source, source.Length); return AARU_apple_rle_decode_buffer(destination, destination.Length, source, source.Length);
int count = 0; var count = 0;
bool nextA = true; // true if A, false if B var nextA = true; // true if A, false if B
byte repeatedByteA = 0, repeatedByteB = 0; byte repeatedByteA = 0, repeatedByteB = 0;
bool repeatMode = false; // true if we're repeating, false if we're just copying var repeatMode = false; // true if we're repeating, false if we're just copying
int inPosition = 0, outPosition = 0; int inPosition = 0, outPosition = 0;
while(inPosition <= source.Length && while(inPosition <= source.Length &&
@@ -97,9 +98,9 @@ public static class AppleRle
while(true) while(true)
{ {
byte b1 = source[inPosition++]; byte b1 = source[inPosition++];
byte b2 = source[inPosition++]; byte b2 = source[inPosition++];
short s = (short)((b1 << 8) | b2); var s = (short)(b1 << 8 | b2);
if(s == 0 || if(s == 0 ||
s >= DART_CHUNK || s >= DART_CHUNK ||
@@ -111,7 +112,7 @@ public static class AppleRle
repeatMode = true; repeatMode = true;
repeatedByteA = source[inPosition++]; repeatedByteA = source[inPosition++];
repeatedByteB = source[inPosition++]; repeatedByteB = source[inPosition++];
count = (-s * 2) - 1; count = -s * 2 - 1;
nextA = false; nextA = false;
destination[outPosition++] = repeatedByteA; destination[outPosition++] = repeatedByteA;
@@ -120,7 +121,7 @@ public static class AppleRle
} }
repeatMode = false; repeatMode = false;
count = (s * 2) - 1; count = s * 2 - 1;
destination[outPosition++] = source[inPosition++]; destination[outPosition++] = source[inPosition++];

View File

@@ -43,7 +43,7 @@ public class BZip2
[DllImport("libAaru.Compression.Native", SetLastError = true)] [DllImport("libAaru.Compression.Native", SetLastError = true)]
static extern int AARU_bzip2_encode_buffer(byte[] dstBuffer, ref uint dstSize, byte[] srcBuffer, uint srcSize, static extern int AARU_bzip2_encode_buffer(byte[] dstBuffer, ref uint dstSize, byte[] srcBuffer, uint srcSize,
int blockSize100K); int blockSize100K);
/// <summary>Decodes a buffer compressed with BZIP2</summary> /// <summary>Decodes a buffer compressed with BZIP2</summary>
/// <param name="source">Encoded buffer</param> /// <param name="source">Encoded buffer</param>
@@ -51,7 +51,7 @@ public class BZip2
/// <returns>The number of decoded bytes</returns> /// <returns>The number of decoded bytes</returns>
public static int DecodeBuffer(byte[] source, byte[] destination) public static int DecodeBuffer(byte[] source, byte[] destination)
{ {
uint destinationSize = (uint)destination.Length; var destinationSize = (uint)destination.Length;
if(Native.IsSupported) if(Native.IsSupported)
{ {
@@ -73,7 +73,7 @@ public class BZip2
/// <returns></returns> /// <returns></returns>
public static int EncodeBuffer(byte[] source, byte[] destination, int blockSize100K) public static int EncodeBuffer(byte[] source, byte[] destination, int blockSize100K)
{ {
uint destinationSize = (uint)destination.Length; var destinationSize = (uint)destination.Length;
if(Native.IsSupported) if(Native.IsSupported)
{ {

View File

@@ -42,16 +42,16 @@ public class FLAC
[DllImport("libAaru.Compression.Native", SetLastError = true)] [DllImport("libAaru.Compression.Native", SetLastError = true)]
static extern nuint AARU_flac_decode_redbook_buffer(byte[] dstBuffer, nuint dstSize, byte[] srcBuffer, static extern nuint AARU_flac_decode_redbook_buffer(byte[] dstBuffer, nuint dstSize, byte[] srcBuffer,
nuint srcSize); nuint srcSize);
[DllImport("libAaru.Compression.Native", SetLastError = true)] [DllImport("libAaru.Compression.Native", SetLastError = true)]
static extern nuint AARU_flac_encode_redbook_buffer(byte[] dstBuffer, nuint dstSize, byte[] srcBuffer, static extern nuint AARU_flac_encode_redbook_buffer(byte[] dstBuffer, nuint dstSize, byte[] srcBuffer,
nuint srcSize, uint blocksize, int doMidSideStereo, nuint srcSize, uint blocksize, int doMidSideStereo,
int looseMidSideStereo, string apodization, uint maxLpcOrder, int looseMidSideStereo, string apodization, uint maxLpcOrder,
uint qlpCoeffPrecision, int doQlpCoeffPrecSearch, uint qlpCoeffPrecision, int doQlpCoeffPrecSearch,
int doExhaustiveModelSearch, uint minResidualPartitionOrder, int doExhaustiveModelSearch, uint minResidualPartitionOrder,
uint maxResidualPartitionOrder, string applicationID, uint maxResidualPartitionOrder, string applicationID,
uint applicationIDLen); uint applicationIDLen);
/// <summary>Decodes a buffer compressed with FLAC</summary> /// <summary>Decodes a buffer compressed with FLAC</summary>
/// <param name="source">Encoded buffer</param> /// <param name="source">Encoded buffer</param>
@@ -60,8 +60,10 @@ public class FLAC
public static int DecodeBuffer(byte[] source, byte[] destination) public static int DecodeBuffer(byte[] source, byte[] destination)
{ {
if(Native.IsSupported) if(Native.IsSupported)
{
return (int)AARU_flac_decode_redbook_buffer(destination, (nuint)destination.Length, source, return (int)AARU_flac_decode_redbook_buffer(destination, (nuint)destination.Length, source,
(nuint)source.Length); (nuint)source.Length);
}
var flacMs = new MemoryStream(source); var flacMs = new MemoryStream(source);
var flakeReader = new AudioDecoder(new DecoderSettings(), "", flacMs); var flakeReader = new AudioDecoder(new DecoderSettings(), "", flacMs);
@@ -95,6 +97,7 @@ public class FLAC
uint minResidualPartitionOrder, uint maxResidualPartitionOrder, string applicationID) uint minResidualPartitionOrder, uint maxResidualPartitionOrder, string applicationID)
{ {
if(Native.IsSupported) if(Native.IsSupported)
{
return (int)AARU_flac_encode_redbook_buffer(destination, (nuint)destination.Length, source, return (int)AARU_flac_encode_redbook_buffer(destination, (nuint)destination.Length, source,
(nuint)source.Length, blockSize, doMidSideStereo ? 1 : 0, (nuint)source.Length, blockSize, doMidSideStereo ? 1 : 0,
looseMidSideStereo ? 1 : 0, apodization, maxLpcOrder, looseMidSideStereo ? 1 : 0, apodization, maxLpcOrder,
@@ -102,6 +105,7 @@ public class FLAC
doExhaustiveModelSearch ? 1 : 0, minResidualPartitionOrder, doExhaustiveModelSearch ? 1 : 0, minResidualPartitionOrder,
maxResidualPartitionOrder, applicationID, maxResidualPartitionOrder, applicationID,
(uint)applicationID.Length); (uint)applicationID.Length);
}
var flakeWriterSettings = new EncoderSettings var flakeWriterSettings = new EncoderSettings
{ {
@@ -138,7 +142,7 @@ public class FLAC
flakeWriter.Write(audioBuffer); flakeWriter.Write(audioBuffer);
flakeWriter.Close(); flakeWriter.Close();
int len = (int)flacMs.Length; var len = (int)flacMs.Length;
flacMs.ReallyClose(); flacMs.ReallyClose();
return len; return len;

View File

@@ -52,8 +52,9 @@ public class LZFSE
public static int DecodeBuffer(byte[] source, byte[] destination) => Native.IsSupported public static int DecodeBuffer(byte[] source, byte[] destination) => Native.IsSupported
? (int) ? (int)
AARU_lzfse_decode_buffer(destination, AARU_lzfse_decode_buffer(destination,
(nuint)destination.Length, source, (nuint)destination.Length, source,
(nuint)source.Length, null) : 0; (nuint)source.Length, null)
: 0;
/// <summary>Compresses a buffer using BZIP2</summary> /// <summary>Compresses a buffer using BZIP2</summary>
/// <param name="source">Data to compress</param> /// <param name="source">Data to compress</param>
@@ -62,6 +63,7 @@ public class LZFSE
public static int EncodeBuffer(byte[] source, byte[] destination) => Native.IsSupported public static int EncodeBuffer(byte[] source, byte[] destination) => Native.IsSupported
? (int) ? (int)
AARU_lzfse_encode_buffer(destination, AARU_lzfse_encode_buffer(destination,
(nuint)destination.Length, source, (nuint)destination.Length, source,
(nuint)source.Length, null) : 0; (nuint)source.Length, null)
: 0;
} }

View File

@@ -41,8 +41,8 @@ public class LZIP
static extern int AARU_lzip_decode_buffer(byte[] dstBuffer, int dstSize, byte[] srcBuffer, int srcSize); static extern int AARU_lzip_decode_buffer(byte[] dstBuffer, int dstSize, byte[] srcBuffer, int srcSize);
[DllImport("libAaru.Compression.Native", SetLastError = true)] [DllImport("libAaru.Compression.Native", SetLastError = true)]
static extern int AARU_lzip_encode_buffer(byte[] dstBuffer, int dstSize, byte[] srcBuffer, int srcSize, static extern int AARU_lzip_encode_buffer(byte[] dstBuffer, int dstSize, byte[] srcBuffer, int srcSize,
int dictionarySize, int matchLenLimit); int dictionarySize, int matchLenLimit);
/// <summary>Decodes a buffer compressed with LZIP</summary> /// <summary>Decodes a buffer compressed with LZIP</summary>
/// <param name="source">Encoded buffer</param> /// <param name="source">Encoded buffer</param>
@@ -58,6 +58,8 @@ public class LZIP
/// <param name="matchLengthLimit">Match length limit</param> /// <param name="matchLengthLimit">Match length limit</param>
/// <returns>The size of the compressed data</returns> /// <returns>The size of the compressed data</returns>
public static int EncodeBuffer(byte[] source, byte[] destination, int dictionarySize, int matchLengthLimit) => public static int EncodeBuffer(byte[] source, byte[] destination, int dictionarySize, int matchLengthLimit) =>
Native.IsSupported ? AARU_lzip_encode_buffer(destination, destination.Length, source, source.Length, Native.IsSupported
dictionarySize, matchLengthLimit) : 0; ? AARU_lzip_encode_buffer(destination, destination.Length, source, source.Length,
dictionarySize, matchLengthLimit)
: 0;
} }

View File

@@ -41,12 +41,12 @@ public class LZMA
[DllImport("libAaru.Compression.Native", SetLastError = true)] [DllImport("libAaru.Compression.Native", SetLastError = true)]
static extern int AARU_lzma_decode_buffer(byte[] dstBuffer, ref nuint dstSize, byte[] srcBuffer, ref nuint srcSize, static extern int AARU_lzma_decode_buffer(byte[] dstBuffer, ref nuint dstSize, byte[] srcBuffer, ref nuint srcSize,
byte[] props, nuint propsSize); byte[] props, nuint propsSize);
[DllImport("libAaru.Compression.Native", SetLastError = true)] [DllImport("libAaru.Compression.Native", SetLastError = true)]
static extern int AARU_lzma_encode_buffer(byte[] dstBuffer, ref nuint dstSize, byte[] srcBuffer, nuint srcSize, static extern int AARU_lzma_encode_buffer(byte[] dstBuffer, ref nuint dstSize, byte[] srcBuffer, nuint srcSize,
byte[] outProps, ref nuint outPropsSize, int level, uint dictSize, int lc, byte[] outProps, ref nuint outPropsSize, int level, uint dictSize, int lc,
int lp, int pb, int fb, int numThreads); int lp, int pb, int fb, int numThreads);
/// <summary>Decodes a buffer compressed with LZMA</summary> /// <summary>Decodes a buffer compressed with LZMA</summary>
/// <param name="source">Encoded buffer</param> /// <param name="source">Encoded buffer</param>
@@ -57,8 +57,8 @@ public class LZMA
{ {
if(Native.IsSupported) if(Native.IsSupported)
{ {
nuint srcSize = (nuint)source.Length; var srcSize = (nuint)source.Length;
nuint dstSize = (nuint)destination.Length; var dstSize = (nuint)destination.Length;
AARU_lzma_decode_buffer(destination, ref dstSize, source, ref srcSize, properties, AARU_lzma_decode_buffer(destination, ref dstSize, source, ref srcSize, properties,
(nuint)properties.Length); (nuint)properties.Length);
@@ -85,17 +85,17 @@ public class LZMA
/// <param name="fb">Forward bits</param> /// <param name="fb">Forward bits</param>
/// <returns>How many bytes have been written to the destination buffer</returns> /// <returns>How many bytes have been written to the destination buffer</returns>
public static int EncodeBuffer(byte[] source, byte[] destination, out byte[] properties, int level, uint dictSize, public static int EncodeBuffer(byte[] source, byte[] destination, out byte[] properties, int level, uint dictSize,
int lc, int lp, int pb, int fb) int lc, int lp, int pb, int fb)
{ {
if(Native.IsSupported) if(Native.IsSupported)
{ {
properties = new byte[5]; properties = new byte[5];
nuint dstSize = (nuint)destination.Length; var dstSize = (nuint)destination.Length;
nuint propsSize = (nuint)properties.Length; var propsSize = (nuint)properties.Length;
nuint srcSize = (nuint)source.Length; var srcSize = (nuint)source.Length;
AARU_lzma_encode_buffer(destination, ref dstSize, source, srcSize, properties, ref propsSize, level, AARU_lzma_encode_buffer(destination, ref dstSize, source, srcSize, properties, ref propsSize, level,
dictSize, lc, lp, pb, fb, 0); dictSize, lc, lp, pb, fb, 0);
return (int)dstSize; return (int)dstSize;
} }

View File

@@ -69,8 +69,8 @@ public class TeleDiskLzh
const int N_CHAR = 256 - THRESHOLD + F; const int N_CHAR = 256 - THRESHOLD + F;
/* character code (= 0..N_CHAR-1) */ /* character code (= 0..N_CHAR-1) */
const int T = (N_CHAR * 2) - 1; /* Size of table */ const int T = N_CHAR * 2 - 1; /* Size of table */
const int ROOT = T - 1; /* root position */ const int ROOT = T - 1; /* root position */
const int MAX_FREQ = 0x8000; const int MAX_FREQ = 0x8000;
/* /*
@@ -174,6 +174,7 @@ public class TeleDiskLzh
int count; // was an unsigned long, seems unnecessary int count; // was an unsigned long, seems unnecessary
for(count = 0; count < len;) for(count = 0; count < len;)
{
if(_tdctl.Bufcnt == 0) if(_tdctl.Bufcnt == 0)
{ {
if((c = DecodeChar()) < 0) if((c = DecodeChar()) < 0)
@@ -193,8 +194,8 @@ public class TeleDiskLzh
if((pos = DecodePosition()) < 0) if((pos = DecodePosition()) < 0)
return count; // fatal error return count; // fatal error
_tdctl.Bufpos = (ushort)((_tdctl.R - pos - 1) & (N - 1)); _tdctl.Bufpos = (ushort)(_tdctl.R - pos - 1 & N - 1);
_tdctl.Bufcnt = (ushort)(c - 255 + THRESHOLD); _tdctl.Bufcnt = (ushort)(c - 255 + THRESHOLD);
_tdctl.Bufndx = 0; _tdctl.Bufndx = 0;
} }
} }
@@ -204,7 +205,7 @@ public class TeleDiskLzh
while(_tdctl.Bufndx < _tdctl.Bufcnt && while(_tdctl.Bufndx < _tdctl.Bufcnt &&
count < len) count < len)
{ {
c = _textBuf[(_tdctl.Bufpos + _tdctl.Bufndx) & (N - 1)]; c = _textBuf[_tdctl.Bufpos + _tdctl.Bufndx & N - 1];
buf[count] = (byte)c; buf[count] = (byte)c;
_tdctl.Bufndx++; _tdctl.Bufndx++;
_textBuf[_tdctl.R++] = (byte)c; _textBuf[_tdctl.R++] = (byte)c;
@@ -216,6 +217,7 @@ public class TeleDiskLzh
if(_tdctl.Bufndx >= _tdctl.Bufcnt) if(_tdctl.Bufndx >= _tdctl.Bufcnt)
_tdctl.Bufndx = _tdctl.Bufcnt = 0; _tdctl.Bufndx = _tdctl.Bufcnt = 0;
} }
}
return count; // count == len, success return count; // count == len, success
} }
@@ -245,7 +247,7 @@ public class TeleDiskLzh
while(_getlen <= 8) while(_getlen <= 8)
{ {
// typically reads a word at a time // typically reads a word at a time
_getbuf |= (ushort)(_tdctl.Inbuf[_tdctl.Ibufndx++] << (8 - _getlen)); _getbuf |= (ushort)(_tdctl.Inbuf[_tdctl.Ibufndx++] << 8 - _getlen);
_getlen += 8; _getlen += 8;
} }
@@ -257,7 +259,7 @@ public class TeleDiskLzh
if(NextWord() < 0) if(NextWord() < 0)
return -1; return -1;
short i = (short)_getbuf; var i = (short)_getbuf;
_getbuf <<= 1; _getbuf <<= 1;
_getlen--; _getlen--;
@@ -316,12 +318,14 @@ public class TeleDiskLzh
short j = 0; short j = 0;
for(i = 0; i < T; i++) for(i = 0; i < T; i++)
{
if(_son[i] >= T) if(_son[i] >= T)
{ {
_freq[j] = (ushort)((_freq[i] + 1) / 2); _freq[j] = (ushort)((_freq[i] + 1) / 2);
_son[j] = _son[i]; _son[j] = _son[i];
j++; j++;
} }
}
/* make a tree : first, connect children nodes */ /* make a tree : first, connect children nodes */
for(i = 0, j = N_CHAR; j < T; i += 2, j++) for(i = 0, j = N_CHAR; j < T; i += 2, j++)
@@ -332,7 +336,7 @@ public class TeleDiskLzh
for(k = (short)(j - 1); f < _freq[k]; k--) {} for(k = (short)(j - 1); f < _freq[k]; k--) {}
k++; k++;
ushort l = (ushort)((j - k) * 2); var l = (ushort)((j - k) * 2);
Array.ConstrainedCopy(_freq, k, _freq, k + 1, l); Array.ConstrainedCopy(_freq, k, _freq, k + 1, l);
_freq[k] = f; _freq[k] = f;
@@ -342,10 +346,12 @@ public class TeleDiskLzh
/* connect parent nodes */ /* connect parent nodes */
for(i = 0; i < T; i++) for(i = 0; i < T; i++)
{
if((k = _son[i]) >= T) if((k = _son[i]) >= T)
_prnt[k] = i; _prnt[k] = i;
else else
_prnt[k] = _prnt[k + 1] = i; _prnt[k] = _prnt[k + 1] = i;
}
} }
/* update freq tree */ /* update freq tree */
@@ -395,7 +401,7 @@ public class TeleDiskLzh
short DecodeChar() short DecodeChar()
{ {
ushort c = (ushort)_son[ROOT]; var c = (ushort)_son[ROOT];
/* /*
* start searching tree from the root to leaves. * start searching tree from the root to leaves.
@@ -427,8 +433,8 @@ public class TeleDiskLzh
if((bit = (short)GetByte()) < 0) if((bit = (short)GetByte()) < 0)
return -1; return -1;
ushort i = (ushort)bit; var i = (ushort)bit;
ushort c = (ushort)(_dCode[i] << 6); var c = (ushort)(_dCode[i] << 6);
ushort j = _dLen[i]; ushort j = _dLen[i];
/* input lower 6 bits directly */ /* input lower 6 bits directly */
@@ -442,16 +448,25 @@ public class TeleDiskLzh
i = (ushort)((i << 1) + bit); i = (ushort)((i << 1) + bit);
} }
return (short)(c | (i & 0x3f)); return (short)(c | i & 0x3f);
} }
#region Nested type: Tdlzhuf
/* update when cumulative frequency */ /* update when cumulative frequency */
/* reaches to this value */ /* reaches to this value */
struct Tdlzhuf struct Tdlzhuf
{ {
public ushort R, Bufcnt, Bufndx, Bufpos, // string buffer public ushort R,
Bufcnt,
Bufndx,
Bufpos, // string buffer
// the following to allow block reads from input in next_word() // the following to allow block reads from input in next_word()
Ibufcnt, Ibufndx; // input buffer counters Ibufcnt,
public byte[] Inbuf; // input buffer Ibufndx; // input buffer counters
public byte[] Inbuf; // input buffer
} }
#endregion
} }

View File

@@ -42,7 +42,7 @@ public class ZSTD
[DllImport("libAaru.Compression.Native", SetLastError = true)] [DllImport("libAaru.Compression.Native", SetLastError = true)]
static extern nuint AARU_zstd_encode_buffer(byte[] dstBuffer, nuint dstSize, byte[] srcBuffer, nuint srcSize, static extern nuint AARU_zstd_encode_buffer(byte[] dstBuffer, nuint dstSize, byte[] srcBuffer, nuint srcSize,
int compressionLevel); int compressionLevel);
/// <summary>Decodes a buffer compressed with ZSTD</summary> /// <summary>Decodes a buffer compressed with ZSTD</summary>
/// <param name="source">Encoded buffer</param> /// <param name="source">Encoded buffer</param>
@@ -50,7 +50,8 @@ public class ZSTD
/// <returns>The number of decoded bytes</returns> /// <returns>The number of decoded bytes</returns>
public static int DecodeBuffer(byte[] source, byte[] destination) => public static int DecodeBuffer(byte[] source, byte[] destination) =>
(int)(Native.IsSupported (int)(Native.IsSupported
? AARU_zstd_decode_buffer(destination, (nuint)destination.Length, source, (nuint)source.Length) : 0); ? AARU_zstd_decode_buffer(destination, (nuint)destination.Length, source, (nuint)source.Length)
: 0);
/// <summary>Compresses a buffer using ZSTD</summary> /// <summary>Compresses a buffer using ZSTD</summary>
/// <param name="source">Data to compress</param> /// <param name="source">Data to compress</param>
@@ -60,5 +61,6 @@ public class ZSTD
public static int EncodeBuffer(byte[] source, byte[] destination, int compressionLevel) => public static int EncodeBuffer(byte[] source, byte[] destination, int compressionLevel) =>
(int)(Native.IsSupported (int)(Native.IsSupported
? AARU_zstd_encode_buffer(destination, (nuint)destination.Length, source, (nuint)source.Length, ? AARU_zstd_encode_buffer(destination, (nuint)destination.Length, source, (nuint)source.Length,
compressionLevel) : 0); compressionLevel)
: 0);
} }