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