Checkpoint (nw)

This commit is contained in:
Matt Nadareski
2023-09-20 11:19:05 -04:00
parent 568d6f9e72
commit 67d49ac4c0
35 changed files with 56 additions and 29 deletions

View File

@@ -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;
}

View File

@@ -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
View 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);
}
}
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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];
}
}
}