diff --git a/SabreTools.Core/Tools/Utilities.cs b/SabreTools.Core/Tools/Utilities.cs index 60e98442..9b3d3f52 100644 --- a/SabreTools.Core/Tools/Utilities.cs +++ b/SabreTools.Core/Tools/Utilities.cs @@ -62,6 +62,23 @@ namespace SabreTools.Core.Tools } } + /// + /// Get a sanitized double from an input string + /// + /// String to get value from + /// Value as a double?, if possible + public static double? CleanDouble(string input) + { + double? value = null; + if (input != null) + { + if (Double.TryParse(input, out double doubleValue)) + value = doubleValue; + } + + return value; + } + /// /// Get a sanitized size from an input string /// diff --git a/SabreTools.DatFiles/Formats/Listxml.cs b/SabreTools.DatFiles/Formats/Listxml.cs index f1546c91..e860ef96 100644 --- a/SabreTools.DatFiles/Formats/Listxml.cs +++ b/SabreTools.DatFiles/Formats/Listxml.cs @@ -537,6 +537,7 @@ namespace SabreTools.DatFiles.Formats FlipX = reader.GetAttribute("flipx").AsYesNo(), Width = Utilities.CleanLong(reader.GetAttribute("width")), Height = Utilities.CleanLong(reader.GetAttribute("height")), + Refresh = Utilities.CleanDouble(reader.GetAttribute("refresh")), PixClock = Utilities.CleanLong(reader.GetAttribute("pixclock")), HTotal = Utilities.CleanLong(reader.GetAttribute("htotal")), HBEnd = Utilities.CleanLong(reader.GetAttribute("hbend")), @@ -552,13 +553,6 @@ namespace SabreTools.DatFiles.Formats }, }; - // Set the refresh - if (reader.GetAttribute("refresh") != null) - { - if (Double.TryParse(reader.GetAttribute("refresh"), out double refresh)) - display.Refresh = refresh; - } - datItems.Add(display); reader.Read(); diff --git a/SabreTools.DatFiles/Formats/RomCenter.cs b/SabreTools.DatFiles/Formats/RomCenter.cs index c71ed5b5..97abfafa 100644 --- a/SabreTools.DatFiles/Formats/RomCenter.cs +++ b/SabreTools.DatFiles/Formats/RomCenter.cs @@ -102,7 +102,7 @@ namespace SabreTools.DatFiles.Formats return; reader.ReadNextLine(); - while (!reader.EndOfStream && reader.Section.ToLowerInvariant() == "credits") + do { // We don't care about whitespace, comments, or invalid if (reader.RowType != IniRowType.KeyValue) @@ -163,7 +163,7 @@ namespace SabreTools.DatFiles.Formats reader.ReadNextLine(); break; } - } + } while (!reader.EndOfStream && reader.Section.ToLowerInvariant() == "credits"); } /// @@ -177,7 +177,7 @@ namespace SabreTools.DatFiles.Formats return; reader.ReadNextLine(); - while (!reader.EndOfStream && reader.Section.ToLowerInvariant() == "dat") + do { // We don't care about whitespace, comments, or invalid if (reader.RowType != IniRowType.KeyValue) @@ -227,7 +227,7 @@ namespace SabreTools.DatFiles.Formats reader.ReadNextLine(); break; } - } + } while (!reader.EndOfStream && reader.Section.ToLowerInvariant() == "dat"); } /// @@ -241,7 +241,7 @@ namespace SabreTools.DatFiles.Formats return; reader.ReadNextLine(); - while (!reader.EndOfStream && reader.Section.ToLowerInvariant() == "emulator") + do { // We don't care about whitespace, comments, or invalid if (reader.RowType != IniRowType.KeyValue) @@ -277,7 +277,7 @@ namespace SabreTools.DatFiles.Formats reader.ReadNextLine(); break; } - } + } while (!reader.EndOfStream && reader.Section.ToLowerInvariant() == "emulator"); } /// @@ -293,7 +293,7 @@ namespace SabreTools.DatFiles.Formats return; reader.ReadNextLine(); - while (!reader.EndOfStream && reader.Section.ToLowerInvariant() == "games") + do { // We don't care about whitespace or comments // We're keeping keyvalue in case a file has '=' in the row @@ -358,7 +358,7 @@ namespace SabreTools.DatFiles.Formats ParseAddHelper(rom); reader.ReadNextLine(); - } + } while (!reader.EndOfStream && reader.Section.ToLowerInvariant() == "games"); } /// diff --git a/SabreTools.Test/DatTools/ParserTests.cs b/SabreTools.Test/DatTools/ParserTests.cs index 97bdd905..d6fcae85 100644 --- a/SabreTools.Test/DatTools/ParserTests.cs +++ b/SabreTools.Test/DatTools/ParserTests.cs @@ -16,12 +16,12 @@ namespace SabreTools.Test.DatTools [InlineData("test-logiqx.xml", DatFormat.Logiqx, 6)] //[InlineData(null, DatFormat.LogiqxDeprecated, 0)] // Not parsed separately //[InlineData(null, DatFormat.SoftwareList, 0)] - //[InlineData(null, DatFormat.Listxml, 0)] + [InlineData("test-listxml.xml", DatFormat.Listxml, 20)] //[InlineData(null, DatFormat.OfflineList, 0)] //[InlineData(null, DatFormat.SabreXML, 0)] [InlineData("test-openmsx.xml", DatFormat.OpenMSX, 3)] [InlineData("test-cmp.dat", DatFormat.ClrMamePro, 6)] - //[InlineData(null, DatFormat.RomCenter, 0)] + [InlineData("test-romcenter.dat", DatFormat.RomCenter, 1)] [InlineData("test-doscenter.dat", DatFormat.DOSCenter, 1)] [InlineData("test-attractmode.txt", DatFormat.AttractMode, 1)] //[InlineData(null, DatFormat.MissFile, 0)] // Parsing is not supported @@ -44,7 +44,7 @@ namespace SabreTools.Test.DatTools if (filename != null) filename = Path.Combine(Environment.CurrentDirectory, "TestData", filename); - var datFile = Parser.CreateAndParse(filename); + var datFile = Parser.CreateAndParse(filename, throwOnError: true); Assert.Equal(datFormat, datFile.Header.DatFormat); Assert.Equal(totalCount, datFile.Items.TotalCount); } diff --git a/SabreTools.Test/TestData/test-listxml.xml b/SabreTools.Test/TestData/test-listxml.xml new file mode 100644 index 00000000..c279de8a --- /dev/null +++ b/SabreTools.Test/TestData/test-listxml.xml @@ -0,0 +1,49 @@ + + + + + + Game! (Version 1) + 1980 + Manufacturer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1024KB + + + + + + + + + \ No newline at end of file diff --git a/SabreTools.Test/TestData/test-openmsx.xml b/SabreTools.Test/TestData/test-openmsx.xml index 8b54661a..c53be825 100644 --- a/SabreTools.Test/TestData/test-openmsx.xml +++ b/SabreTools.Test/TestData/test-openmsx.xml @@ -27,4 +27,5 @@ The softwaredb.xml file contains information about rom mapper types 7acd00c9053fbf7f7d698485759d170a483b123d0x8000ASCII8Comment Here da58f56d4b1660bc36d74bfb29776ef8ec61a8310x4000ASCII16Comment Too GoodLOAD(8)KonamiSCCafb1aef44a67cf7c9232f8a1c8587c66dd820caaComment Three - \ No newline at end of file + + \ No newline at end of file diff --git a/SabreTools.Test/TestData/test-romcenter.dat b/SabreTools.Test/TestData/test-romcenter.dat new file mode 100644 index 00000000..f089be86 --- /dev/null +++ b/SabreTools.Test/TestData/test-romcenter.dat @@ -0,0 +1,21 @@ +[CREDITS] +author=Unknown +version=1.0 +email=email@email.email +homepage=localhost +url=127.0.0.1 +date=1900-01-01 +comment=Not real data, sorry + +[DAT] +version=2.50 +plugin=Arcade +split=0 +merge=0 + +[EMULATOR] +refname=Internal DAT Name +version=Internal DAT Name + +[GAMES] +¬game2¬Game! (Version 2)¬game1¬Game! (Version 1)¬rom.bin¬deadbeef¬1024¬game2¬rom2.bin¬ \ No newline at end of file