diff --git a/SabreTools.Library/DatFiles/ClrMamePro.cs b/SabreTools.Library/DatFiles/ClrMamePro.cs index 8cc73d3e..2bbe7c87 100644 --- a/SabreTools.Library/DatFiles/ClrMamePro.cs +++ b/SabreTools.Library/DatFiles/ClrMamePro.cs @@ -286,12 +286,7 @@ namespace SabreTools.Library.DatFiles case "size": if (item.ItemType == ItemType.Rom) - { - if (Int64.TryParse(attrVal, out long size)) - (item as Rom).Size = size; - else - (item as Rom).Size = -1; - } + (item as Rom).Size = Sanitizer.CleanLong(attrVal); break; case "crc": @@ -660,7 +655,7 @@ namespace SabreTools.Library.DatFiles var rom = datItem as Rom; cmpw.WriteStartElement("rom"); cmpw.WriteRequiredAttributeString("name", rom.Name); - if (rom.Size != -1) cmpw.WriteAttributeString("size", rom.Size.ToString()); + cmpw.WriteOptionalAttributeString("size", rom.Size?.ToString()); cmpw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant()); cmpw.WriteOptionalAttributeString("md5", rom.MD5?.ToLowerInvariant()); #if NET_FRAMEWORK diff --git a/SabreTools.Library/DatFiles/DatFile.cs b/SabreTools.Library/DatFiles/DatFile.cs index 76f8cf78..74de6a46 100644 --- a/SabreTools.Library/DatFiles/DatFile.cs +++ b/SabreTools.Library/DatFiles/DatFile.cs @@ -1876,7 +1876,7 @@ namespace SabreTools.Library.DatFiles Rom rom = item as Rom; // If we have the case where there is SHA-1 and nothing else, we don't fill in any other part of the data - if (rom.Size == -1 + if (rom.Size == null && string.IsNullOrWhiteSpace(rom.CRC) && string.IsNullOrWhiteSpace(rom.MD5) #if NET_FRAMEWORK @@ -1892,7 +1892,7 @@ namespace SabreTools.Library.DatFiles } // If we have a rom and it's missing size AND the hashes match a 0-byte file, fill in the rest of the info - else if ((rom.Size == 0 || rom.Size == -1) + else if ((rom.Size == 0 || rom.Size == null) && ((rom.CRC == Constants.CRCZero || string.IsNullOrWhiteSpace(rom.CRC)) || rom.MD5 == Constants.MD5Zero #if NET_FRAMEWORK @@ -1917,7 +1917,7 @@ namespace SabreTools.Library.DatFiles } // If the file has no size and it's not the above case, skip and log - else if (rom.ItemStatus != ItemStatus.Nodump && (rom.Size == 0 || rom.Size == -1)) + else if (rom.ItemStatus != ItemStatus.Nodump && (rom.Size == 0 || rom.Size == null)) { Globals.Logger.Verbose($"{Header.FileName}: Incomplete entry for '{rom.Name}' will be output as nodump"); rom.ItemStatus = ItemStatus.Nodump; @@ -1925,6 +1925,7 @@ namespace SabreTools.Library.DatFiles // If the file has a size but aboslutely no hashes, skip and log else if (rom.ItemStatus != ItemStatus.Nodump + && rom.Size != null && rom.Size > 0 && string.IsNullOrWhiteSpace(rom.CRC) && string.IsNullOrWhiteSpace(rom.MD5) @@ -3360,6 +3361,10 @@ namespace SabreTools.Library.DatFiles if (item.ItemType != ItemType.Rom) lessThan.Items.Add(key, item); + // If the file is a Rom and has no size, put it in the "lesser" dat + else if (item.ItemType == ItemType.Rom && (item as Rom).Size == null) + lessThan.Items.Add(key, item); + // If the file is a Rom and less than the radix, put it in the "lesser" dat else if (item.ItemType == ItemType.Rom && (item as Rom).Size < radix) lessThan.Items.Add(key, item); @@ -3557,7 +3562,7 @@ namespace SabreTools.Library.DatFiles sha256 = (item as Rom).SHA256 ?? string.Empty; sha384 = (item as Rom).SHA384 ?? string.Empty; sha512 = (item as Rom).SHA512 ?? string.Empty; - size = (item as Rom).Size.ToString(); + size = (item as Rom).Size?.ToString() ?? string.Empty; spamsum = (item as Rom).SpamSum ?? string.Empty; } @@ -3690,7 +3695,7 @@ namespace SabreTools.Library.DatFiles Rom rom = datItem as Rom; // If the Rom has "null" characteristics, ensure all fields - if (rom.Size == -1 && rom.CRC == "null") + if (rom.Size == null && rom.CRC == "null") { Globals.Logger.Verbose($"Empty folder found: {datItem.Machine.Name}"); @@ -3732,7 +3737,7 @@ namespace SabreTools.Library.DatFiles Rom rom = datItem as Rom; // If we have a 0-size or blank rom, then we ignore - if (rom.Size == 0 || rom.Size == -1) + if (rom.Size == 0 || rom.Size == null) return true; } diff --git a/SabreTools.Library/DatFiles/DosCenter.cs b/SabreTools.Library/DatFiles/DosCenter.cs index 0dee0f2d..ceab1ff1 100644 --- a/SabreTools.Library/DatFiles/DosCenter.cs +++ b/SabreTools.Library/DatFiles/DosCenter.cs @@ -7,6 +7,7 @@ using System.Text; using SabreTools.Library.Data; using SabreTools.Library.DatItems; using SabreTools.Library.IO; +using SabreTools.Library.Tools; namespace SabreTools.Library.DatFiles { @@ -209,11 +210,7 @@ namespace SabreTools.Library.DatFiles break; case "size": - if (Int64.TryParse(attrVal, out long size)) - item.Size = size; - else - item.Size = -1; - + item.Size = Sanitizer.CleanLong(attrVal); break; case "crc": @@ -435,7 +432,7 @@ namespace SabreTools.Library.DatFiles var rom = datItem as Rom; cmpw.WriteStartElement("file"); cmpw.WriteRequiredAttributeString("name", rom.Name); - if (rom.Size != -1) cmpw.WriteAttributeString("size", rom.Size.ToString()); + cmpw.WriteOptionalAttributeString("size", rom.Size?.ToString()); cmpw.WriteOptionalAttributeString("date", rom.Date); cmpw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant()); cmpw.WriteEndElement(); diff --git a/SabreTools.Library/DatFiles/EverdriveSmdb.cs b/SabreTools.Library/DatFiles/EverdriveSmdb.cs index 26766754..d45108ca 100644 --- a/SabreTools.Library/DatFiles/EverdriveSmdb.cs +++ b/SabreTools.Library/DatFiles/EverdriveSmdb.cs @@ -55,7 +55,7 @@ namespace SabreTools.Library.DatFiles Rom rom = new Rom { Name = gameinfo[1].Substring(fullname[0].Length + 1), - Size = -1, // No size provided, but we don't want the size being 0 + Size = null, // No size provided, but we don't want the size being 0 CRC = gameinfo[4], MD5 = gameinfo[3], SHA1 = gameinfo[2], diff --git a/SabreTools.Library/DatFiles/Hashfile.cs b/SabreTools.Library/DatFiles/Hashfile.cs index b9d6381f..2f72ba80 100644 --- a/SabreTools.Library/DatFiles/Hashfile.cs +++ b/SabreTools.Library/DatFiles/Hashfile.cs @@ -65,7 +65,7 @@ namespace SabreTools.Library.DatFiles Rom rom = new Rom { Name = name, - Size = -1, + Size = null, CRC = (_hash.HasFlag(Hash.CRC) ? hash : null), MD5 = (_hash.HasFlag(Hash.MD5) ? hash : null), #if NET_FRAMEWORK diff --git a/SabreTools.Library/DatFiles/ItemDictionary.cs b/SabreTools.Library/DatFiles/ItemDictionary.cs index 06ca13eb..0786bdf4 100644 --- a/SabreTools.Library/DatFiles/ItemDictionary.cs +++ b/SabreTools.Library/DatFiles/ItemDictionary.cs @@ -679,7 +679,7 @@ namespace SabreTools.Library.DatFiles RomCount++; if ((item as Rom).ItemStatus != ItemStatus.Nodump) { - TotalSize += (item as Rom).Size; + TotalSize += (item as Rom).Size ?? 0; CRCCount += (string.IsNullOrWhiteSpace((item as Rom).CRC) ? 0 : 1); MD5Count += (string.IsNullOrWhiteSpace((item as Rom).MD5) ? 0 : 1); #if NET_FRAMEWORK @@ -875,7 +875,7 @@ namespace SabreTools.Library.DatFiles RomCount--; if ((item as Rom).ItemStatus != ItemStatus.Nodump) { - TotalSize -= (item as Rom).Size; + TotalSize -= (item as Rom).Size ?? 0; CRCCount -= (string.IsNullOrWhiteSpace((item as Rom).CRC) ? 0 : 1); MD5Count -= (string.IsNullOrWhiteSpace((item as Rom).MD5) ? 0 : 1); #if NET_FRAMEWORK diff --git a/SabreTools.Library/DatFiles/Listrom.cs b/SabreTools.Library/DatFiles/Listrom.cs index 6646d19a..5f8d0cc7 100644 --- a/SabreTools.Library/DatFiles/Listrom.cs +++ b/SabreTools.Library/DatFiles/Listrom.cs @@ -146,13 +146,10 @@ namespace SabreTools.Library.DatFiles // Standard ROMs have 4 pieces (name, size, crc, sha1) else if (split.Length == 3) { - if (!Int64.TryParse(split[0], out long size)) - size = 0; - Rom rom = new Rom() { Name = romname, - Size = size, + Size = Sanitizer.CleanLong(split[0]), CRC = Sanitizer.CleanListromHashData(split[1]), SHA1 = Sanitizer.CleanListromHashData(split[2]), @@ -197,13 +194,10 @@ namespace SabreTools.Library.DatFiles // Baddump ROMs have 6 pieces (name, size, BAD, crc, sha1, BAD_DUMP) else if (split.Length == 5 && line.EndsWith("BAD_DUMP")) { - if (!Int64.TryParse(split[0], out long size)) - size = 0; - Rom rom = new Rom() { Name = romname, - Size = size, + Size = Sanitizer.CleanLong(split[0]), CRC = Sanitizer.CleanListromHashData(split[2]), SHA1 = Sanitizer.CleanListromHashData(split[3]), ItemStatus = ItemStatus.BadDump, @@ -226,13 +220,10 @@ namespace SabreTools.Library.DatFiles // Nodump ROMs have 6 pieces (name, size, NO, GOOD, DUMP, KNOWN) else if (split.Length == 5 && line.EndsWith("NO GOOD DUMP KNOWN")) { - if (!Int64.TryParse(split[0], out long size)) - size = 0; - Rom rom = new Rom() { Name = romname, - Size = size, + Size = Sanitizer.CleanLong(split[0]), ItemStatus = ItemStatus.Nodump, Machine = new Machine @@ -429,13 +420,13 @@ namespace SabreTools.Library.DatFiles // The name is padded out to a particular length if (rom.Name.Length < 43) - sw.Write(rom.Name.PadRight(43 - rom.Size.ToString().Length, ' ')); + sw.Write(rom.Name.PadRight(43 - rom.Size?.ToString().Length ?? 0, ' ')); else sw.Write($"{rom.Name} "); // If we don't have a nodump, write out the size if (rom.ItemStatus != ItemStatus.Nodump) - sw.Write(rom.Size); + sw.Write(rom.Size?.ToString() ?? string.Empty); // If we have a baddump, put the first indicator if (rom.ItemStatus == ItemStatus.BadDump) diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs index 7d3dd8b6..e0defb1c 100644 --- a/SabreTools.Library/DatFiles/Listxml.cs +++ b/SabreTools.Library/DatFiles/Listxml.cs @@ -212,6 +212,7 @@ namespace SabreTools.Library.DatFiles Name = reader.GetAttribute("name"), Tag = reader.GetAttribute("tag"), ChipType = reader.GetAttribute("type").AsChipType(), + Clock = Sanitizer.CleanLong(reader.GetAttribute("clock")), Source = new Source { @@ -220,13 +221,6 @@ namespace SabreTools.Library.DatFiles }, }; - // Set the clock - if (reader.GetAttribute("clock") != null) - { - if (Int64.TryParse(reader.GetAttribute("clock"), out long clock)) - chip.Clock = clock; - } - datItems.Add(chip); reader.Read(); @@ -369,7 +363,17 @@ namespace SabreTools.Library.DatFiles { Tag = reader.GetAttribute("tag"), DisplayType = reader.GetAttribute("type").AsDisplayType(), + Rotate = Sanitizer.CleanLong(reader.GetAttribute("rotate")), FlipX = reader.GetAttribute("flipx").AsYesNo(), + Width = Sanitizer.CleanLong(reader.GetAttribute("width")), + Height = Sanitizer.CleanLong(reader.GetAttribute("height")), + PixClock = Sanitizer.CleanLong(reader.GetAttribute("pixclock")), + HTotal = Sanitizer.CleanLong(reader.GetAttribute("htotal")), + HBEnd = Sanitizer.CleanLong(reader.GetAttribute("hbend")), + HBStart = Sanitizer.CleanLong(reader.GetAttribute("hbstart")), + VTotal = Sanitizer.CleanLong(reader.GetAttribute("vtotal")), + VBEnd = Sanitizer.CleanLong(reader.GetAttribute("vbend")), + VBStart = Sanitizer.CleanLong(reader.GetAttribute("vbstart")), Source = new Source { @@ -378,27 +382,6 @@ namespace SabreTools.Library.DatFiles }, }; - // Set the rotation - if (reader.GetAttribute("rotate") != null) - { - if (Int64.TryParse(reader.GetAttribute("rotate"), out long rotate)) - display.Rotate = rotate; - } - - // Set the width - if (reader.GetAttribute("width") != null) - { - if (Int64.TryParse(reader.GetAttribute("width"), out long width)) - display.Width = width; - } - - // Set the height - if (reader.GetAttribute("height") != null) - { - if (Int64.TryParse(reader.GetAttribute("height"), out long height)) - display.Height = height; - } - // Set the refresh if (reader.GetAttribute("refresh") != null) { @@ -406,55 +389,6 @@ namespace SabreTools.Library.DatFiles display.Refresh = refresh; } - // Set the pixclock - if (reader.GetAttribute("pixclock") != null) - { - if (Int64.TryParse(reader.GetAttribute("pixclock"), out long pixclock)) - display.PixClock = pixclock; - } - - // Set the htotal - if (reader.GetAttribute("htotal") != null) - { - if (Int64.TryParse(reader.GetAttribute("htotal"), out long htotal)) - display.HTotal = htotal; - } - - // Set the hbend - if (reader.GetAttribute("hbend") != null) - { - if (Int64.TryParse(reader.GetAttribute("hbend"), out long hbend)) - display.HBEnd = hbend; - } - - // Set the hbstart - if (reader.GetAttribute("hbstart") != null) - { - if (Int64.TryParse(reader.GetAttribute("hbstart"), out long hbstart)) - display.HBStart = hbstart; - } - - // Set the vtotal - if (reader.GetAttribute("vtotal") != null) - { - if (Int64.TryParse(reader.GetAttribute("vtotal"), out long vtotal)) - display.VTotal = vtotal; - } - - // Set the vbend - if (reader.GetAttribute("vbend") != null) - { - if (Int64.TryParse(reader.GetAttribute("vbend"), out long vbend)) - display.VBEnd = vbend; - } - - // Set the vbstart - if (reader.GetAttribute("vbstart") != null) - { - if (Int64.TryParse(reader.GetAttribute("vbstart"), out long vbstart)) - display.VBStart = vbstart; - } - datItems.Add(display); reader.Read(); @@ -500,6 +434,8 @@ namespace SabreTools.Library.DatFiles { Service = reader.GetAttribute("service").AsYesNo(), Tilt = reader.GetAttribute("tilt").AsYesNo(), + Players = Sanitizer.CleanLong(reader.GetAttribute("players")), + Coins = Sanitizer.CleanLong(reader.GetAttribute("coins")), Source = new Source { @@ -508,20 +444,6 @@ namespace SabreTools.Library.DatFiles }, }; - // Set the players count - if (reader.GetAttribute("players") != null) - { - if (Int64.TryParse(reader.GetAttribute("players"), out long players)) - input.Players = players; - } - - // Set the coins count - if (reader.GetAttribute("coins") != null) - { - if (Int64.TryParse(reader.GetAttribute("coins"), out long coins)) - input.Coins = coins; - } - // Now read the internal tags ReadInput(reader.ReadSubtree(), input); @@ -573,7 +495,7 @@ namespace SabreTools.Library.DatFiles { Name = reader.GetAttribute("name"), Bios = reader.GetAttribute("bios"), - Size = Sanitizer.CleanSize(reader.GetAttribute("size")), + Size = Sanitizer.CleanLong(reader.GetAttribute("size")), CRC = reader.GetAttribute("crc"), SHA1 = reader.GetAttribute("sha1"), MergeTag = reader.GetAttribute("merge"), @@ -649,6 +571,8 @@ namespace SabreTools.Library.DatFiles case "sound": var sound = new Sound { + Channels = Sanitizer.CleanLong(reader.GetAttribute("channels")), + Source = new Source { Index = indexId, @@ -656,13 +580,6 @@ namespace SabreTools.Library.DatFiles }, }; - // Set the channels - if (reader.GetAttribute("channels") != null) - { - if (Int64.TryParse(reader.GetAttribute("channels"), out long channels)) - sound.Channels = channels; - } - datItems.Add(sound); reader.Read(); @@ -1738,7 +1655,7 @@ namespace SabreTools.Library.DatFiles var rom = datItem as Rom; xtw.WriteStartElement("rom"); xtw.WriteRequiredAttributeString("name", rom.Name); - if (rom.Size != -1) xtw.WriteAttributeString("size", rom.Size.ToString()); + xtw.WriteOptionalAttributeString("size", rom.Size?.ToString()); xtw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant()); xtw.WriteOptionalAttributeString("sha1", rom.SHA1?.ToLowerInvariant()); xtw.WriteOptionalAttributeString("bios", rom.Bios); diff --git a/SabreTools.Library/DatFiles/Logiqx.cs b/SabreTools.Library/DatFiles/Logiqx.cs index 0f4515b5..8fa49adc 100644 --- a/SabreTools.Library/DatFiles/Logiqx.cs +++ b/SabreTools.Library/DatFiles/Logiqx.cs @@ -489,7 +489,7 @@ namespace SabreTools.Library.DatFiles DatItem rom = new Rom { Name = reader.GetAttribute("name"), - Size = Sanitizer.CleanSize(reader.GetAttribute("size")), + Size = Sanitizer.CleanLong(reader.GetAttribute("size")), CRC = reader.GetAttribute("crc"), MD5 = reader.GetAttribute("md5"), #if NET_FRAMEWORK @@ -991,7 +991,7 @@ namespace SabreTools.Library.DatFiles var rom = datItem as Rom; xtw.WriteStartElement("rom"); xtw.WriteRequiredAttributeString("name", rom.Name); - if (rom.Size != -1) xtw.WriteAttributeString("size", rom.Size.ToString()); + xtw.WriteAttributeString("size", rom.Size?.ToString()); xtw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant()); xtw.WriteOptionalAttributeString("md5", rom.MD5?.ToLowerInvariant()); #if NET_FRAMEWORK diff --git a/SabreTools.Library/DatFiles/OfflineList.cs b/SabreTools.Library/DatFiles/OfflineList.cs index b1538da3..8e14cc28 100644 --- a/SabreTools.Library/DatFiles/OfflineList.cs +++ b/SabreTools.Library/DatFiles/OfflineList.cs @@ -874,7 +874,7 @@ namespace SabreTools.Library.DatFiles if (datItem.ItemType == ItemType.Rom) { var rom = datItem as Rom; - xtw.WriteRequiredElementString("romSize", rom.Size.ToString()); + xtw.WriteRequiredElementString("romSize", rom.Size?.ToString()); } xtw.WriteRequiredElementString("publisher", datItem.Machine.Publisher); diff --git a/SabreTools.Library/DatFiles/OpenMSX.cs b/SabreTools.Library/DatFiles/OpenMSX.cs index a8e6fd81..d821eaf6 100644 --- a/SabreTools.Library/DatFiles/OpenMSX.cs +++ b/SabreTools.Library/DatFiles/OpenMSX.cs @@ -329,7 +329,7 @@ namespace SabreTools.Library.DatFiles { Name = machine.Name + "_" + diskno + (!string.IsNullOrWhiteSpace(remark) ? " " + remark : string.Empty), Offset = offset, - Size = -1, + Size = null, SHA1 = hash, Source = new Source @@ -411,7 +411,7 @@ namespace SabreTools.Library.DatFiles { Name = machine.Name + "_" + diskno + (!string.IsNullOrWhiteSpace(remark) ? " " + remark : string.Empty), Offset = offset, - Size = -1, + Size = null, SHA1 = hash, Source = new Source @@ -487,7 +487,7 @@ namespace SabreTools.Library.DatFiles return new Rom { Name = machine.Name + "_" + diskno + (!string.IsNullOrWhiteSpace(remark) ? " " + remark : string.Empty), - Size = -1, + Size = null, SHA1 = hash, Source = new Source diff --git a/SabreTools.Library/DatFiles/RomCenter.cs b/SabreTools.Library/DatFiles/RomCenter.cs index c01b504a..673ba0a9 100644 --- a/SabreTools.Library/DatFiles/RomCenter.cs +++ b/SabreTools.Library/DatFiles/RomCenter.cs @@ -508,7 +508,7 @@ namespace SabreTools.Library.DatFiles iw.WriteString($"¬{rom.Machine.Description ?? string.Empty}"); iw.WriteString($"¬{rom.Name ?? string.Empty}"); iw.WriteString($"¬{rom.CRC ?? string.Empty}"); - iw.WriteString($"¬{rom.Size}"); + iw.WriteString($"¬{rom.Size?.ToString() ?? string.Empty}"); iw.WriteString($"¬{rom.Machine.RomOf ?? string.Empty}"); iw.WriteString($"¬{rom.MergeTag ?? string.Empty}"); iw.WriteString("¬"); diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs index 6d6c544c..dc372fc0 100644 --- a/SabreTools.Library/DatFiles/SabreDat.cs +++ b/SabreTools.Library/DatFiles/SabreDat.cs @@ -218,7 +218,7 @@ namespace SabreTools.Library.DatFiles /// Name of the file to be parsed /// Index ID for the DAT /// True if full pathnames are to be kept, false otherwise (default) - /// TODO: This is horrendeously out of date. Once all done promoting, try to make this like JSON + /// TODO: Convert this to a direct serializer like JSON is private bool ReadDirectory( XmlReader reader, List parent, @@ -234,7 +234,7 @@ namespace SabreTools.Library.DatFiles XmlReader flagreader; bool empty = true; string key = string.Empty, date = string.Empty; - long size = -1; + long? size = null; ItemStatus its = ItemStatus.None; // If there's no subtree to the header, skip it @@ -339,7 +339,7 @@ namespace SabreTools.Library.DatFiles date = Sanitizer.CleanDate(reader.GetAttribute("date")); // Take care of hex-sized files - size = Sanitizer.CleanSize(reader.GetAttribute("size")); + size = Sanitizer.CleanLong(reader.GetAttribute("size")); Machine dir = new Machine { @@ -1578,7 +1578,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("file"); xtw.WriteAttributeString("type", "rom"); xtw.WriteRequiredAttributeString("name", rom.Name); - if (rom.Size != -1) xtw.WriteAttributeString("size", rom.Size.ToString()); + xtw.WriteOptionalAttributeString("size", rom.Size?.ToString()); xtw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant()); xtw.WriteOptionalAttributeString("md5", rom.MD5?.ToLowerInvariant()); #if NET_FRAMEWORK diff --git a/SabreTools.Library/DatFiles/SeparatedValue.cs b/SabreTools.Library/DatFiles/SeparatedValue.cs index ee5c8357..0d79a77c 100644 --- a/SabreTools.Library/DatFiles/SeparatedValue.cs +++ b/SabreTools.Library/DatFiles/SeparatedValue.cs @@ -268,7 +268,7 @@ namespace SabreTools.Library.DatFiles fields[5] = "rom"; fields[6] = rom.Name; fields[7] = string.Empty; - fields[8] = rom.Size.ToString(); + fields[8] = rom.Size?.ToString(); fields[9] = rom.CRC?.ToLowerInvariant(); fields[10] = rom.MD5?.ToLowerInvariant(); //fields[11] = rom.RIPEMD160?.ToLowerInvariant(); diff --git a/SabreTools.Library/DatFiles/SoftwareList.cs b/SabreTools.Library/DatFiles/SoftwareList.cs index 7e5f0285..84ad216f 100644 --- a/SabreTools.Library/DatFiles/SoftwareList.cs +++ b/SabreTools.Library/DatFiles/SoftwareList.cs @@ -374,7 +374,7 @@ namespace SabreTools.Library.DatFiles var rom = new Rom { Name = reader.GetAttribute("name"), - Size = Sanitizer.CleanSize(reader.GetAttribute("size")), + Size = Sanitizer.CleanLong(reader.GetAttribute("size")), CRC = reader.GetAttribute("crc"), SHA1 = reader.GetAttribute("sha1"), Offset = reader.GetAttribute("offset"), @@ -788,7 +788,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("rom"); xtw.WriteRequiredAttributeString("name", rom.Name); - if (rom.Size != -1) xtw.WriteAttributeString("size", rom.Size.ToString()); + xtw.WriteOptionalAttributeString("size", rom.Size?.ToString()); xtw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant()); xtw.WriteOptionalAttributeString("md5", rom.MD5?.ToLowerInvariant()); #if NET_FRAMEWORK diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs index 71faf29e..99a37115 100644 --- a/SabreTools.Library/DatItems/Enums.cs +++ b/SabreTools.Library/DatItems/Enums.cs @@ -110,7 +110,6 @@ namespace SabreTools.Library.DatItems /// /// List of valid field types within a DatItem/Machine /// - /// TODO: Move this to a more common location public enum Field : int { NULL = 0, diff --git a/SabreTools.Library/DatItems/Rom.cs b/SabreTools.Library/DatItems/Rom.cs index 2a850923..575edb25 100644 --- a/SabreTools.Library/DatItems/Rom.cs +++ b/SabreTools.Library/DatItems/Rom.cs @@ -53,9 +53,8 @@ namespace SabreTools.Library.DatItems /// /// Byte size of the rom /// - /// TODO: Can this be made optional instead of concrete long? Use `null` instead of `-1`? [JsonProperty("size", DefaultValueHandling = DefaultValueHandling.Ignore)] - public long Size { get; set; } + public long? Size { get; set; } /// /// File CRC32 hash @@ -429,7 +428,7 @@ namespace SabreTools.Library.DatItems { Name = name; ItemType = ItemType.Rom; - Size = -1; + Size = null; ItemStatus = ItemStatus.None; Machine = new Machine @@ -446,7 +445,7 @@ namespace SabreTools.Library.DatItems public Rom(BaseFile baseFile) { Name = baseFile.Filename; - Size = baseFile.Size ?? -1; + Size = baseFile.Size; _crc = baseFile.CRC; _md5 = baseFile.MD5; #if NET_FRAMEWORK @@ -540,7 +539,7 @@ namespace SabreTools.Library.DatItems } // If we have a file that has no known size, rely on the hashes only - else if (Size == -1 && HashMatch(newOther)) + else if (Size == null && HashMatch(newOther)) { dupefound = true; } @@ -560,7 +559,7 @@ namespace SabreTools.Library.DatItems /// Rom to fill information from public void FillMissingInformation(Rom other) { - if (Size == -1 && other.Size != -1) + if (Size == null && other.Size != null) Size = other.Size; if (_crc.IsNullOrEmpty() && !other._crc.IsNullOrEmpty()) @@ -736,11 +735,11 @@ namespace SabreTools.Library.DatItems return false; // Filter on rom size - if (filter.DatItem_Size.MatchesNeutral(-1, Size) == false) + if (filter.DatItem_Size.MatchesNeutral(null, Size) == false) return false; - else if (filter.DatItem_Size.MatchesPositive(-1, Size) == false) + else if (filter.DatItem_Size.MatchesPositive(null, Size) == false) return false; - else if (filter.DatItem_Size.MatchesNegative(-1, Size) == false) + else if (filter.DatItem_Size.MatchesNegative(null, Size) == false) return false; // Filter on CRC diff --git a/SabreTools.Library/FileTypes/GZipArchive.cs b/SabreTools.Library/FileTypes/GZipArchive.cs index 4516d63d..d66a83a0 100644 --- a/SabreTools.Library/FileTypes/GZipArchive.cs +++ b/SabreTools.Library/FileTypes/GZipArchive.cs @@ -478,7 +478,7 @@ namespace SabreTools.Library.FileTypes .Concat(Utilities.StringToByteArray(rom.CRC)) // CRC .ToArray(); sw.Write(data); - sw.Write((ulong)rom.Size); // Long size (Unsigned, Mirrored) + sw.Write((ulong)(rom.Size ?? 0)); // Long size (Unsigned, Mirrored) // Now create a deflatestream from the input file ZlibBaseStream ds = new ZlibBaseStream(outputStream, CompressionMode.Compress, CompressionLevel.BestCompression, ZlibStreamFlavor.DEFLATE, true); @@ -496,7 +496,7 @@ namespace SabreTools.Library.FileTypes // Now write the standard footer sw.Write(Utilities.StringToByteArray(rom.CRC).Reverse().ToArray()); - sw.Write((uint)rom.Size); + sw.Write((uint)(rom.Size ?? 0)); // Dispose of everything sw.Dispose(); diff --git a/SabreTools.Library/FileTypes/TapeArchive.cs b/SabreTools.Library/FileTypes/TapeArchive.cs index b52a3ea0..cae2c70b 100644 --- a/SabreTools.Library/FileTypes/TapeArchive.cs +++ b/SabreTools.Library/FileTypes/TapeArchive.cs @@ -342,7 +342,7 @@ namespace SabreTools.Library.FileTypes // Copy the input stream to the output inputStream.Seek(0, SeekOrigin.Begin); - tarFile.AddEntry(rom.Name, inputStream, size: rom.Size, modified: usableDate); + tarFile.AddEntry(rom.Name, inputStream, size: rom.Size ?? 0, modified: usableDate); } // Otherwise, sort the input files and write out in the correct order @@ -394,7 +394,7 @@ namespace SabreTools.Library.FileTypes { // Copy the input file to the output inputStream.Seek(0, SeekOrigin.Begin); - tarFile.AddEntry(rom.Name, inputStream, size: rom.Size, modified: usableDate); + tarFile.AddEntry(rom.Name, inputStream, size: rom.Size ?? 0, modified: usableDate); } // Otherwise, copy the file from the old archive @@ -514,7 +514,7 @@ namespace SabreTools.Library.FileTypes } // Copy the input stream to the output - tarFile.AddEntry(roms[index].Name, FileExtensions.TryOpenRead(inputFiles[index]), size: roms[index].Size, modified: usableDate); + tarFile.AddEntry(roms[index].Name, FileExtensions.TryOpenRead(inputFiles[index]), size: roms[index].Size ?? 0, modified: usableDate); } } @@ -574,7 +574,7 @@ namespace SabreTools.Library.FileTypes } // Copy the input file to the output - tarFile.AddEntry(roms[-index - 1].Name, FileExtensions.TryOpenRead(inputFiles[-index - 1]), size: roms[-index - 1].Size, modified: usableDate); + tarFile.AddEntry(roms[-index - 1].Name, FileExtensions.TryOpenRead(inputFiles[-index - 1]), size: roms[-index - 1].Size ?? 0, modified: usableDate); } // Otherwise, copy the file from the old archive diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs index 6228b494..d645ee65 100644 --- a/SabreTools.Library/Filtering/Filter.cs +++ b/SabreTools.Library/Filtering/Filter.cs @@ -104,7 +104,7 @@ namespace SabreTools.Library.Filtering // Rom public FilterItem DatItem_Name { get; private set; } = new FilterItem(); public FilterItem DatItem_Bios { get; private set; } = new FilterItem(); - public FilterItem DatItem_Size { get; private set; } = new FilterItem() { Positive = -1, Negative = -1, Neutral = -1 }; + public FilterItem DatItem_Size { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null }; public FilterItem DatItem_CRC { get; private set; } = new FilterItem(); public FilterItem DatItem_MD5 { get; private set; } = new FilterItem(); #if NET_FRAMEWORK @@ -706,7 +706,7 @@ namespace SabreTools.Library.Filtering break; case Field.DatItem_Clock: - SetOptionalLongFilter(DatItem_Clock, value, negate); + SetLongFilter(DatItem_Clock, value, negate); break; // Condition @@ -746,11 +746,11 @@ namespace SabreTools.Library.Filtering break; case Field.DatItem_Control_Player: - SetOptionalLongFilter(DatItem_Control_Player, value, negate); + SetLongFilter(DatItem_Control_Player, value, negate); break; case Field.DatItem_Control_Buttons: - SetOptionalLongFilter(DatItem_Control_Buttons, value, negate); + SetLongFilter(DatItem_Control_Buttons, value, negate); break; case Field.DatItem_Control_RegButtons: @@ -758,19 +758,19 @@ namespace SabreTools.Library.Filtering break; case Field.DatItem_Control_Minimum: - SetOptionalLongFilter(DatItem_Control_Minimum, value, negate); + SetLongFilter(DatItem_Control_Minimum, value, negate); break; case Field.DatItem_Control_Maximum: - SetOptionalLongFilter(DatItem_Control_Maximum, value, negate); + SetLongFilter(DatItem_Control_Maximum, value, negate); break; case Field.DatItem_Control_Sensitivity: - SetOptionalLongFilter(DatItem_Control_Sensitivity, value, negate); + SetLongFilter(DatItem_Control_Sensitivity, value, negate); break; case Field.DatItem_Control_KeyDelta: - SetOptionalLongFilter(DatItem_Control_KeyDelta, value, negate); + SetLongFilter(DatItem_Control_KeyDelta, value, negate); break; case Field.DatItem_Control_Reverse: @@ -795,11 +795,11 @@ namespace SabreTools.Library.Filtering break; case Field.DatItem_AreaSize: - SetOptionalLongFilter(DatItem_AreaSize, value, negate); + SetLongFilter(DatItem_AreaSize, value, negate); break; case Field.DatItem_AreaWidth: - SetOptionalLongFilter(DatItem_AreaWidth, value, negate); + SetLongFilter(DatItem_AreaWidth, value, negate); break; case Field.DatItem_AreaEndianness: @@ -835,7 +835,7 @@ namespace SabreTools.Library.Filtering break; case Field.DatItem_Rotate: - SetOptionalLongFilter(DatItem_Rotate, value, negate); + SetLongFilter(DatItem_Rotate, value, negate); break; case Field.DatItem_FlipX: @@ -843,11 +843,11 @@ namespace SabreTools.Library.Filtering break; case Field.DatItem_Width: - SetOptionalLongFilter(DatItem_Width, value, negate); + SetLongFilter(DatItem_Width, value, negate); break; case Field.DatItem_Height: - SetOptionalLongFilter(DatItem_Height, value, negate); + SetLongFilter(DatItem_Height, value, negate); break; case Field.DatItem_Refresh: @@ -855,31 +855,31 @@ namespace SabreTools.Library.Filtering break; case Field.DatItem_PixClock: - SetOptionalLongFilter(DatItem_PixClock, value, negate); + SetLongFilter(DatItem_PixClock, value, negate); break; case Field.DatItem_HTotal: - SetOptionalLongFilter(DatItem_HTotal, value, negate); + SetLongFilter(DatItem_HTotal, value, negate); break; case Field.DatItem_HBEnd: - SetOptionalLongFilter(DatItem_HBEnd, value, negate); + SetLongFilter(DatItem_HBEnd, value, negate); break; case Field.DatItem_HBStart: - SetOptionalLongFilter(DatItem_HBStart, value, negate); + SetLongFilter(DatItem_HBStart, value, negate); break; case Field.DatItem_VTotal: - SetOptionalLongFilter(DatItem_VTotal, value, negate); + SetLongFilter(DatItem_VTotal, value, negate); break; case Field.DatItem_VBEnd: - SetOptionalLongFilter(DatItem_VBEnd, value, negate); + SetLongFilter(DatItem_VBEnd, value, negate); break; case Field.DatItem_VBStart: - SetOptionalLongFilter(DatItem_VBStart, value, negate); + SetLongFilter(DatItem_VBStart, value, negate); break; // Driver @@ -948,11 +948,11 @@ namespace SabreTools.Library.Filtering break; case Field.DatItem_Players: - SetOptionalLongFilter(DatItem_Players, value, negate); + SetLongFilter(DatItem_Players, value, negate); break; case Field.DatItem_Coins: - SetOptionalLongFilter(DatItem_Coins, value, negate); + SetLongFilter(DatItem_Coins, value, negate); break; // Instance @@ -1045,7 +1045,7 @@ namespace SabreTools.Library.Filtering // Sound case Field.DatItem_Channels: - SetOptionalLongFilter(DatItem_Channels, value, negate); + SetLongFilter(DatItem_Channels, value, negate); break; #endregion @@ -1128,72 +1128,13 @@ namespace SabreTools.Library.Filtering } } - /// - /// Set a long filter - /// - /// FilterItem to populate - /// String value to add - /// True to set negative filter, false otherwise - /// TODO: Can anything using this go with SetOptionalLongFilter instead? - private void SetLongFilter(FilterItem filterItem, string value, bool negate) - { - bool? operation = null; - if (value.StartsWith(">")) - operation = true; - else if (value.StartsWith("<")) - operation = false; - else if (value.StartsWith("=")) - operation = null; - - string valueString = value.TrimStart('>', '<', '='); - if (!Int64.TryParse(valueString, out long valueLong)) - return; - - // Equal - if (operation == null && !negate) - { - filterItem.Neutral = valueLong; - } - - // Not Equal - else if (operation == null && negate) - { - filterItem.Negative = valueLong - 1; - filterItem.Positive = valueLong + 1; - } - - // Greater Than or Equal - else if (operation == true && !negate) - { - filterItem.Positive = valueLong; - } - - // Strictly Less Than - else if (operation == true && negate) - { - filterItem.Negative = valueLong - 1; - } - - // Less Than or Equal - else if (operation == false && !negate) - { - filterItem.Negative = valueLong; - } - - // Strictly Greater Than - else if (operation == false && negate) - { - filterItem.Positive = valueLong + 1; - } - } - /// /// Set a long? filter /// /// FilterItem to populate /// String value to add /// True to set negative filter, false otherwise - private void SetOptionalLongFilter(FilterItem filterItem, string value, bool negate) + private void SetLongFilter(FilterItem filterItem, string value, bool negate) { bool? operation = null; if (value.StartsWith(">")) diff --git a/SabreTools.Library/Skippers/SkipperFile.cs b/SabreTools.Library/Skippers/SkipperFile.cs index ea3f0b8a..b2eb5af8 100644 --- a/SabreTools.Library/Skippers/SkipperFile.cs +++ b/SabreTools.Library/Skippers/SkipperFile.cs @@ -158,26 +158,18 @@ namespace SabreTools.Library.Skippers { string offset = xtr.GetAttribute("start_offset"); if (offset.ToLowerInvariant() == "eof") - { rule.StartOffset = null; - } else - { rule.StartOffset = Convert.ToInt64(offset, 16); - } } if (xtr.GetAttribute("end_offset") != null) { string offset = xtr.GetAttribute("end_offset"); if (offset.ToLowerInvariant() == "eof") - { rule.EndOffset = null; - } else - { rule.EndOffset = Convert.ToInt64(offset, 16); - } } if (xtr.GetAttribute("operation") != null) diff --git a/SabreTools.Library/Tools/Sanitizer.cs b/SabreTools.Library/Tools/Sanitizer.cs index f36bb085..1a28e915 100644 --- a/SabreTools.Library/Tools/Sanitizer.cs +++ b/SabreTools.Library/Tools/Sanitizer.cs @@ -202,15 +202,18 @@ namespace SabreTools.Library.Tools /// Get a sanitized size from an input string /// /// String to get value from - /// Size as a long, if possible - public static long CleanSize(string input) + /// Size as a long?, if possible + public static long? CleanLong(string input) { - long size = -1; + long? size = null; if (input != null && input.Contains("0x")) size = Convert.ToInt64(input, 16); else if (input != null) - Int64.TryParse(input, out size); + { + if (Int64.TryParse(input, out long longSize)) + size = longSize; + } return size; }