diff --git a/BurnOutSharp/External/libmspack/Compression/CompressionStream.cs b/BurnOutSharp/External/libmspack/Compression/CompressionStream.cs
index 7f6756d5..6ae59ec9 100644
--- a/BurnOutSharp/External/libmspack/Compression/CompressionStream.cs
+++ b/BurnOutSharp/External/libmspack/Compression/CompressionStream.cs
@@ -158,31 +158,51 @@ namespace LibMSPackSharp.Compression
bits_left = BitsLeft;
}
+ ///
+ /// Ensure there are at least N bits in the bit buffer
+ ///
+ public void ENSURE_BITS(int nbits, ref int i_ptr, ref int i_end, ref uint bit_buffer, ref int bits_left)
+ {
+ while (bits_left < nbits)
+ {
+ READ_BYTES(ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
+ if (Error != Error.MSPACK_ERR_OK)
+ return;
+ }
+ }
+
///
/// Read from the input if the buffer is empty
///
- public Error READ_IF_NEEDED(ref int i_ptr, ref int i_end)
+ public void READ_IF_NEEDED(ref int i_ptr, ref int i_end)
{
if (i_ptr >= i_end)
{
- if (ReadInput() != Error.MSPACK_ERR_OK)
- return Error;
+ ReadInput();
+ if (Error != Error.MSPACK_ERR_OK)
+ return;
i_ptr = InputPointer;
i_end = InputEnd;
}
-
- return Error.MSPACK_ERR_OK;
}
+ ///
+ /// Read bytes from the input into the bit buffer
+ ///
+ public abstract void READ_BYTES(ref int i_ptr, ref int i_end, ref uint bit_buffer, ref int bits_left);
+
///
/// Read an input stream and fill the buffer
///
- protected Error ReadInput()
+ protected virtual void ReadInput()
{
int read = System.Read(InputFileHandle, InputBuffer, 0, (int)InputBufferSize);
if (read < 0)
- return Error = Error.MSPACK_ERR_READ;
+ {
+ Error = Error.MSPACK_ERR_READ;
+ return;
+ }
// We might overrun the input stream by asking for bits we don't use,
// so fake 2 more bytes at the end of input
@@ -191,7 +211,8 @@ namespace LibMSPackSharp.Compression
if (EndOfInput != 0)
{
Console.WriteLine("Out of input bytes");
- return Error = Error.MSPACK_ERR_READ;
+ Error = Error.MSPACK_ERR_READ;
+ return;
}
else
{
@@ -204,7 +225,6 @@ namespace LibMSPackSharp.Compression
// Update i_ptr and i_end
InputPointer = 0;
InputEnd = read;
- return Error = Error.MSPACK_ERR_OK;
}
#endregion
@@ -225,6 +245,46 @@ namespace LibMSPackSharp.Compression
///
public long PEEK_BITS_MSB(int nbits, uint bit_buffer) => (bit_buffer >> (BITBUF_WIDTH - (nbits)));
+ ///
+ /// Takes N bits from the buffer and puts them in var
+ ///
+ public long READ_BITS_MSB(int nbits, ref int i_ptr, ref int i_end, ref uint bit_buffer, ref int bits_left)
+ {
+ ENSURE_BITS(nbits, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
+ if (Error != Error.MSPACK_ERR_OK)
+ return -1;
+
+ long temp = PEEK_BITS_MSB(nbits, bit_buffer);
+
+ REMOVE_BITS_MSB(nbits, ref bit_buffer, ref bits_left);
+ return temp;
+ }
+
+ ///
+ /// Read multiple bits and put them in var
+ ///
+ public long READ_MANY_BITS_MSB(int nbits, ref int i_ptr, ref int i_end, ref uint bit_buffer, ref int bits_left)
+ {
+ byte needed = (byte)(nbits), bitrun;
+ long temp = 0;
+ while (needed > 0)
+ {
+ if (bits_left <= (BITBUF_WIDTH - 16))
+ {
+ READ_BYTES(ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
+ if (Error != Error.MSPACK_ERR_OK)
+ return -1;
+ }
+
+ bitrun = (byte)((bits_left < needed) ? bits_left : needed);
+ temp = (temp << bitrun) | PEEK_BITS_MSB(bitrun, bit_buffer);
+ REMOVE_BITS_MSB(bitrun, ref bit_buffer, ref bits_left);
+ needed -= bitrun;
+ }
+
+ return temp;
+ }
+
///
/// Removes N bits from the bit buffer
///
@@ -257,6 +317,36 @@ namespace LibMSPackSharp.Compression
///
public long PEEK_BITS_T_LSB(int nbits, uint bit_buffer) => bit_buffer & lsb_bit_mask[(nbits)];
+ ///
+ /// Takes N bits from the buffer and puts them in var
+ ///
+ public long READ_BITS_LSB(int nbits, ref int i_ptr, ref int i_end, ref uint bit_buffer, ref int bits_left)
+ {
+ ENSURE_BITS(nbits, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
+ if (Error != Error.MSPACK_ERR_OK)
+ return -1;
+
+ long temp = PEEK_BITS_LSB(nbits, bit_buffer);
+
+ REMOVE_BITS_LSB(nbits, ref bit_buffer, ref bits_left);
+ return temp;
+ }
+
+ ///
+ /// Takes N bits from the buffer and puts them in var using a bit mask
+ ///
+ public long READ_BITS_T_LSB(int nbits, ref int i_ptr, ref int i_end, ref uint bit_buffer, ref int bits_left)
+ {
+ ENSURE_BITS(nbits, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
+ if (Error != Error.MSPACK_ERR_OK)
+ return -1;
+
+ long temp = PEEK_BITS_T_LSB(nbits, bit_buffer);
+
+ REMOVE_BITS_LSB(nbits, ref bit_buffer, ref bits_left);
+ return temp;
+ }
+
///
/// Removes N bits from the bit buffer
///
diff --git a/BurnOutSharp/External/libmspack/Compression/LZHKWAJ.cs b/BurnOutSharp/External/libmspack/Compression/LZHKWAJ.cs
index c72a193d..64bcec2c 100644
--- a/BurnOutSharp/External/libmspack/Compression/LZHKWAJ.cs
+++ b/BurnOutSharp/External/libmspack/Compression/LZHKWAJ.cs
@@ -62,32 +62,7 @@ namespace LibMSPackSharp.Compression
{
//READ_BITS_SAFE(types[i], 4)
{
- //READ_BITS(types[i], 4)
- {
- //ENSURE_BITS(nbits)
- {
- while (bits_left < (4))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (types[i]) = (uint)lzh.PEEK_BITS_MSB(4, bit_buffer);
- lzh.REMOVE_BITS_MSB(4, ref bit_buffer, ref bits_left);
- }
-
+ types[i] = (uint)lzh.READ_BITS_MSB(4, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (lzh.EndOfInput != 0 && bits_left < lzh.EndOfInput)
return Error.MSPACK_ERR_OK;
}
@@ -173,26 +148,7 @@ namespace LibMSPackSharp.Compression
{
//READ_HUFFSYM(MATCHLEN2, len)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ lzh.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = lzh.MATCHLEN2_table[lzh.PEEK_BITS_MSB(KWAJ_TABLEBITS, bit_buffer)];
if (sym >= KWAJ_MATCHLEN2_SYMS)
{
@@ -224,26 +180,7 @@ namespace LibMSPackSharp.Compression
{
//READ_HUFFSYM(MATCHLEN1, len)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ lzh.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = lzh.MATCHLEN1_table[lzh.PEEK_BITS_MSB(KWAJ_TABLEBITS, bit_buffer)];
if (sym >= KWAJ_MATCHLEN1_SYMS)
{
@@ -279,26 +216,7 @@ namespace LibMSPackSharp.Compression
{
//READ_HUFFSYM(OFFSET, j)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ lzh.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = lzh.OFFSET_table[lzh.PEEK_BITS_MSB(KWAJ_TABLEBITS, bit_buffer)];
if (sym >= KWAJ_OFFSET_SYMS)
{
@@ -328,32 +246,7 @@ namespace LibMSPackSharp.Compression
//READ_BITS_SAFE(j, 6)
{
- //READ_BITS(j, 6)
- {
- //ENSURE_BITS(6)
- {
- while (bits_left < (6))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (j) = (int)lzh.PEEK_BITS_MSB(6, bit_buffer);
- lzh.REMOVE_BITS_MSB(6, ref bit_buffer, ref bits_left);
- }
-
+ j = (int)lzh.READ_BITS_MSB(6, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (lzh.EndOfInput != 0 && bits_left < lzh.EndOfInput)
return Error.MSPACK_ERR_OK;
}
@@ -381,26 +274,7 @@ namespace LibMSPackSharp.Compression
{
//READ_HUFFSYM(LITLEN, len)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ lzh.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = lzh.LITLEN_table[lzh.PEEK_BITS_MSB(KWAJ_TABLEBITS, bit_buffer)];
if (sym >= KWAJ_LITLEN_SYMS)
{
@@ -434,26 +308,7 @@ namespace LibMSPackSharp.Compression
{
//READ_HUFFSYM(LITERAL, j)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ lzh.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = lzh.LITERAL_table[lzh.PEEK_BITS_MSB(KWAJ_TABLEBITS, bit_buffer)];
if (sym >= KWAJ_LITERAL_SYMS)
{
@@ -521,32 +376,7 @@ namespace LibMSPackSharp.Compression
case 1:
//READ_BITS_SAFE(c, 4)
{
- //READ_BITS(val, 4)
- {
- //ENSURE_BITS(4)
- {
- while (bits_left < (4))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (c) = (uint)lzh.PEEK_BITS_MSB(4, bit_buffer);
- lzh.REMOVE_BITS_MSB(4, ref bit_buffer, ref bits_left);
- }
-
+ c = (uint)lzh.READ_BITS_MSB(4, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (lzh.EndOfInput != 0 && bits_left < lzh.EndOfInput)
return Error.MSPACK_ERR_OK;
}
@@ -556,32 +386,7 @@ namespace LibMSPackSharp.Compression
{
//READ_BITS_SAFE(sel, 1)
{
- //READ_BITS(val, 1)
- {
- //ENSURE_BITS(1)
- {
- while (bits_left < (1))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (sel) = (uint)lzh.PEEK_BITS_MSB(1, bit_buffer);
- lzh.REMOVE_BITS_MSB(1, ref bit_buffer, ref bits_left);
- }
-
+ sel = (uint)lzh.READ_BITS_MSB(1, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (lzh.EndOfInput != 0 && bits_left < lzh.EndOfInput)
return Error.MSPACK_ERR_OK;
}
@@ -594,32 +399,7 @@ namespace LibMSPackSharp.Compression
{
//READ_BITS_SAFE(sel, 1)
{
- //READ_BITS(val, 1)
- {
- //ENSURE_BITS(1)
- {
- while (bits_left < (1))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (sel) = (uint)lzh.PEEK_BITS_MSB(1, bit_buffer);
- lzh.REMOVE_BITS_MSB(1, ref bit_buffer, ref bits_left);
- }
-
+ sel = (uint)lzh.READ_BITS_MSB(1, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (lzh.EndOfInput != 0 && bits_left < lzh.EndOfInput)
return Error.MSPACK_ERR_OK;
}
@@ -632,32 +412,7 @@ namespace LibMSPackSharp.Compression
{
//READ_BITS_SAFE(c, 4)
{
- //READ_BITS(val, 4)
- {
- //ENSURE_BITS(4)
- {
- while (bits_left < (4))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (c) = (uint)lzh.PEEK_BITS_MSB(4, bit_buffer);
- lzh.REMOVE_BITS_MSB(4, ref bit_buffer, ref bits_left);
- }
-
+ c = (uint)lzh.READ_BITS_MSB(4, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (lzh.EndOfInput != 0 && bits_left < lzh.EndOfInput)
return Error.MSPACK_ERR_OK;
}
@@ -672,32 +427,7 @@ namespace LibMSPackSharp.Compression
case 2:
//READ_BITS_SAFE(c, 4)
{
- //READ_BITS(val, 4)
- {
- //ENSURE_BITS(4)
- {
- while (bits_left < (4))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (c) = (uint)lzh.PEEK_BITS_MSB(4, bit_buffer);
- lzh.REMOVE_BITS_MSB(4, ref bit_buffer, ref bits_left);
- }
-
+ c = (uint)lzh.READ_BITS_MSB(4, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (lzh.EndOfInput != 0 && bits_left < lzh.EndOfInput)
return Error.MSPACK_ERR_OK;
}
@@ -707,32 +437,7 @@ namespace LibMSPackSharp.Compression
{
//READ_BITS_SAFE(sel, 2)
{
- //READ_BITS(sel, 2)
- {
- //ENSURE_BITS(2)
- {
- while (bits_left < (2))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (sel) = (uint)lzh.PEEK_BITS_MSB(2, bit_buffer);
- lzh.REMOVE_BITS_MSB(2, ref bit_buffer, ref bits_left);
- }
-
+ sel = (uint)lzh.READ_BITS_MSB(2, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (lzh.EndOfInput != 0 && bits_left < lzh.EndOfInput)
return Error.MSPACK_ERR_OK;
}
@@ -741,32 +446,7 @@ namespace LibMSPackSharp.Compression
{
//READ_BITS_SAFE(c, 4)
{
- //READ_BITS(c, 4)
- {
- //ENSURE_BITS(4)
- {
- while (bits_left < (4))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (c) = (uint)lzh.PEEK_BITS_MSB(4, bit_buffer);
- lzh.REMOVE_BITS_MSB(4, ref bit_buffer, ref bits_left);
- }
-
+ c = (uint)lzh.READ_BITS_MSB(4, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (lzh.EndOfInput != 0 && bits_left < lzh.EndOfInput)
return Error.MSPACK_ERR_OK;
}
@@ -786,32 +466,7 @@ namespace LibMSPackSharp.Compression
{
//READ_BITS_SAFE(c, 4)
{
- //READ_BITS(c, 4)
- {
- //ENSURE_BITS(4)
- {
- while (bits_left < (4))
- {
- //READ_BYTES
- {
- if (i_ptr >= i_end)
- {
- if ((err = ReadInput(lzh)) != Error.MSPACK_ERR_OK)
- return err;
-
- i_ptr = lzh.InputPointer;
- i_end = lzh.InputEnd;
- }
-
- lzh.INJECT_BITS_MSB(lzh.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (c) = (uint)lzh.PEEK_BITS_MSB(4, bit_buffer);
- lzh.REMOVE_BITS_MSB(4, ref bit_buffer, ref bits_left);
- }
-
+ c = (uint)lzh.READ_BITS_MSB(4, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (lzh.EndOfInput != 0 && bits_left < lzh.EndOfInput)
return Error.MSPACK_ERR_OK;
}
@@ -826,34 +481,5 @@ namespace LibMSPackSharp.Compression
return Error.MSPACK_ERR_OK;
}
-
- private static Error ReadInput(LZHKWAJStream lzh)
- {
- int read;
- if (lzh.EndOfInput != 0)
- {
- lzh.EndOfInput += 8;
- lzh.InputBuffer[0] = 0;
- read = 1;
- }
- else
- {
- read = lzh.System.Read(lzh.InputFileHandle, lzh.InputBuffer, 0, KWAJ_INPUT_SIZE);
- if (read < 0)
- return Error.MSPACK_ERR_READ;
-
- if (read == 0)
- {
- lzh.InputEnd = 8;
- lzh.InputBuffer[0] = 0;
- read = 1;
- }
- }
-
- // Update InputPointer and InputLength
- lzh.InputPointer = 0;
- lzh.InputEnd = read;
- return Error.MSPACK_ERR_OK;
- }
}
}
diff --git a/BurnOutSharp/External/libmspack/Compression/LZHKWAJStream.cs b/BurnOutSharp/External/libmspack/Compression/LZHKWAJStream.cs
index c7bd28d1..4ea428d4 100644
--- a/BurnOutSharp/External/libmspack/Compression/LZHKWAJStream.cs
+++ b/BurnOutSharp/External/libmspack/Compression/LZHKWAJStream.cs
@@ -13,6 +13,8 @@ namespace LibMSPackSharp.Compression
{
public class LZHKWAJStream : CompressionStream
{
+ #region Fields
+
// Huffman code lengths
public byte[] MATCHLEN1_len { get; set; } = new byte[KWAJ_MATCHLEN1_SYMS];
@@ -32,5 +34,55 @@ namespace LibMSPackSharp.Compression
// History window
public byte[] Window { get; set; } = new byte[LZSS.LZSS_WINDOW_SIZE];
+
+ #endregion
+
+ ///
+ public override void READ_BYTES(ref int i_ptr, ref int i_end, ref uint bit_buffer, ref int bits_left)
+ {
+ if (i_ptr >= i_end)
+ {
+ ReadInput();
+ if (Error != Error.MSPACK_ERR_OK)
+ return;
+
+ i_ptr = InputPointer;
+ i_end = InputEnd;
+ }
+
+ INJECT_BITS_MSB(InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
+ }
+
+ ///
+ protected override void ReadInput()
+ {
+ int read;
+ if (EndOfInput != 0)
+ {
+ EndOfInput += 8;
+ InputBuffer[0] = 0;
+ read = 1;
+ }
+ else
+ {
+ read = System.Read(InputFileHandle, InputBuffer, 0, KWAJ_INPUT_SIZE);
+ if (read < 0)
+ {
+ Error = Error.MSPACK_ERR_READ;
+ return;
+ }
+
+ if (read == 0)
+ {
+ InputEnd = 8;
+ InputBuffer[0] = 0;
+ read = 1;
+ }
+ }
+
+ // Update InputPointer and InputLength
+ InputPointer = 0;
+ InputEnd = read;
+ }
}
}
diff --git a/BurnOutSharp/External/libmspack/Compression/LZX.cs b/BurnOutSharp/External/libmspack/Compression/LZX.cs
index 8b8ebeb4..dff107f5 100644
--- a/BurnOutSharp/External/libmspack/Compression/LZX.cs
+++ b/BurnOutSharp/External/libmspack/Compression/LZX.cs
@@ -509,28 +509,7 @@ namespace LibMSPackSharp.Compression
// LZX DELTA format has chunk_size, not present in LZX format
if (lzx.IsDelta)
{
- //ENSURE_BITS(16)
- {
- while (bits_left < (16))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ lzx.ENSURE_BITS(16, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
lzx.REMOVE_BITS_MSB(16, ref bit_buffer, ref bits_left);
}
@@ -560,33 +539,8 @@ namespace LibMSPackSharp.Compression
// Read block type (3 bits) and block length (24 bits)
- //READ_BITS(lzx.BlockType, 3)
- {
- //ENSURE_BITS(3) // THIS IS NOT 3 BECAUSE OF OTHER CODE I FOUND
- {
- while (bits_left < (3))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (lzx.BlockType) = (LZXBlockType)lzx.PEEK_BITS_MSB(3, bit_buffer);
- lzx.REMOVE_BITS_MSB(3, ref bit_buffer, ref bits_left);
- }
+ // THIS IS NOT 3 BECAUSE OF OTHER CODE I FOUND
+ lzx.BlockType = (LZXBlockType)lzx.READ_BITS_MSB(3, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
// Read header if necessary
if (lzx.HeaderRead == 0)
@@ -594,153 +548,20 @@ namespace LibMSPackSharp.Compression
// Read 1 bit. if bit=0, intel_filesize = 0.
// if bit=1, read intel filesize (32 bits)
j = 0;
-
- //READ_BITS(i, 1)
- {
- //ENSURE_BITS(1)
- {
- while (bits_left < (1))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (i) = (int)lzx.PEEK_BITS_MSB(1, bit_buffer);
- lzx.REMOVE_BITS_MSB(1, ref bit_buffer, ref bits_left);
- }
+ i = (int)lzx.READ_BITS_MSB(1, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (i != 0)
{
- //READ_BITS(i, 16)
- {
- //ENSURE_BITS(16)
- {
- while (bits_left < (16))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (i) = (int)lzx.PEEK_BITS_MSB(16, bit_buffer);
- lzx.REMOVE_BITS_MSB(16, ref bit_buffer, ref bits_left);
- }
-
- //READ_BITS(j, 16)
- {
- //ENSURE_BITS(16)
- {
- while (bits_left < (16))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (j) = (int)lzx.PEEK_BITS_MSB(16, bit_buffer);
- lzx.REMOVE_BITS_MSB(16, ref bit_buffer, ref bits_left);
- }
+ i = (int)lzx.READ_BITS_MSB(16, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
+ j = (int)lzx.READ_BITS_MSB(16, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
}
lzx.IntelFileSize = (i << 16) | j;
lzx.HeaderRead = 1;
}
- //READ_BITS(i, 16)
- {
- //ENSURE_BITS(16)
- {
- while (bits_left < (16))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (i) = (int)lzx.PEEK_BITS_MSB(16, bit_buffer);
- lzx.REMOVE_BITS_MSB(16, ref bit_buffer, ref bits_left);
- }
-
- //READ_BITS(j, 8)
- {
- //ENSURE_BITS(8)
- {
- while (bits_left < (8))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (j) = (int)lzx.PEEK_BITS_MSB(8, bit_buffer);
- lzx.REMOVE_BITS_MSB(8, ref bit_buffer, ref bits_left);
- }
+ i = (int)lzx.READ_BITS_MSB(16, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
+ j = (int)lzx.READ_BITS_MSB(8, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
lzx.BlockRemaining = lzx.BlockLength = (uint)((i << 8) | j);
// Console.WriteLine($"New block t {lzx.BlockType} len {lzx.BlockLength}");
@@ -752,34 +573,7 @@ namespace LibMSPackSharp.Compression
// Read lengths of and build aligned huffman decoding tree
for (i = 0; i < 8; i++)
{
- //READ_BITS(j, 3)
- {
- //ENSURE_BITS(3)
- {
- while (bits_left < (3))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (j) = (int)lzx.PEEK_BITS_MSB(3, bit_buffer);
- lzx.REMOVE_BITS_MSB(3, ref bit_buffer, ref bits_left);
- }
-
+ j = (int)lzx.READ_BITS_MSB(16, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
lzx.ALIGNED_len[i] = (byte)j;
}
@@ -935,29 +729,7 @@ namespace LibMSPackSharp.Compression
// Read 1-16 (not 0-15) bits to align to bytes
if (bits_left == 0)
- {
- //ENSURE_BITS(16)
- {
- while (bits_left < (16))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
- }
+ lzx.ENSURE_BITS(16, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
bits_left = 0; bit_buffer = 0;
@@ -1002,28 +774,7 @@ namespace LibMSPackSharp.Compression
{
//READ_HUFFSYM(MAINTREE, main_element)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ lzx.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = lzx.MAINTREE_table[lzx.PEEK_BITS_MSB(LZX_MAINTREE_TABLEBITS, bit_buffer)];
if (sym >= LZX_MAINTREE_MAXSYMBOLS)
{
@@ -1068,28 +819,7 @@ namespace LibMSPackSharp.Compression
//READ_HUFFSYM(LENGTH, length_footer)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ lzx.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = lzx.LENGTH_table[lzx.PEEK_BITS_MSB(LZX_LENGTH_TABLEBITS, bit_buffer)];
if (sym >= LZX_LENGTH_MAXSYMBOLS)
{
@@ -1145,35 +875,7 @@ namespace LibMSPackSharp.Compression
else
{
extra = (match_offset >= 36) ? 17 : extra_bits[match_offset];
-
- //READ_BITS(verbatim_bits, extra)
- {
- //ENSURE_BITS(extra)
- {
- while (bits_left < (extra))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (verbatim_bits) = (int)lzx.PEEK_BITS_MSB(extra, bit_buffer);
- lzx.REMOVE_BITS_MSB(extra, ref bit_buffer, ref bits_left);
- }
-
+ verbatim_bits = (int)lzx.READ_BITS_MSB(extra, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
match_offset = (uint)(position_base[match_offset] - 2 + verbatim_bits);
}
}
@@ -1188,61 +890,12 @@ namespace LibMSPackSharp.Compression
if (extra > 3)
{
extra -= 3;
-
- //READ_BITS(verbatim_bits, extra)
- {
- //ENSURE_BITS(extra)
- {
- while (bits_left < (extra))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (verbatim_bits) = (int)lzx.PEEK_BITS_MSB(extra, bit_buffer);
- lzx.REMOVE_BITS_MSB(extra, ref bit_buffer, ref bits_left);
- }
-
+ verbatim_bits = (int)lzx.READ_BITS_MSB(extra, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
match_offset += (uint)(verbatim_bits << 3);
//READ_HUFFSYM(ALIGNED, aligned_bits)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ lzx.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = lzx.ALIGNED_table[lzx.PEEK_BITS_MSB(LZX_ALIGNED_TABLEBITS, bit_buffer)];
if (sym >= LZX_ALIGNED_MAXSYMBOLS)
{
@@ -1272,28 +925,7 @@ namespace LibMSPackSharp.Compression
{
//READ_HUFFSYM(ALIGNED, aligned_bits)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ lzx.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = lzx.ALIGNED_table[lzx.PEEK_BITS_MSB(LZX_ALIGNED_TABLEBITS, bit_buffer)];
if (sym >= LZX_ALIGNED_MAXSYMBOLS)
{
@@ -1321,34 +953,7 @@ namespace LibMSPackSharp.Compression
// 1-2: verbatim bits only
else if (extra > 0)
{
- //READ_BITS(verbatim_bits, extra)
- {
- //ENSURE_BITS(extra)
- {
- while (bits_left < (extra))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (verbatim_bits) = (int)lzx.PEEK_BITS_MSB(extra, bit_buffer);
- lzx.REMOVE_BITS_MSB(extra, ref bit_buffer, ref bits_left);
- }
-
+ verbatim_bits = (int)lzx.READ_BITS_MSB(extra, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
match_offset += (uint)verbatim_bits;
}
@@ -1370,96 +975,20 @@ namespace LibMSPackSharp.Compression
int extra_len;
// 4 entry huffman tree
-
- //ENSURE_BITS(3)
- {
- while (bits_left < (3))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
+ lzx.ENSURE_BITS(3, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
// '0' . 8 extra length bits
if (lzx.PEEK_BITS_MSB(1, bit_buffer) == 0)
{
lzx.REMOVE_BITS_MSB(1, ref bit_buffer, ref bits_left);
-
- //READ_BITS(extra_len, 8)
- {
- //ENSURE_BITS(8)
- {
- while (bits_left < (8))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (extra_len) = (int)lzx.PEEK_BITS_MSB(8, bit_buffer);
- lzx.REMOVE_BITS_MSB(8, ref bit_buffer, ref bits_left);
- }
+ extra_len = (int)lzx.READ_BITS_MSB(8, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
}
// '10' . 10 extra length bits + 0x100
else if (lzx.PEEK_BITS_MSB(2, bit_buffer) == 2)
{
lzx.REMOVE_BITS_MSB(2, ref bit_buffer, ref bits_left);
-
- //READ_BITS(extra_len, 10)
- {
- //ENSURE_BITS(10)
- {
- while (bits_left < (10))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (extra_len) = (int)lzx.PEEK_BITS_MSB(10, bit_buffer);
- lzx.REMOVE_BITS_MSB(10, ref bit_buffer, ref bits_left);
- }
-
+ extra_len = (int)lzx.READ_BITS_MSB(10, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
extra_len += 0x100;
}
@@ -1467,35 +996,7 @@ namespace LibMSPackSharp.Compression
else if (lzx.PEEK_BITS_MSB(3, bit_buffer) == 6)
{
lzx.REMOVE_BITS_MSB(3, ref bit_buffer, ref bits_left);
-
- //READ_BITS(extra_len, 12)
- {
- //ENSURE_BITS(12)
- {
- while (bits_left < (12))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (extra_len) = (int)lzx.PEEK_BITS_MSB(12, bit_buffer);
- lzx.REMOVE_BITS_MSB(12, ref bit_buffer, ref bits_left);
- }
-
+ extra_len = (int)lzx.READ_BITS_MSB(12, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
extra_len += 0x500;
}
@@ -1503,34 +1004,7 @@ namespace LibMSPackSharp.Compression
else
{
lzx.REMOVE_BITS_MSB(3, ref bit_buffer, ref bits_left);
-
- //READ_BITS(extra_len, 15)
- {
- //ENSURE_BITS(15)
- {
- while (bits_left < (15))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (extra_len) = (int)lzx.PEEK_BITS_MSB(15, bit_buffer);
- lzx.REMOVE_BITS_MSB(15, ref bit_buffer, ref bits_left);
- }
+ extra_len = (int)lzx.READ_BITS_MSB(15, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
}
match_length += extra_len;
@@ -1650,30 +1124,7 @@ namespace LibMSPackSharp.Compression
// Re-align input bitstream
if (bits_left > 0)
- {
- //ENSURE_BITS(16)
- {
- while (bits_left < (16))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
- }
-
+ lzx.ENSURE_BITS(16, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if ((bits_left & 15) != 0)
lzx.REMOVE_BITS_MSB(bits_left & 15, ref bit_buffer, ref bits_left);
@@ -1785,34 +1236,7 @@ namespace LibMSPackSharp.Compression
// Read lengths for pretree (20 symbols, lengths stored in fixed 4 bits)
for (x = 0; x < 20; x++)
{
- //READ_BITS(y, 4)
- {
- //ENSURE_BITS(4)
- {
- while (bits_left < (4))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (y) = (uint)lzx.PEEK_BITS_MSB(4, bit_buffer);
- lzx.REMOVE_BITS_MSB(4, ref bit_buffer, ref bits_left);
- }
-
+ y = (uint)lzx.READ_BITS_MSB(4, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
lzx.PRETREE_len[x] = (byte)y;
}
@@ -1829,28 +1253,7 @@ namespace LibMSPackSharp.Compression
{
//READ_HUFFSYM(PRETREE, z)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ lzx.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = lzx.PRETREE_table[lzx.PEEK_BITS_MSB(LZX_PRETREE_TABLEBITS, bit_buffer)];
if (sym >= LZX_PRETREE_MAXSYMBOLS)
{
@@ -1875,34 +1278,7 @@ namespace LibMSPackSharp.Compression
// Code = 17, run of ([read 4 bits]+4) zeros
if (z == 17)
{
- //READ_BITS(y, 4)
- {
- //ENSURE_BITS(4)
- {
- while (bits_left < (4))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (y) = (uint)lzx.PEEK_BITS_MSB(4, bit_buffer);
- lzx.REMOVE_BITS_MSB(4, ref bit_buffer, ref bits_left);
- }
-
+ y = (uint)lzx.READ_BITS_MSB(4, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
y += 4;
while (y-- != 0)
{
@@ -1913,34 +1289,7 @@ namespace LibMSPackSharp.Compression
// Code = 18, run of ([read 5 bits]+20) zeros
else if (z == 18)
{
- //READ_BITS(y, 5)
- {
- //ENSURE_BITS(5)
- {
- while (bits_left < (5))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (y) = (uint)lzx.PEEK_BITS_MSB(5, bit_buffer);
- lzx.REMOVE_BITS_MSB(5, ref bit_buffer, ref bits_left);
- }
-
+ y = (uint)lzx.READ_BITS_MSB(5, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
y += 20;
while (y-- != 0)
{
@@ -1951,60 +1300,12 @@ namespace LibMSPackSharp.Compression
// Code = 19, run of ([read 1 bit]+4) [read huffman symbol]
else if (z == 19)
{
- //READ_BITS(y, 1)
- {
- //ENSURE_BITS(1)
- {
- while (bits_left < (1))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (y) = (uint)lzx.PEEK_BITS_MSB(1, bit_buffer);
- lzx.REMOVE_BITS_MSB(1, ref bit_buffer, ref bits_left);
- }
-
+ y = (uint)lzx.READ_BITS_MSB(1, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
y += 4;
//READ_HUFFSYM(PRETREE, z)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b0 = lzx.InputBuffer[i_ptr++];
-
- lzx.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (lzx.Error != Error.MSPACK_ERR_OK)
- return lzx.Error;
-
- byte b1 = lzx.InputBuffer[i_ptr++];
- lzx.INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ lzx.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = lzx.PRETREE_table[lzx.PEEK_BITS_MSB(LZX_PRETREE_TABLEBITS, bit_buffer)];
if (sym >= LZX_PRETREE_MAXSYMBOLS)
{
diff --git a/BurnOutSharp/External/libmspack/Compression/LZXDStream.cs b/BurnOutSharp/External/libmspack/Compression/LZXDStream.cs
index 7ef7e242..bd94147b 100644
--- a/BurnOutSharp/External/libmspack/Compression/LZXDStream.cs
+++ b/BurnOutSharp/External/libmspack/Compression/LZXDStream.cs
@@ -14,6 +14,8 @@ namespace LibMSPackSharp.Compression
{
public class LZXDStream : CompressionStream
{
+ #region Fields
+
///
/// Number of bytes actually output
///
@@ -136,5 +138,24 @@ namespace LibMSPackSharp.Compression
// This is used purely for doing the intel E8 transform
public byte[] e8_buf { get; set; } = new byte[LZX.LZX_FRAME_SIZE];
+
+ #endregion
+
+ ///
+ public override void READ_BYTES(ref int i_ptr, ref int i_end, ref uint bit_buffer, ref int bits_left)
+ {
+ READ_IF_NEEDED(ref i_ptr, ref i_end);
+ if (Error != Error.MSPACK_ERR_OK)
+ return;
+
+ byte b0 = InputBuffer[i_ptr++];
+
+ READ_IF_NEEDED(ref i_ptr, ref i_end);
+ if (Error != Error.MSPACK_ERR_OK)
+ return;
+
+ byte b1 = InputBuffer[i_ptr++];
+ INJECT_BITS_MSB((b1 << 8) | b0, 16, ref bit_buffer, ref bits_left);
+ }
}
}
diff --git a/BurnOutSharp/External/libmspack/Compression/MSZIP.cs b/BurnOutSharp/External/libmspack/Compression/MSZIP.cs
index a5ceb08f..f3fef598 100644
--- a/BurnOutSharp/External/libmspack/Compression/MSZIP.cs
+++ b/BurnOutSharp/External/libmspack/Compression/MSZIP.cs
@@ -200,26 +200,7 @@ namespace LibMSPackSharp.Compression
state = 0;
do
{
- //READ_BITS(i, 8)
- {
- //ENSURE_BITS(8)
- {
- while (bits_left < (8))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (i) = (int)zip.PEEK_BITS_LSB(8, bit_buffer);
- zip.REMOVE_BITS_LSB(8, ref bit_buffer, ref bits_left);
- }
+ i = (int)zip.READ_BITS_LSB(8, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (i == 'C')
state = 1;
@@ -306,100 +287,19 @@ namespace LibMSPackSharp.Compression
i = bits_left & 7;
zip.REMOVE_BITS_LSB(i, ref bit_buffer, ref bits_left);
- //READ_BITS(block_len, 8)
- {
- //ENSURE_BITS(8)
- {
- while (bits_left < (8))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (block_len) = (int)zip.PEEK_BITS_LSB(8, bit_buffer);
- zip.REMOVE_BITS_LSB(8, ref bit_buffer, ref bits_left);
- }
-
- //READ_BITS(i, 8)
- {
- //ENSURE_BITS(8)
- {
- while (bits_left < (8))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (i) = (int)zip.PEEK_BITS_LSB(8, bit_buffer);
- zip.REMOVE_BITS_LSB(8, ref bit_buffer, ref bits_left);
- }
+ block_len = (int)zip.READ_BITS_LSB(8, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
+ i = (int)zip.READ_BITS_LSB(8, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
block_len |= i << 8;
-
if (block_len == 0)
break;
// Read "CK" header
-
- //READ_BITS(i, 8)
- {
- //ENSURE_BITS(8)
- {
- while (bits_left < (8))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (i) = (int)zip.PEEK_BITS_LSB(8, bit_buffer);
- zip.REMOVE_BITS_LSB(8, ref bit_buffer, ref bits_left);
- }
-
+ i = (int)zip.READ_BITS_LSB(8, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (i != 'C')
return Error.MSPACK_ERR_DATAFORMAT;
- //READ_BITS(i, 8)
- {
- //ENSURE_BITS(8)
- {
- while (bits_left < (8))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (i) = (int)zip.PEEK_BITS_LSB(8, bit_buffer);
- zip.REMOVE_BITS_LSB(8, ref bit_buffer, ref bits_left);
- }
-
+ i = (int)zip.READ_BITS_LSB(8, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (i != 'K')
return Error.MSPACK_ERR_DATAFORMAT;
@@ -435,75 +335,15 @@ namespace LibMSPackSharp.Compression
zip.RESTORE_BITS(out int i_ptr, out int i_end, out uint bit_buffer, out int bits_left);
// Read the number of codes
-
- //READ_BITS(lit_codes, 5)
- {
- //ENSURE_BITS(5)
- {
- while (bits_left < (5))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (lit_codes) = (uint)zip.PEEK_BITS_LSB(5, bit_buffer);
- zip.REMOVE_BITS_LSB(5, ref bit_buffer, ref bits_left);
- }
-
+ lit_codes = (uint)zip.READ_BITS_LSB(5, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
lit_codes += 257;
- //READ_BITS(dist_codes, 5)
- {
- //ENSURE_BITS(5)
- {
- while (bits_left < (5))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (dist_codes) = (uint)zip.PEEK_BITS_LSB(5, bit_buffer);
- zip.REMOVE_BITS_LSB(5, ref bit_buffer, ref bits_left);
- }
-
+ dist_codes = (uint)zip.READ_BITS_LSB(5, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
dist_codes += 1;
- //READ_BITS(bitlen_codes, 4)
- {
- //ENSURE_BITS(4)
- {
- while (bits_left < (4))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (bitlen_codes) = (uint)zip.PEEK_BITS_LSB(4, bit_buffer);
- zip.REMOVE_BITS_LSB(4, ref bit_buffer, ref bits_left);
- }
-
+ bitlen_codes = (uint)zip.READ_BITS_LSB(5, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
bitlen_codes += 4;
+
if (lit_codes > MSZIP_LITERAL_MAXSYMBOLS)
return Error.INF_ERR_SYMLENS;
if (dist_codes > MSZIP_DISTANCE_MAXSYMBOLS)
@@ -512,26 +352,7 @@ namespace LibMSPackSharp.Compression
// Read in the bit lengths in their unusual order
for (i = 0; i < bitlen_codes; i++)
{
- //READ_BITS(bl_len[bitlen_order[i]], 3)
- {
- //ENSURE_BITS(3)
- {
- while (bits_left < (3))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (bl_len[bitlen_order[i]]) = (byte)zip.PEEK_BITS_LSB(3, bit_buffer);
- zip.REMOVE_BITS_LSB(3, ref bit_buffer, ref bits_left);
- }
+ bl_len[bitlen_order[i]] = (byte)zip.READ_BITS_LSB(3, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
}
while (i < 19)
@@ -548,21 +369,7 @@ namespace LibMSPackSharp.Compression
{
// Single-level huffman lookup
- //ENSURE_BITS(7)
- {
- while (bits_left < (7))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ zip.ENSURE_BITS(7, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
code = bl_table[zip.PEEK_BITS_LSB(7, bit_buffer)];
zip.REMOVE_BITS_LSB(bl_len[code], ref bit_buffer, ref bits_left);
@@ -575,79 +382,19 @@ namespace LibMSPackSharp.Compression
switch (code)
{
case 16:
- //READ_BITS(run, 2)
- {
- //ENSURE_BITS(2)
- {
- while (bits_left < (2))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (run) = (uint)zip.PEEK_BITS_LSB(2, bit_buffer);
- zip.REMOVE_BITS_LSB(2, ref bit_buffer, ref bits_left);
- }
-
+ run = (uint)zip.READ_BITS_LSB(2, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
run += 3;
code = last_code;
break;
case 17:
- //READ_BITS(run, 3)
- {
- //ENSURE_BITS(3)
- {
- while (bits_left < (3))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (run) = (uint)zip.PEEK_BITS_LSB(3, bit_buffer);
- zip.REMOVE_BITS_LSB(3, ref bit_buffer, ref bits_left);
- }
-
+ run = (uint)zip.READ_BITS_LSB(3, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
run += 3;
code = 0;
break;
case 18:
- //READ_BITS(run, 7)
- {
- //ENSURE_BITS(7)
- {
- while (bits_left < (7))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (run) = (uint)zip.PEEK_BITS_LSB(7, bit_buffer);
- zip.REMOVE_BITS_LSB(7, ref bit_buffer, ref bits_left);
- }
-
+ run = (uint)zip.READ_BITS_LSB(7, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
run += 11;
code = 0;
break;
@@ -703,50 +450,10 @@ namespace LibMSPackSharp.Compression
do
{
// Read in last block bit
-
- //READ_BITS(last_block, 1)
- {
- //ENSURE_BITS(1)
- {
- while (bits_left < (1))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (last_block) = (uint)zip.PEEK_BITS_LSB(1, bit_buffer);
- zip.REMOVE_BITS_LSB(1, ref bit_buffer, ref bits_left);
- }
+ last_block = (uint)zip.READ_BITS_LSB(1, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
// Read in block type
-
- //READ_BITS(block_type, 2)
- {
- //ENSURE_BITS(2)
- {
- while (bits_left < (2))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (block_type) = (uint)zip.PEEK_BITS_LSB(2, bit_buffer);
- zip.REMOVE_BITS_LSB(2, ref bit_buffer, ref bits_left);
- }
+ block_type = (uint)zip.READ_BITS_LSB(2, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
if (block_type == 0)
{
@@ -877,21 +584,7 @@ namespace LibMSPackSharp.Compression
{
//READ_HUFFSYM(LITERAL, code)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ zip.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = zip.LITERAL_table[zip.PEEK_BITS_LSB(MSZIP_LITERAL_TABLEBITS, bit_buffer)];
if (sym >= MSZIP_LITERAL_MAXSYMBOLS)
{
@@ -939,46 +632,12 @@ namespace LibMSPackSharp.Compression
if (code >= 29)
return Error.INF_ERR_LITCODE; // Codes 286-287 are illegal
- //READ_BITS_T(length, lit_extrabits[code])
- {
- //ENSURE_BITS(lit_extrabits[code])
- {
- while (bits_left < (lit_extrabits[code]))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (length) = (uint)zip.PEEK_BITS_T_LSB(lit_extrabits[code], bit_buffer);
- zip.REMOVE_BITS_LSB(lit_extrabits[code], ref bit_buffer, ref bits_left);
- }
-
+ length = (uint)zip.READ_BITS_T_LSB(lit_extrabits[code], ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
length += lit_lengths[code];
//READ_HUFFSYM(DISTANCE, code)
{
- //ENSURE_BITS(CompressionStream.HUFF_MAXBITS)
- {
- while (bits_left < (CompressionStream.HUFF_MAXBITS))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ zip.ENSURE_BITS(CompressionStream.HUFF_MAXBITS, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
sym = zip.DISTANCE_table[zip.PEEK_BITS_LSB(MSZIP_DISTANCE_TABLEBITS, bit_buffer)];
if (sym >= MSZIP_DISTANCE_MAXSYMBOLS)
{
@@ -1003,27 +662,7 @@ namespace LibMSPackSharp.Compression
if (code >= 30)
return Error.INF_ERR_DISTCODE;
- //READ_BITS_T(distance, dist_extrabits[code])
- {
- //ENSURE_BITS(dist_extrabits[code])
- {
- while (bits_left < (dist_extrabits[code]))
- {
- //READ_BYTES
- {
- zip.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (zip.Error != Error.MSPACK_ERR_OK)
- return zip.Error;
-
- zip.INJECT_BITS_LSB(zip.InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (distance) = (uint)zip.PEEK_BITS_T_LSB(dist_extrabits[code], bit_buffer);
- zip.REMOVE_BITS_LSB(dist_extrabits[code], ref bit_buffer, ref bits_left);
- }
-
+ distance = (uint)zip.READ_BITS_T_LSB(dist_extrabits[code], ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
distance += dist_offsets[code];
// Match position is window position minus distance. If distance
diff --git a/BurnOutSharp/External/libmspack/Compression/MSZIPDStream.cs b/BurnOutSharp/External/libmspack/Compression/MSZIPDStream.cs
index bd051c41..e0c5d12d 100644
--- a/BurnOutSharp/External/libmspack/Compression/MSZIPDStream.cs
+++ b/BurnOutSharp/External/libmspack/Compression/MSZIPDStream.cs
@@ -16,6 +16,8 @@ namespace LibMSPackSharp.Compression
{
public class MSZIPDStream : CompressionStream
{
+ #region Fields
+
///
/// 32kb history window
///
@@ -48,5 +50,17 @@ namespace LibMSPackSharp.Compression
public ushort[] DISTANCE_table { get; set; } = new ushort[MSZIP.MSZIP_DISTANCE_TABLESIZE];
#endregion
+
+ #endregion
+
+ ///
+ public override void READ_BYTES(ref int i_ptr, ref int i_end, ref uint bit_buffer, ref int bits_left)
+ {
+ READ_IF_NEEDED(ref i_ptr, ref i_end);
+ if (Error != Error.MSPACK_ERR_OK)
+ return;
+
+ INJECT_BITS_LSB(InputBuffer[i_ptr++], 8, ref bit_buffer, ref bits_left);
+ }
}
}
diff --git a/BurnOutSharp/External/libmspack/Compression/QTM.cs b/BurnOutSharp/External/libmspack/Compression/QTM.cs
index 08036b98..f83ad717 100644
--- a/BurnOutSharp/External/libmspack/Compression/QTM.cs
+++ b/BurnOutSharp/External/libmspack/Compression/QTM.cs
@@ -230,35 +230,7 @@ namespace LibMSPackSharp.Compression
{
H = 0xFFFF;
L = 0;
-
- //READ_BITS(C, 16)
- {
- //ENSURE_BITS(16)
- {
- while (bits_left < (16))
- {
- //READ_BYTES
- {
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b0 = qtm.InputBuffer[i_ptr++];
-
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b1 = qtm.InputBuffer[i_ptr++];
- qtm.INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (C) = (ushort)qtm.PEEK_BITS_MSB(16, bit_buffer);
- qtm.REMOVE_BITS_MSB(16, ref bit_buffer, ref bits_left);
- }
-
+ C = (ushort)qtm.READ_BITS_MSB(16, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
qtm.HeaderRead = 1;
}
@@ -318,28 +290,7 @@ namespace LibMSPackSharp.Compression
L <<= 1;
H = (ushort)((H << 1) | 1);
- //ENSURE_BITS(1)
- {
- while (bits_left < (1))
- {
- //READ_BYTES
- {
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b0 = qtm.InputBuffer[i_ptr++];
-
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b1 = qtm.InputBuffer[i_ptr++];
- qtm.INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ qtm.ENSURE_BITS(1, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
C = (ushort)((C << 1) | (qtm.PEEK_BITS_MSB(1, bit_buffer)));
qtm.REMOVE_BITS_MSB(1, ref bit_buffer, ref bits_left);
}
@@ -415,28 +366,7 @@ namespace LibMSPackSharp.Compression
L <<= 1;
H = (ushort)((H << 1) | 1);
- //ENSURE_BITS(1)
- {
- while (bits_left < (1))
- {
- //READ_BYTES
- {
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b0 = qtm.InputBuffer[i_ptr++];
-
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b1 = qtm.InputBuffer[i_ptr++];
- qtm.INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ qtm.ENSURE_BITS(1, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
C = (ushort)((C << 1) | (qtm.PEEK_BITS_MSB(1, bit_buffer)));
qtm.REMOVE_BITS_MSB(1, ref bit_buffer, ref bits_left);
}
@@ -498,65 +428,13 @@ namespace LibMSPackSharp.Compression
L <<= 1;
H = (ushort)((H << 1) | 1);
- //ENSURE_BITS(1)
- {
- while (bits_left < (1))
- {
- //READ_BYTES
- {
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b0 = qtm.InputBuffer[i_ptr++];
-
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b1 = qtm.InputBuffer[i_ptr++];
- qtm.INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ qtm.ENSURE_BITS(1, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
C = (ushort)((C << 1) | (qtm.PEEK_BITS_MSB(1, bit_buffer)));
qtm.REMOVE_BITS_MSB(1, ref bit_buffer, ref bits_left);
}
}
- //READ_MANY_BITS(extra, extra_bits[sym])
- {
- byte needed = (byte)(extra_bits[sym]), bitrun;
- (extra) = 0;
- while (needed > 0)
- {
- if ((bits_left) <= (CompressionStream.BITBUF_WIDTH - 16))
- {
- //READ_BYTES
- {
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b0 = qtm.InputBuffer[i_ptr++];
-
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b1 = qtm.InputBuffer[i_ptr++];
- qtm.INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
- }
- }
-
- bitrun = (byte)((bits_left < needed) ? bits_left : needed);
- (extra) = (int)(((extra) << bitrun) | (qtm.PEEK_BITS_MSB(bitrun, bit_buffer)));
- qtm.REMOVE_BITS_MSB(bitrun, ref bit_buffer, ref bits_left);
- needed -= bitrun;
- }
- }
-
+ extra = (int)qtm.READ_MANY_BITS_MSB(extra_bits[sym], ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
match_offset = (uint)(position_base[sym] + extra + 1);
match_length = 3;
break;
@@ -609,65 +487,13 @@ namespace LibMSPackSharp.Compression
L <<= 1;
H = (ushort)((H << 1) | 1);
- //ENSURE_BITS(1)
- {
- while (bits_left < (1))
- {
- //READ_BYTES
- {
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b0 = qtm.InputBuffer[i_ptr++];
-
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b1 = qtm.InputBuffer[i_ptr++];
- qtm.INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ qtm.ENSURE_BITS(1, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
C = (ushort)((C << 1) | (qtm.PEEK_BITS_MSB(1, bit_buffer)));
qtm.REMOVE_BITS_MSB(1, ref bit_buffer, ref bits_left);
}
}
- //READ_MANY_BITS(extra, extra_bits[sym])
- {
- byte needed = (byte)(extra_bits[sym]), bitrun;
- (extra) = 0;
- while (needed > 0)
- {
- if ((bits_left) <= (CompressionStream.BITBUF_WIDTH - 16))
- {
- //READ_BYTES
- {
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b0 = qtm.InputBuffer[i_ptr++];
-
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b1 = qtm.InputBuffer[i_ptr++];
- qtm.INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
- }
- }
-
- bitrun = (byte)((bits_left < needed) ? bits_left : needed);
- (extra) = (int)(((extra) << bitrun) | (qtm.PEEK_BITS_MSB(bitrun, bit_buffer)));
- qtm.REMOVE_BITS_MSB(bitrun, ref bit_buffer, ref bits_left);
- needed -= bitrun;
- }
- }
-
+ extra = (int)qtm.READ_MANY_BITS_MSB(extra_bits[sym], ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
match_offset = (uint)(position_base[sym] + extra + 1);
match_length = 4;
break;
@@ -720,65 +546,13 @@ namespace LibMSPackSharp.Compression
L <<= 1;
H = (ushort)((H << 1) | 1);
- //ENSURE_BITS(1)
- {
- while (bits_left < (1))
- {
- //READ_BYTES
- {
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b0 = qtm.InputBuffer[i_ptr++];
-
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b1 = qtm.InputBuffer[i_ptr++];
- qtm.INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ qtm.ENSURE_BITS(1, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
C = (ushort)((C << 1) | (qtm.PEEK_BITS_MSB(1, bit_buffer)));
qtm.REMOVE_BITS_MSB(1, ref bit_buffer, ref bits_left);
}
}
- //READ_MANY_BITS(extra, length_extra[sym])
- {
- byte needed = (byte)(length_extra[sym]), bitrun;
- (extra) = 0;
- while (needed > 0)
- {
- if ((bits_left) <= (CompressionStream.BITBUF_WIDTH - 16))
- {
- //READ_BYTES
- {
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b0 = qtm.InputBuffer[i_ptr++];
-
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b1 = qtm.InputBuffer[i_ptr++];
- qtm.INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
- }
- }
-
- bitrun = (byte)((bits_left < needed) ? bits_left : needed);
- (extra) = (int)(((extra) << bitrun) | (qtm.PEEK_BITS_MSB(bitrun, bit_buffer)));
- qtm.REMOVE_BITS_MSB(bitrun, ref bit_buffer, ref bits_left);
- needed -= bitrun;
- }
- }
-
+ extra = (int)qtm.READ_MANY_BITS_MSB(length_extra[sym], ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
match_length = length_base[sym] + extra + 5;
//GET_SYMBOL(qtm.Model6, sym)
@@ -827,65 +601,13 @@ namespace LibMSPackSharp.Compression
L <<= 1;
H = (ushort)((H << 1) | 1);
- //ENSURE_BITS(1)
- {
- while (bits_left < (1))
- {
- //READ_BYTES
- {
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b0 = qtm.InputBuffer[i_ptr++];
-
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b1 = qtm.InputBuffer[i_ptr++];
- qtm.INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
+ qtm.ENSURE_BITS(1, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
C = (ushort)((C << 1) | (qtm.PEEK_BITS_MSB(1, bit_buffer)));
qtm.REMOVE_BITS_MSB(1, ref bit_buffer, ref bits_left);
}
}
- //READ_MANY_BITS(extra, extra_bits[sym])
- {
- byte needed = (byte)(extra_bits[sym]), bitrun;
- (extra) = 0;
- while (needed > 0)
- {
- if ((bits_left) <= (CompressionStream.BITBUF_WIDTH - 16))
- {
- //READ_BYTES
- {
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b0 = qtm.InputBuffer[i_ptr++];
-
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b1 = qtm.InputBuffer[i_ptr++];
- qtm.INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
- }
- }
-
- bitrun = (byte)((bits_left < needed) ? bits_left : needed);
- (extra) = (int)(((extra) << bitrun) | (qtm.PEEK_BITS_MSB(bitrun, bit_buffer)));
- qtm.REMOVE_BITS_MSB(bitrun, ref bit_buffer, ref bits_left);
- needed -= bitrun;
- }
- }
-
+ extra = (int)qtm.READ_MANY_BITS_MSB(extra_bits[sym], ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
match_offset = (uint)(position_base[sym] + extra + 1);
break;
@@ -1014,33 +736,7 @@ namespace LibMSPackSharp.Compression
// blocks, can have anything from 0 to 4 trailing null bytes.
do
{
- //READ_BITS(i, 8)
- {
- //ENSURE_BITS(8)
- {
- while (bits_left < (8))
- {
- //READ_BYTES
- {
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b0 = qtm.InputBuffer[i_ptr++];
-
- qtm.READ_IF_NEEDED(ref i_ptr, ref i_end);
- if (qtm.Error != Error.MSPACK_ERR_OK)
- return qtm.Error;
-
- byte b1 = qtm.InputBuffer[i_ptr++];
- qtm.INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
- }
- }
- }
-
- (i) = (int)qtm.PEEK_BITS_MSB(8, bit_buffer);
- qtm.REMOVE_BITS_MSB(8, ref bit_buffer, ref bits_left);
- }
+ i = (int)qtm.READ_BITS_MSB(8, ref i_ptr, ref i_end, ref bit_buffer, ref bits_left);
} while (i != 0xFF);
qtm.HeaderRead = 0;
diff --git a/BurnOutSharp/External/libmspack/Compression/QTMDStream.cs b/BurnOutSharp/External/libmspack/Compression/QTMDStream.cs
index e18f5845..ca8d6e89 100644
--- a/BurnOutSharp/External/libmspack/Compression/QTMDStream.cs
+++ b/BurnOutSharp/External/libmspack/Compression/QTMDStream.cs
@@ -14,6 +14,8 @@ namespace LibMSPackSharp.Compression
{
public class QTMDStream : CompressionStream
{
+ #region Fields
+
///
/// Decoding window
///
@@ -119,5 +121,24 @@ namespace LibMSPackSharp.Compression
public QTMDModelSym[] Model6LenSymbols { get; set; } = new QTMDModelSym[27 + 1];
public QTMDModelSym[] Model7Symbols { get; set; } = new QTMDModelSym[7 + 1];
+
+ #endregion
+
+ ///
+ public override void READ_BYTES(ref int i_ptr, ref int i_end, ref uint bit_buffer, ref int bits_left)
+ {
+ READ_IF_NEEDED(ref i_ptr, ref i_end);
+ if (Error != Error.MSPACK_ERR_OK)
+ return;
+
+ byte b0 = InputBuffer[i_ptr++];
+
+ READ_IF_NEEDED(ref i_ptr, ref i_end);
+ if (Error != Error.MSPACK_ERR_OK)
+ return;
+
+ byte b1 = InputBuffer[i_ptr++];
+ INJECT_BITS_MSB((b0 << 8) | b1, 16, ref bit_buffer, ref bits_left);
+ }
}
}