mirror of
https://github.com/SabreTools/SabreTools.Compression.git
synced 2026-09-22 06:45:04 +00:00
Checkpoint (nw)
This commit is contained in:
@@ -9,7 +9,7 @@ namespace SabreTools.Compression.libmspack.CAB
|
||||
/// use. will read data blocks (and merge split blocks) from the cabinet
|
||||
/// and serve the read bytes to the decompressors
|
||||
/// </summary>
|
||||
public override unsafe int read(mspack_file file, void* buffer, int bytes)
|
||||
public override int read(mspack_file file, void* buffer, int bytes)
|
||||
{
|
||||
Decompressor self = (Decompressor)file;
|
||||
byte* buf = (byte*)buffer;
|
||||
@@ -86,7 +86,7 @@ namespace SabreTools.Compression.libmspack.CAB
|
||||
/// sys.write() function, or does nothing with the data when
|
||||
/// self.d.outfh == null. advances self.d.offset
|
||||
/// </summary>
|
||||
public override unsafe int write(mspack_file file, void* buffer, int bytes)
|
||||
public override int write(mspack_file file, void* buffer, int bytes)
|
||||
{
|
||||
Decompressor self = (Decompressor)file;
|
||||
self.d.offset += (uint)bytes;
|
||||
@@ -108,12 +108,12 @@ namespace SabreTools.Compression.libmspack.CAB
|
||||
int len, full_len;
|
||||
|
||||
// Reset the input block pointer and end of block pointer
|
||||
d.i_ptr = d.i_end = system.GetArrayPointer(d.input);
|
||||
d.i_ptr = d.i_end = &d.input[0];
|
||||
|
||||
do
|
||||
{
|
||||
// Read the block header
|
||||
if (sys.read(d.infh, system.GetArrayPointer(hdr), cfdata_SIZEOF) != cfdata_SIZEOF)
|
||||
if (sys.read(d.infh, &hdr[0], cfdata_SIZEOF) != cfdata_SIZEOF)
|
||||
{
|
||||
return MSPACK_ERR.MSPACK_ERR_READ;
|
||||
}
|
||||
|
||||
@@ -235,7 +235,7 @@ namespace SabreTools.Compression.libmspack.CAB
|
||||
}
|
||||
|
||||
// Read in the CFHEADER
|
||||
if (sys.read(fh, libmspack.system.GetArrayPointer(buf), cfhead_SIZEOF) != cfhead_SIZEOF)
|
||||
if (sys.read(fh, &buf[0], cfhead_SIZEOF) != cfhead_SIZEOF)
|
||||
{
|
||||
return MSPACK_ERR.MSPACK_ERR_READ;
|
||||
}
|
||||
@@ -278,7 +278,7 @@ namespace SabreTools.Compression.libmspack.CAB
|
||||
|
||||
if (cab.flags.HasFlag(MSCAB_HDR.MSCAB_HDR_RESV))
|
||||
{
|
||||
if (sys.read(fh, libmspack.system.GetArrayPointer(buf), cfheadext_SIZEOF) != cfheadext_SIZEOF)
|
||||
if (sys.read(fh, &buf[0], cfheadext_SIZEOF) != cfheadext_SIZEOF)
|
||||
{
|
||||
return MSPACK_ERR.MSPACK_ERR_READ;
|
||||
}
|
||||
@@ -328,7 +328,7 @@ namespace SabreTools.Compression.libmspack.CAB
|
||||
// Read folders
|
||||
for (i = 0; i < num_folders; i++)
|
||||
{
|
||||
if (sys.read(fh, libmspack.system.GetArrayPointer(buf), cffold_SIZEOF) != cffold_SIZEOF)
|
||||
if (sys.read(fh, &buf[0], cffold_SIZEOF) != cffold_SIZEOF)
|
||||
{
|
||||
return MSPACK_ERR.MSPACK_ERR_READ;
|
||||
}
|
||||
@@ -360,7 +360,7 @@ namespace SabreTools.Compression.libmspack.CAB
|
||||
// Read files
|
||||
for (i = 0; i < num_files; i++)
|
||||
{
|
||||
if (sys.read(fh, libmspack.system.GetArrayPointer(buf), cffile_SIZEOF) != cffile_SIZEOF)
|
||||
if (sys.read(fh, &buf[0], cffile_SIZEOF) != cffile_SIZEOF)
|
||||
{
|
||||
return MSPACK_ERR.MSPACK_ERR_READ;
|
||||
}
|
||||
@@ -465,7 +465,7 @@ namespace SabreTools.Compression.libmspack.CAB
|
||||
int len, i, ok;
|
||||
|
||||
// Read up to 256 bytes */
|
||||
if ((len = sys.read(fh, libmspack.system.GetArrayPointer(buf), 256)) <= 0)
|
||||
if ((len = sys.read(fh, &buf[0], 256)) <= 0)
|
||||
{
|
||||
error = MSPACK_ERR.MSPACK_ERR_READ;
|
||||
return null;
|
||||
@@ -492,7 +492,7 @@ namespace SabreTools.Compression.libmspack.CAB
|
||||
}
|
||||
|
||||
char[] strchr = new char[len];
|
||||
sys.copy(libmspack.system.GetArrayPointer(buf), libmspack.system.GetArrayPointer(strchr), len);
|
||||
sys.copy(&buf[0], &strchr[0], len);
|
||||
str = new string(strchr);
|
||||
error = MSPACK_ERR.MSPACK_ERR_OK;
|
||||
return str;
|
||||
@@ -1131,7 +1131,7 @@ namespace SabreTools.Compression.libmspack.CAB
|
||||
this.d.offset = 0;
|
||||
this.d.block = 0;
|
||||
this.d.outlen = 0;
|
||||
this.d.i_ptr = this.d.i_end = libmspack.system.GetArrayPointer(d.input);
|
||||
this.d.i_ptr = this.d.i_end = &d.input[0];
|
||||
|
||||
// Read_error lasts for the lifetime of a decompressor
|
||||
this.read_error = MSPACK_ERR.MSPACK_ERR_OK;
|
||||
|
||||
34
libmspack/FixedArray.cs
Normal file
34
libmspack/FixedArray.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SabreTools.Compression.libmspack
|
||||
{
|
||||
public unsafe class FixedArray<T> where T : struct
|
||||
{
|
||||
public IntPtr Pointer { get; private set; }
|
||||
|
||||
int sizeofT { get { return Marshal.SizeOf(typeof(T)); } }
|
||||
|
||||
public T this[int i]
|
||||
{
|
||||
get
|
||||
{
|
||||
return (T)Marshal.PtrToStructure(Pointer + i * sizeofT, typeof(T));
|
||||
}
|
||||
set
|
||||
{
|
||||
Marshal.StructureToPtr(value, Pointer + i * sizeofT, false);
|
||||
}
|
||||
}
|
||||
|
||||
public FixedArray(int length)
|
||||
{
|
||||
Pointer = Marshal.AllocHGlobal(sizeofT * length);
|
||||
}
|
||||
|
||||
~FixedArray()
|
||||
{
|
||||
Marshal.FreeHGlobal(Pointer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using static SabreTools.Compression.libmspack.KWAJ.Constants;
|
||||
|
||||
namespace SabreTools.Compression.libmspack.KWAJ
|
||||
{
|
||||
@@ -104,7 +105,7 @@ namespace SabreTools.Compression.libmspack.KWAJ
|
||||
int i;
|
||||
|
||||
// Read in the header
|
||||
if (sys.read(fh, libmspack.system.GetArrayPointer(buf), kwajh_SIZEOF) != kwajh_SIZEOF)
|
||||
if (sys.read(fh, &buf[0], kwajh_SIZEOF) != kwajh_SIZEOF)
|
||||
{
|
||||
return MSPACK_ERR.MSPACK_ERR_READ;
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ namespace SabreTools.Compression.libmspack.OAB
|
||||
goto outlbl;
|
||||
}
|
||||
|
||||
if (sys.read(infh, libmspack.system.GetArrayPointer(hdrbuf), oabhead_SIZEOF) != oabhead_SIZEOF)
|
||||
if (sys.read(infh, &hdrbuf[0], oabhead_SIZEOF) != oabhead_SIZEOF)
|
||||
{
|
||||
ret = MSPACK_ERR.MSPACK_ERR_READ;
|
||||
goto outlbl;
|
||||
@@ -225,8 +225,7 @@ namespace SabreTools.Compression.libmspack.OAB
|
||||
}
|
||||
|
||||
byte[] hdrbuf = new byte[patchhead_SIZEOF];
|
||||
byte* hdrbufPtr = libmspack.system.GetArrayPointer(hdrbuf);
|
||||
if (sys.read(infh, hdrbufPtr, patchhead_SIZEOF) != patchhead_SIZEOF)
|
||||
if (sys.read(infh, &hdrbuf[0], patchhead_SIZEOF) != patchhead_SIZEOF)
|
||||
{
|
||||
ret = MSPACK_ERR.MSPACK_ERR_READ;
|
||||
goto outlbl;
|
||||
|
||||
@@ -109,10 +109,9 @@ namespace SabreTools.Compression.libmspack.SZDD
|
||||
private static MSPACK_ERR ReadHeaders(mspack_system sys, mspack_file fh, msszddd_header hdr)
|
||||
{
|
||||
byte[] buf = new byte[8];
|
||||
byte* bufPtr = libmspack.system.GetArrayPointer<byte>(buf);
|
||||
|
||||
// Read and check signature
|
||||
if (sys.read(fh, buffer: bufPtr, 8) != 8) return MSPACK_ERR.MSPACK_ERR_READ;
|
||||
if (sys.read(fh, buffer: &buf[0], 8) != 8) return MSPACK_ERR.MSPACK_ERR_READ;
|
||||
|
||||
if (buf.SequenceEqual(szdd_signature_expand))
|
||||
{
|
||||
@@ -120,7 +119,7 @@ namespace SabreTools.Compression.libmspack.SZDD
|
||||
hdr.format = MSSZDD_FMT.MSSZDD_FMT_NORMAL;
|
||||
|
||||
// Read the rest of the header
|
||||
if (sys.read(fh, bufPtr, 6) != 6) return MSPACK_ERR.MSPACK_ERR_READ;
|
||||
if (sys.read(fh, &buf[0], 6) != 6) return MSPACK_ERR.MSPACK_ERR_READ;
|
||||
if (buf[0] != 0x41) return MSPACK_ERR.MSPACK_ERR_DATAFORMAT;
|
||||
hdr.missing_char = (char)buf[1];
|
||||
hdr.length = System.BitConverter.ToInt32(buf, 2);
|
||||
@@ -129,7 +128,7 @@ namespace SabreTools.Compression.libmspack.SZDD
|
||||
{
|
||||
// Special QBasic SZDD
|
||||
hdr.format = MSSZDD_FMT.MSSZDD_FMT_QBASIC;
|
||||
if (sys.read(fh, bufPtr, 4) != 4) return MSPACK_ERR.MSPACK_ERR_READ;
|
||||
if (sys.read(fh, &buf[0], 4) != 4) return MSPACK_ERR.MSPACK_ERR_READ;
|
||||
hdr.missing_char = '\0';
|
||||
hdr.length = System.BitConverter.ToInt32(buf, 0);
|
||||
}
|
||||
@@ -137,6 +136,7 @@ namespace SabreTools.Compression.libmspack.SZDD
|
||||
{
|
||||
return MSPACK_ERR.MSPACK_ERR_SIGNATURE;
|
||||
}
|
||||
|
||||
return MSPACK_ERR.MSPACK_ERR_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -202,7 +202,7 @@ namespace SabreTools.Compression.libmspack
|
||||
{
|
||||
if (i_ptr >= i_end)
|
||||
{
|
||||
if (read_input() != MSPACK_ERR.MSPACK_ERR_OK)
|
||||
if (ReadInput() != MSPACK_ERR.MSPACK_ERR_OK)
|
||||
return this.error;
|
||||
|
||||
i_ptr = this.i_ptr;
|
||||
@@ -212,7 +212,7 @@ namespace SabreTools.Compression.libmspack
|
||||
return MSPACK_ERR.MSPACK_ERR_OK;
|
||||
}
|
||||
|
||||
private MSPACK_ERR read_input()
|
||||
private MSPACK_ERR ReadInput()
|
||||
{
|
||||
int read = this.sys.read(this.input, this.inbuf, (int)this.inbuf_size);
|
||||
if (read < 0) return this.error = MSPACK_ERR.MSPACK_ERR_READ;
|
||||
|
||||
@@ -42,14 +42,7 @@ namespace SabreTools.Compression.libmspack
|
||||
public static T* CreateArray<T>(int length)
|
||||
{
|
||||
T[] buf = new T[length];
|
||||
return GetArrayPointer(buf);
|
||||
}
|
||||
|
||||
public static T* GetArrayPointer<T>(T[] arr)
|
||||
{
|
||||
var bufRef = __makeref(arr);
|
||||
var bufPtr = **(System.IntPtr**)&bufRef;
|
||||
return (T*)bufPtr.ToPointer();
|
||||
return &buf[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user