From 67d49ac4c079200739049878bb86ce18bc94b89e Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 20 Sep 2023 11:19:05 -0400 Subject: [PATCH] Checkpoint (nw) --- libmspack/CAB/CABSystem.cs | 8 ++--- libmspack/CAB/Decompressor.cs | 14 ++++---- libmspack/{ => CAB}/cab.cs | 0 libmspack/{ => CAB}/mscabd_cabinet.cs | 0 .../{ => CAB}/mscabd_decompress_state.cs | 0 libmspack/{ => CAB}/mscabd_file.cs | 0 libmspack/{ => CAB}/mscabd_folder.cs | 0 libmspack/{ => CAB}/mscabd_folder_data.cs | 0 libmspack/{ => CHM}/mschmc_file.cs | 0 .../{ => CHM}/mschmd_decompress_state.cs | 0 libmspack/{ => CHM}/mschmd_file.cs | 0 libmspack/{ => CHM}/mschmd_header.cs | 0 .../{ => CHM}/mschmd_sec_mscompressed.cs | 0 .../{ => CHM}/mschmd_sec_uncompressed.cs | 0 libmspack/{ => CHM}/mschmd_section.cs | 0 libmspack/FixedArray.cs | 34 +++++++++++++++++++ libmspack/KWAJ/Decompressor.cs | 3 +- libmspack/{ => KWAJ}/kwajd_stream.cs | 0 libmspack/{ => KWAJ}/mskwajd_header.cs | 0 libmspack/{ => LZSS}/lzss.cs | 0 libmspack/{ => LZX}/lzx.cs | 0 libmspack/{ => LZX}/lzxd_stream.cs | 0 libmspack/{ => MSZIP}/mszip.cs | 0 libmspack/{ => MSZIP}/mszipd_stream.cs | 0 libmspack/OAB/Decompressor.cs | 5 ++- libmspack/{ => OAB}/oab.cs | 0 libmspack/{ => OAB}/oabd_file.cs | 0 libmspack/{ => Quantum}/qtm.cs | 0 libmspack/{ => Quantum}/qtmd_model.cs | 0 libmspack/{ => Quantum}/qtmd_modelsym.cs | 0 libmspack/{ => Quantum}/qtmd_stream.cs | 0 libmspack/SZDD/Decompressor.cs | 8 ++--- libmspack/{ => SZDD}/msszddd_header.cs | 0 libmspack/readbits.cs | 4 +-- libmspack/system.cs | 9 +---- 35 files changed, 56 insertions(+), 29 deletions(-) rename libmspack/{ => CAB}/cab.cs (100%) rename libmspack/{ => CAB}/mscabd_cabinet.cs (100%) rename libmspack/{ => CAB}/mscabd_decompress_state.cs (100%) rename libmspack/{ => CAB}/mscabd_file.cs (100%) rename libmspack/{ => CAB}/mscabd_folder.cs (100%) rename libmspack/{ => CAB}/mscabd_folder_data.cs (100%) rename libmspack/{ => CHM}/mschmc_file.cs (100%) rename libmspack/{ => CHM}/mschmd_decompress_state.cs (100%) rename libmspack/{ => CHM}/mschmd_file.cs (100%) rename libmspack/{ => CHM}/mschmd_header.cs (100%) rename libmspack/{ => CHM}/mschmd_sec_mscompressed.cs (100%) rename libmspack/{ => CHM}/mschmd_sec_uncompressed.cs (100%) rename libmspack/{ => CHM}/mschmd_section.cs (100%) create mode 100644 libmspack/FixedArray.cs rename libmspack/{ => KWAJ}/kwajd_stream.cs (100%) rename libmspack/{ => KWAJ}/mskwajd_header.cs (100%) rename libmspack/{ => LZSS}/lzss.cs (100%) rename libmspack/{ => LZX}/lzx.cs (100%) rename libmspack/{ => LZX}/lzxd_stream.cs (100%) rename libmspack/{ => MSZIP}/mszip.cs (100%) rename libmspack/{ => MSZIP}/mszipd_stream.cs (100%) rename libmspack/{ => OAB}/oab.cs (100%) rename libmspack/{ => OAB}/oabd_file.cs (100%) rename libmspack/{ => Quantum}/qtm.cs (100%) rename libmspack/{ => Quantum}/qtmd_model.cs (100%) rename libmspack/{ => Quantum}/qtmd_modelsym.cs (100%) rename libmspack/{ => Quantum}/qtmd_stream.cs (100%) rename libmspack/{ => SZDD}/msszddd_header.cs (100%) diff --git a/libmspack/CAB/CABSystem.cs b/libmspack/CAB/CABSystem.cs index 333c33d..5af446b 100644 --- a/libmspack/CAB/CABSystem.cs +++ b/libmspack/CAB/CABSystem.cs @@ -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 /// - 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 /// - 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; } diff --git a/libmspack/CAB/Decompressor.cs b/libmspack/CAB/Decompressor.cs index 5a506e6..96aba8f 100644 --- a/libmspack/CAB/Decompressor.cs +++ b/libmspack/CAB/Decompressor.cs @@ -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; diff --git a/libmspack/cab.cs b/libmspack/CAB/cab.cs similarity index 100% rename from libmspack/cab.cs rename to libmspack/CAB/cab.cs diff --git a/libmspack/mscabd_cabinet.cs b/libmspack/CAB/mscabd_cabinet.cs similarity index 100% rename from libmspack/mscabd_cabinet.cs rename to libmspack/CAB/mscabd_cabinet.cs diff --git a/libmspack/mscabd_decompress_state.cs b/libmspack/CAB/mscabd_decompress_state.cs similarity index 100% rename from libmspack/mscabd_decompress_state.cs rename to libmspack/CAB/mscabd_decompress_state.cs diff --git a/libmspack/mscabd_file.cs b/libmspack/CAB/mscabd_file.cs similarity index 100% rename from libmspack/mscabd_file.cs rename to libmspack/CAB/mscabd_file.cs diff --git a/libmspack/mscabd_folder.cs b/libmspack/CAB/mscabd_folder.cs similarity index 100% rename from libmspack/mscabd_folder.cs rename to libmspack/CAB/mscabd_folder.cs diff --git a/libmspack/mscabd_folder_data.cs b/libmspack/CAB/mscabd_folder_data.cs similarity index 100% rename from libmspack/mscabd_folder_data.cs rename to libmspack/CAB/mscabd_folder_data.cs diff --git a/libmspack/mschmc_file.cs b/libmspack/CHM/mschmc_file.cs similarity index 100% rename from libmspack/mschmc_file.cs rename to libmspack/CHM/mschmc_file.cs diff --git a/libmspack/mschmd_decompress_state.cs b/libmspack/CHM/mschmd_decompress_state.cs similarity index 100% rename from libmspack/mschmd_decompress_state.cs rename to libmspack/CHM/mschmd_decompress_state.cs diff --git a/libmspack/mschmd_file.cs b/libmspack/CHM/mschmd_file.cs similarity index 100% rename from libmspack/mschmd_file.cs rename to libmspack/CHM/mschmd_file.cs diff --git a/libmspack/mschmd_header.cs b/libmspack/CHM/mschmd_header.cs similarity index 100% rename from libmspack/mschmd_header.cs rename to libmspack/CHM/mschmd_header.cs diff --git a/libmspack/mschmd_sec_mscompressed.cs b/libmspack/CHM/mschmd_sec_mscompressed.cs similarity index 100% rename from libmspack/mschmd_sec_mscompressed.cs rename to libmspack/CHM/mschmd_sec_mscompressed.cs diff --git a/libmspack/mschmd_sec_uncompressed.cs b/libmspack/CHM/mschmd_sec_uncompressed.cs similarity index 100% rename from libmspack/mschmd_sec_uncompressed.cs rename to libmspack/CHM/mschmd_sec_uncompressed.cs diff --git a/libmspack/mschmd_section.cs b/libmspack/CHM/mschmd_section.cs similarity index 100% rename from libmspack/mschmd_section.cs rename to libmspack/CHM/mschmd_section.cs diff --git a/libmspack/FixedArray.cs b/libmspack/FixedArray.cs new file mode 100644 index 0000000..522780e --- /dev/null +++ b/libmspack/FixedArray.cs @@ -0,0 +1,34 @@ +using System; +using System.Runtime.InteropServices; + +namespace SabreTools.Compression.libmspack +{ + public unsafe class FixedArray 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); + } + } +} \ No newline at end of file diff --git a/libmspack/KWAJ/Decompressor.cs b/libmspack/KWAJ/Decompressor.cs index 7142daa..8cf6c4b 100644 --- a/libmspack/KWAJ/Decompressor.cs +++ b/libmspack/KWAJ/Decompressor.cs @@ -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; } diff --git a/libmspack/kwajd_stream.cs b/libmspack/KWAJ/kwajd_stream.cs similarity index 100% rename from libmspack/kwajd_stream.cs rename to libmspack/KWAJ/kwajd_stream.cs diff --git a/libmspack/mskwajd_header.cs b/libmspack/KWAJ/mskwajd_header.cs similarity index 100% rename from libmspack/mskwajd_header.cs rename to libmspack/KWAJ/mskwajd_header.cs diff --git a/libmspack/lzss.cs b/libmspack/LZSS/lzss.cs similarity index 100% rename from libmspack/lzss.cs rename to libmspack/LZSS/lzss.cs diff --git a/libmspack/lzx.cs b/libmspack/LZX/lzx.cs similarity index 100% rename from libmspack/lzx.cs rename to libmspack/LZX/lzx.cs diff --git a/libmspack/lzxd_stream.cs b/libmspack/LZX/lzxd_stream.cs similarity index 100% rename from libmspack/lzxd_stream.cs rename to libmspack/LZX/lzxd_stream.cs diff --git a/libmspack/mszip.cs b/libmspack/MSZIP/mszip.cs similarity index 100% rename from libmspack/mszip.cs rename to libmspack/MSZIP/mszip.cs diff --git a/libmspack/mszipd_stream.cs b/libmspack/MSZIP/mszipd_stream.cs similarity index 100% rename from libmspack/mszipd_stream.cs rename to libmspack/MSZIP/mszipd_stream.cs diff --git a/libmspack/OAB/Decompressor.cs b/libmspack/OAB/Decompressor.cs index 4b32247..8a54dfe 100644 --- a/libmspack/OAB/Decompressor.cs +++ b/libmspack/OAB/Decompressor.cs @@ -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; diff --git a/libmspack/oab.cs b/libmspack/OAB/oab.cs similarity index 100% rename from libmspack/oab.cs rename to libmspack/OAB/oab.cs diff --git a/libmspack/oabd_file.cs b/libmspack/OAB/oabd_file.cs similarity index 100% rename from libmspack/oabd_file.cs rename to libmspack/OAB/oabd_file.cs diff --git a/libmspack/qtm.cs b/libmspack/Quantum/qtm.cs similarity index 100% rename from libmspack/qtm.cs rename to libmspack/Quantum/qtm.cs diff --git a/libmspack/qtmd_model.cs b/libmspack/Quantum/qtmd_model.cs similarity index 100% rename from libmspack/qtmd_model.cs rename to libmspack/Quantum/qtmd_model.cs diff --git a/libmspack/qtmd_modelsym.cs b/libmspack/Quantum/qtmd_modelsym.cs similarity index 100% rename from libmspack/qtmd_modelsym.cs rename to libmspack/Quantum/qtmd_modelsym.cs diff --git a/libmspack/qtmd_stream.cs b/libmspack/Quantum/qtmd_stream.cs similarity index 100% rename from libmspack/qtmd_stream.cs rename to libmspack/Quantum/qtmd_stream.cs diff --git a/libmspack/SZDD/Decompressor.cs b/libmspack/SZDD/Decompressor.cs index f323ab9..23e6976 100644 --- a/libmspack/SZDD/Decompressor.cs +++ b/libmspack/SZDD/Decompressor.cs @@ -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(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; } diff --git a/libmspack/msszddd_header.cs b/libmspack/SZDD/msszddd_header.cs similarity index 100% rename from libmspack/msszddd_header.cs rename to libmspack/SZDD/msszddd_header.cs diff --git a/libmspack/readbits.cs b/libmspack/readbits.cs index a1b0f9e..ce14eba 100644 --- a/libmspack/readbits.cs +++ b/libmspack/readbits.cs @@ -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; diff --git a/libmspack/system.cs b/libmspack/system.cs index 0cb029a..fe39040 100644 --- a/libmspack/system.cs +++ b/libmspack/system.cs @@ -42,14 +42,7 @@ namespace SabreTools.Compression.libmspack public static T* CreateArray(int length) { T[] buf = new T[length]; - return GetArrayPointer(buf); - } - - public static T* GetArrayPointer(T[] arr) - { - var bufRef = __makeref(arr); - var bufPtr = **(System.IntPtr**)&bufRef; - return (T*)bufPtr.ToPointer(); + return &buf[0]; } } } \ No newline at end of file