diff --git a/SabreTools.Serialization/Models/NewExecutable/Constants.cs b/SabreTools.Serialization/Models/NewExecutable/Constants.cs index d74df104..363fad49 100644 --- a/SabreTools.Serialization/Models/NewExecutable/Constants.cs +++ b/SabreTools.Serialization/Models/NewExecutable/Constants.cs @@ -8,4 +8,4 @@ namespace SabreTools.Data.Models.NewExecutable public const ushort SignatureUInt16 = 0x454e; } -} \ No newline at end of file +} diff --git a/SabreTools.Serialization/Models/NewExecutable/Executable.cs b/SabreTools.Serialization/Models/NewExecutable/Executable.cs index e9b35ed5..b10bad1a 100644 --- a/SabreTools.Serialization/Models/NewExecutable/Executable.cs +++ b/SabreTools.Serialization/Models/NewExecutable/Executable.cs @@ -17,51 +17,51 @@ namespace SabreTools.Data.Models.NewExecutable /// /// MS-DOS executable stub /// - public MSDOS.Executable? Stub { get; set; } + public MSDOS.Executable Stub { get; set; } /// /// New Executable header /// - public ExecutableHeader? Header { get; set; } + public ExecutableHeader Header { get; set; } /// /// Segment table /// - public SegmentTableEntry[]? SegmentTable { get; set; } + public SegmentTableEntry[] SegmentTable { get; set; } /// /// Resource table /// - public ResourceTable? ResourceTable { get; set; } + public ResourceTable ResourceTable { get; set; } /// /// Resident-Name table /// - public ResidentNameTableEntry[]? ResidentNameTable { get; set; } + public ResidentNameTableEntry[] ResidentNameTable { get; set; } /// /// Module-Reference table /// - public ModuleReferenceTableEntry[]? ModuleReferenceTable { get; set; } + public ModuleReferenceTableEntry[] ModuleReferenceTable { get; set; } /// /// Imported-Name table /// - public Dictionary? ImportedNameTable { get; set; } + public Dictionary ImportedNameTable { get; set; } /// /// Entry table /// - public EntryTableBundle[]? EntryTable { get; set; } + public EntryTableBundle[] EntryTable { get; set; } /// /// Nonresident-Name table /// - public NonResidentNameTableEntry[]? NonResidentNameTable { get; set; } + public NonResidentNameTableEntry[] NonResidentNameTable { get; set; } /// /// Segment relocation data /// - public PerSegmentData[]? SegmentRelocationData { get; set; } + public PerSegmentData[] SegmentRelocationData { get; set; } } } diff --git a/SabreTools.Serialization/Models/NewExecutable/ExecutableHeader.cs b/SabreTools.Serialization/Models/NewExecutable/ExecutableHeader.cs index 243b775f..cef7d886 100644 --- a/SabreTools.Serialization/Models/NewExecutable/ExecutableHeader.cs +++ b/SabreTools.Serialization/Models/NewExecutable/ExecutableHeader.cs @@ -16,7 +16,7 @@ namespace SabreTools.Data.Models.NewExecutable /// "NE" /// [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)] - public string? Magic; + public string Magic; /// /// Version number of the linker. @@ -90,7 +90,7 @@ namespace SabreTools.Data.Models.NewExecutable /// /// /// SS:SP initial stack pointer, SS is index into segment table - /// + /// /// If SS equals the automatic data segment and SP equals /// zero, the stack pointer is set to the top of the /// automatic data segment just below the additional heap diff --git a/SabreTools.Serialization/Models/NewExecutable/PerSegmentData.cs b/SabreTools.Serialization/Models/NewExecutable/PerSegmentData.cs index c33b1a3e..b938b93a 100644 --- a/SabreTools.Serialization/Models/NewExecutable/PerSegmentData.cs +++ b/SabreTools.Serialization/Models/NewExecutable/PerSegmentData.cs @@ -11,7 +11,7 @@ /// To find the relocation data for a segment, seek to: /// /// * (1 << ) - /// + + /// + /// /// /// @@ -25,6 +25,6 @@ /// /// A table of relocation records follows. /// - public RelocationRecord[]? RelocationRecords { get; set; } + public RelocationRecord[] RelocationRecords { get; set; } } } diff --git a/SabreTools.Serialization/Models/NewExecutable/RelocationRecord.cs b/SabreTools.Serialization/Models/NewExecutable/RelocationRecord.cs index 9fa84430..fc064f1c 100644 --- a/SabreTools.Serialization/Models/NewExecutable/RelocationRecord.cs +++ b/SabreTools.Serialization/Models/NewExecutable/RelocationRecord.cs @@ -14,7 +14,7 @@ /// /// Flags byte. - /// + /// /// The target value has four types that are defined in the flag /// byte field. /// diff --git a/SabreTools.Serialization/Models/NewExecutable/ResourceTable.cs b/SabreTools.Serialization/Models/NewExecutable/ResourceTable.cs index ae8cdcd3..9b99bb9b 100644 --- a/SabreTools.Serialization/Models/NewExecutable/ResourceTable.cs +++ b/SabreTools.Serialization/Models/NewExecutable/ResourceTable.cs @@ -23,12 +23,12 @@ namespace SabreTools.Data.Models.NewExecutable /// /// A table of resource type information blocks follows. /// - public ResourceTypeInformationEntry[]? ResourceTypes { get; set; } + public ResourceTypeInformationEntry[] ResourceTypes { get; set; } /// /// Resource type and name strings are stored at the end of the /// resource table. /// - public Dictionary? TypeAndNameStrings { get; set; } + public Dictionary TypeAndNameStrings { get; set; } } } diff --git a/SabreTools.Serialization/Models/NewExecutable/ResourceTypeInformationEntry.cs b/SabreTools.Serialization/Models/NewExecutable/ResourceTypeInformationEntry.cs index bda2f278..63b21e5a 100644 --- a/SabreTools.Serialization/Models/NewExecutable/ResourceTypeInformationEntry.cs +++ b/SabreTools.Serialization/Models/NewExecutable/ResourceTypeInformationEntry.cs @@ -29,6 +29,6 @@ /// /// A table of resources for this type follows. /// - public ResourceTypeResourceEntry[]? Resources { get; set; } + public ResourceTypeResourceEntry[] Resources { get; set; } } } diff --git a/SabreTools.Serialization/Readers/NewExecutable.cs b/SabreTools.Serialization/Readers/NewExecutable.cs index 19e430bb..6addd53d 100644 --- a/SabreTools.Serialization/Readers/NewExecutable.cs +++ b/SabreTools.Serialization/Readers/NewExecutable.cs @@ -549,7 +549,7 @@ namespace SabreTools.Serialization.Readers stringOffsets.Add(rtie.TypeID); // Handle types with resources - foreach (var rtre in rtie.Resources ?? []) + foreach (var rtre in rtie.Resources) { // Skip invalid entries if (rtre == null || rtre.IsIntegerType() || rtre.ResourceID == 0) diff --git a/SabreTools.Serialization/Wrappers/NewExecutable.Printing.cs b/SabreTools.Serialization/Wrappers/NewExecutable.Printing.cs index f1a5b155..01a8bd28 100644 --- a/SabreTools.Serialization/Wrappers/NewExecutable.Printing.cs +++ b/SabreTools.Serialization/Wrappers/NewExecutable.Printing.cs @@ -20,7 +20,7 @@ namespace SabreTools.Serialization.Wrappers builder.AppendLine(); // Stub - Print(builder, Model.Stub?.Header); + Print(builder, Model.Stub.Header); // Header Print(builder, Model.Header); @@ -29,23 +29,16 @@ namespace SabreTools.Serialization.Wrappers Print(builder, Model.SegmentTable); Print(builder, Model.ResourceTable); Print(builder, Model.ResidentNameTable); - Print(builder, Model.ModuleReferenceTable, Model.Stub?.Header, Model.Header); + Print(builder, Model.ModuleReferenceTable, Model.Stub.Header, Model.Header); Print(builder, Model.ImportedNameTable); Print(builder, Model.EntryTable); Print(builder, Model.NonResidentNameTable); } - private static void Print(StringBuilder builder, Data.Models.MSDOS.ExecutableHeader? header) + private static void Print(StringBuilder builder, Data.Models.MSDOS.ExecutableHeader header) { builder.AppendLine(" MS-DOS Stub Header Information:"); builder.AppendLine(" -------------------------"); - if (header == null) - { - builder.AppendLine(" No MS-DOS stub header"); - builder.AppendLine(); - return; - } - builder.AppendLine(header.Magic, " Magic number"); builder.AppendLine(header.LastPageBytes, " Last page bytes"); builder.AppendLine(header.Pages, " Pages"); @@ -72,17 +65,10 @@ namespace SabreTools.Serialization.Wrappers builder.AppendLine(); } - private static void Print(StringBuilder builder, ExecutableHeader? header) + private static void Print(StringBuilder builder, ExecutableHeader header) { builder.AppendLine(" Header Information:"); builder.AppendLine(" -------------------------"); - if (header == null) - { - builder.AppendLine(" No header"); - builder.AppendLine(); - return; - } - builder.AppendLine(header.Magic, " Magic number"); builder.AppendLine(header.LinkerVersion, " Linker version"); builder.AppendLine(header.LinkerRevision, " Linker revision"); @@ -117,11 +103,11 @@ namespace SabreTools.Serialization.Wrappers builder.AppendLine(); } - private static void Print(StringBuilder builder, SegmentTableEntry[]? entries) + private static void Print(StringBuilder builder, SegmentTableEntry[] entries) { builder.AppendLine(" Segment Table Information:"); builder.AppendLine(" -------------------------"); - if (entries == null || entries.Length == 0) + if (entries.Length == 0) { builder.AppendLine(" No segment table items"); builder.AppendLine(); @@ -142,19 +128,12 @@ namespace SabreTools.Serialization.Wrappers builder.AppendLine(); } - private static void Print(StringBuilder builder, ResourceTable? table) + private static void Print(StringBuilder builder, ResourceTable table) { builder.AppendLine(" Resource Table Information:"); builder.AppendLine(" -------------------------"); - if (table == null) - { - builder.AppendLine(" No resource table"); - builder.AppendLine(); - return; - } - builder.AppendLine(table.AlignmentShiftCount, " Alignment shift count"); - if (table.ResourceTypes == null || table.ResourceTypes.Length == 0) + if (table.ResourceTypes.Length == 0) { builder.AppendLine(" No resource table items"); } @@ -170,7 +149,7 @@ namespace SabreTools.Serialization.Wrappers builder.AppendLine(entry.ResourceCount, " Resource count"); builder.AppendLine(entry.Reserved, " Reserved"); builder.AppendLine(" Resources = "); - if (entry.ResourceCount == 0 || entry.Resources == null || entry.Resources.Length == 0) + if (entry.ResourceCount == 0 || entry.Resources.Length == 0) { builder.AppendLine(" No resource items"); } @@ -197,7 +176,7 @@ namespace SabreTools.Serialization.Wrappers } } - if (table.TypeAndNameStrings == null || table.TypeAndNameStrings.Count == 0) + if (table.TypeAndNameStrings.Count == 0) { builder.AppendLine(" No resource table type/name strings"); } @@ -220,11 +199,11 @@ namespace SabreTools.Serialization.Wrappers builder.AppendLine(); } - private static void Print(StringBuilder builder, ResidentNameTableEntry[]? entries) + private static void Print(StringBuilder builder, ResidentNameTableEntry[] entries) { builder.AppendLine(" Resident-Name Table Information:"); builder.AppendLine(" -------------------------"); - if (entries == null || entries.Length == 0) + if (entries.Length == 0) { builder.AppendLine(" No resident-name table items"); builder.AppendLine(); @@ -244,11 +223,11 @@ namespace SabreTools.Serialization.Wrappers builder.AppendLine(); } - private static void Print(StringBuilder builder, ModuleReferenceTableEntry[]? entries, Data.Models.MSDOS.ExecutableHeader? stub, ExecutableHeader? header) + private static void Print(StringBuilder builder, ModuleReferenceTableEntry[] entries, Data.Models.MSDOS.ExecutableHeader stub, ExecutableHeader header) { builder.AppendLine(" Module-Reference Table Information:"); builder.AppendLine(" -------------------------"); - if (entries == null || entries.Length == 0) + if (entries.Length == 0) { builder.AppendLine(" No module-reference table items"); builder.AppendLine(); @@ -261,17 +240,17 @@ namespace SabreTools.Serialization.Wrappers var entry = entries[i]; builder.AppendLine($" Module-Reference Table Entry {i}"); - builder.AppendLine($" Offset: {entry.Offset} (adjusted to be {entry.Offset + (stub?.NewExeHeaderAddr ?? 0) + (header?.ImportedNamesTableOffset ?? 0)})"); + builder.AppendLine($" Offset: {entry.Offset} (adjusted to be {entry.Offset + stub.NewExeHeaderAddr + header.ImportedNamesTableOffset})"); } builder.AppendLine(); } - private static void Print(StringBuilder builder, Dictionary? entries) + private static void Print(StringBuilder builder, Dictionary entries) { builder.AppendLine(" Imported-Name Table Information:"); builder.AppendLine(" -------------------------"); - if (entries == null || entries.Count == 0) + if (entries.Count == 0) { builder.AppendLine(" No imported-name table items"); builder.AppendLine(); @@ -288,11 +267,11 @@ namespace SabreTools.Serialization.Wrappers builder.AppendLine(); } - private static void Print(StringBuilder builder, EntryTableBundle[]? entries) + private static void Print(StringBuilder builder, EntryTableBundle[] entries) { builder.AppendLine(" Entry Table Information:"); builder.AppendLine(" -------------------------"); - if (entries == null || entries.Length == 0) + if (entries.Length == 0) { builder.AppendLine(" No entry table items"); builder.AppendLine(); @@ -324,11 +303,11 @@ namespace SabreTools.Serialization.Wrappers builder.AppendLine(); } - private static void Print(StringBuilder builder, NonResidentNameTableEntry[]? entries) + private static void Print(StringBuilder builder, NonResidentNameTableEntry[] entries) { builder.AppendLine(" Nonresident-Name Table Information:"); builder.AppendLine(" -------------------------"); - if (entries == null || entries.Length == 0) + if (entries.Length == 0) { builder.AppendLine(" No nonresident-name table items"); builder.AppendLine(); diff --git a/SabreTools.Serialization/Wrappers/NewExecutable.cs b/SabreTools.Serialization/Wrappers/NewExecutable.cs index 17bdb3aa..7043d48f 100644 --- a/SabreTools.Serialization/Wrappers/NewExecutable.cs +++ b/SabreTools.Serialization/Wrappers/NewExecutable.cs @@ -18,13 +18,13 @@ namespace SabreTools.Serialization.Wrappers #region Extension Properties /// - public ExecutableHeader? Header => Model.Header; + public ExecutableHeader Header => Model.Header; /// - public Dictionary? ImportedNameTable => Model.ImportedNameTable; + public Dictionary ImportedNameTable => Model.ImportedNameTable; /// - public NonResidentNameTableEntry[]? NonResidentNameTable => Model.NonResidentNameTable; + public NonResidentNameTableEntry[] NonResidentNameTable => Model.NonResidentNameTable; /// /// Address of the overlay, if it exists @@ -48,13 +48,6 @@ namespace SabreTools.Serialization.Wrappers return _overlayAddress.Value; } - // If a required property is missing - if (Header == null || SegmentTable == null || ResourceTable?.ResourceTypes == null) - { - _overlayAddress = -1; - return _overlayAddress.Value; - } - // Search through the segments table to find the furthest long endOfSectionData = -1; foreach (var entry in SegmentTable) @@ -86,7 +79,7 @@ namespace SabreTools.Serialization.Wrappers foreach (var entry in ResourceTable.ResourceTypes) { // Skip invalid entries - if (entry.ResourceCount == 0 || entry.Resources == null || entry.Resources.Length == 0) + if (entry.ResourceCount == 0 || entry.Resources.Length == 0) continue; foreach (var resource in entry.Resources) @@ -184,13 +177,6 @@ namespace SabreTools.Serialization.Wrappers return _overlaySize; } - // If a required property is missing - if (Header == null || SegmentTable == null || ResourceTable?.ResourceTypes == null) - { - _overlaySize = 0; - return _overlaySize; - } - // Get the overlay address if possible long endOfSectionData = OverlayAddress; @@ -252,16 +238,16 @@ namespace SabreTools.Serialization.Wrappers } /// - public ResidentNameTableEntry[]? ResidentNameTable => Model.ResidentNameTable; + public ResidentNameTableEntry[] ResidentNameTable => Model.ResidentNameTable; /// - public ResourceTable? ResourceTable => Model.ResourceTable; + public ResourceTable ResourceTable => Model.ResourceTable; /// - public SegmentTableEntry[]? SegmentTable => Model.SegmentTable; + public SegmentTableEntry[] SegmentTable => Model.SegmentTable; /// - public Data.Models.MSDOS.Executable? Stub => Model.Stub; + public Data.Models.MSDOS.Executable Stub => Model.Stub; /// /// Stub executable data, if it exists @@ -276,12 +262,6 @@ namespace SabreTools.Serialization.Wrappers if (_stubExecutableData != null) return _stubExecutableData; - if (Stub?.Header?.NewExeHeaderAddr == null) - { - _stubExecutableData = []; - return _stubExecutableData; - } - // Populate the raw stub executable data based on the source int endOfStubHeader = 0x40; int lengthOfStubExecutableData = (int)Stub.Header.NewExeHeaderAddr - endOfStubHeader; @@ -472,24 +452,20 @@ namespace SabreTools.Serialization.Wrappers /// Resource on success, null otherwise public ResourceTypeResourceEntry? GetResource(int id) { - // If the header is invalid - if (Header == null) - return null; - // Get the available source length, if possible long dataLength = Length; if (dataLength == -1) return null; // If the resource table is invalid - if (ResourceTable?.ResourceTypes == null || ResourceTable.ResourceTypes.Length == 0) + if (ResourceTable.ResourceTypes.Length == 0) return null; // Loop through the resources to find a matching ID foreach (var resourceType in ResourceTable.ResourceTypes) { // Skip invalid resource types - if (resourceType.ResourceCount == 0 || resourceType.Resources == null || resourceType.Resources.Length == 0) + if (resourceType.ResourceCount == 0 || resourceType.Resources.Length == 0) continue; // Loop through the entries to find a matching ID @@ -559,10 +535,6 @@ namespace SabreTools.Serialization.Wrappers if (dataLength == -1) return -1; - // If the resource table is invalid - if (ResourceTable == null) - return -1; - // Get the matching resource var resource = GetSegment(id); if (resource == null) @@ -589,7 +561,7 @@ namespace SabreTools.Serialization.Wrappers public SegmentTableEntry? GetSegment(int index) { // If the segment table is invalid - if (SegmentTable == null || SegmentTable.Length == 0) + if (SegmentTable.Length == 0) return null; // If the index is invalid @@ -646,10 +618,6 @@ namespace SabreTools.Serialization.Wrappers /// Segment offset on success, -1 otherwise public int GetSegmentOffset(int index) { - // If the header is invalid - if (Header == null) - return -1; - // Get the available source length, if possible long dataLength = Length; if (dataLength == -1)