diff --git a/SabreTools.DatFiles/Rebuilder.cs b/SabreTools.DatFiles/Rebuilder.cs
index 691e20a9..81d110fd 100644
--- a/SabreTools.DatFiles/Rebuilder.cs
+++ b/SabreTools.DatFiles/Rebuilder.cs
@@ -60,9 +60,6 @@ namespace SabreTools.DatFiles
if (outputFormat == OutputFormat.Folder && datFile.Header.ForcePacking != PackingFlag.None)
outputFormat = GetOutputFormat(datFile.Header.ForcePacking);
- // Preload the Skipper list
- SkipperMatch.Init();
-
#endregion
bool success = true;
@@ -202,8 +199,6 @@ namespace SabreTools.DatFiles
if (outputFormat == OutputFormat.Folder && datFile.Header.ForcePacking != PackingFlag.None)
outputFormat = GetOutputFormat(datFile.Header.ForcePacking);
- // Preload the Skipper list
- SkipperMatch.Init();
#endregion
@@ -419,6 +414,7 @@ namespace SabreTools.DatFiles
if (datFile.Header.HeaderSkipper != null)
{
// Check to see if we have a matching header first
+ SkipperMatch.Init();
SkipperRule rule = SkipperMatch.GetMatchingRule(fileStream, Path.GetFileNameWithoutExtension(datFile.Header.HeaderSkipper));
// If there's a match, create the new file to write
diff --git a/SabreTools.FileTypes/BaseFile.cs b/SabreTools.FileTypes/BaseFile.cs
index 34a37610..0ba02268 100644
--- a/SabreTools.FileTypes/BaseFile.cs
+++ b/SabreTools.FileTypes/BaseFile.cs
@@ -295,6 +295,7 @@ namespace SabreTools.FileTypes
// Try to match the supplied header skipper
if (header != null)
{
+ SkipperMatch.Init();
var rule = SkipperMatch.GetMatchingRule(input, Path.GetFileNameWithoutExtension(header));
// If there's a match, transform the stream before getting info
diff --git a/SabreTools.Skippers/SkipperMatch.cs b/SabreTools.Skippers/SkipperMatch.cs
index da03a4f8..3c4f6c5e 100644
--- a/SabreTools.Skippers/SkipperMatch.cs
+++ b/SabreTools.Skippers/SkipperMatch.cs
@@ -26,7 +26,7 @@ namespace SabreTools.Skippers
///
/// Header skippers represented by a list of skipper objects
///
- private static List List;
+ private static List Skippers = null;
///
/// Local paths
@@ -45,13 +45,24 @@ namespace SabreTools.Skippers
///
/// Initialize static fields
///
- public static void Init()
+ /// True to enable internal header skipper generation, false to use file-based generation (default)
+ public static void Init(bool experimental = false)
{
- PopulateSkippers();
+ // If the list is populated, don't add to it
+ if (Skippers != null)
+ return;
+
+ // If we're using internal skipper generation
+ if (experimental)
+ PopulateSkippersInternal();
+
+ // If we're using file-based skipper generation
+ else
+ PopulateSkippers();
}
///
- /// Populate the entire list of header Skippers
+ /// Populate the entire list of header skippers from physical files
///
///
/// http://mamedev.emulab.it/clrmamepro/docs/xmlheaders.txt
@@ -60,18 +71,18 @@ namespace SabreTools.Skippers
private static void PopulateSkippers()
{
// Ensure the list exists
- if (List == null)
- List = new List();
+ if (Skippers == null)
+ Skippers = new List();
// Get skippers for each known header type
foreach (string skipperFile in Directory.EnumerateFiles(LocalPath, "*", SearchOption.AllDirectories))
{
- List.Add(new SkipperFile(Path.GetFullPath(skipperFile)));
+ Skippers.Add(new SkipperFile(Path.GetFullPath(skipperFile)));
}
}
///
- /// Populate the entire list of header skippers
+ /// Populate the entire list of header skippers from generated objects
///
///
/// http://mamedev.emulab.it/clrmamepro/docs/xmlheaders.txt
@@ -80,19 +91,19 @@ namespace SabreTools.Skippers
private static void PopulateSkippersInternal()
{
// Ensure the list exists
- if (List == null)
- List = new List();
+ if (Skippers == null)
+ Skippers = new List();
// Get skippers for each known header type
- List.Add(GetAtari7800());
- List.Add(GetAtariLynx());
- List.Add(GetCommodorePSID());
- List.Add(GetNECPCEngine());
- List.Add(GetNintendo64());
- List.Add(GetNintendoEntertainmentSystem());
- List.Add(GetNintendoFamicomDiskSystem());
- List.Add(GetSuperNintendoEntertainmentSystem());
- List.Add(GetSuperFamicomSPC());
+ Skippers.Add(GetAtari7800());
+ Skippers.Add(GetAtariLynx());
+ Skippers.Add(GetCommodorePSID());
+ Skippers.Add(GetNECPCEngine());
+ Skippers.Add(GetNintendo64());
+ Skippers.Add(GetNintendoEntertainmentSystem());
+ Skippers.Add(GetNintendoFamicomDiskSystem());
+ Skippers.Add(GetSuperNintendoEntertainmentSystem());
+ Skippers.Add(GetSuperFamicomSPC());
}
///
@@ -132,7 +143,7 @@ namespace SabreTools.Skippers
// Loop through and find a Skipper that has the right name
logger.Verbose("Beginning search for matching header skip rules");
List tempList = new List();
- tempList.AddRange(List);
+ tempList.AddRange(Skippers);
// Loop through all known SkipperFiles
foreach (SkipperFile skipper in tempList)
diff --git a/SabreTools/Features/Extract.cs b/SabreTools/Features/Extract.cs
index 54f87906..fd4075e2 100644
--- a/SabreTools/Features/Extract.cs
+++ b/SabreTools/Features/Extract.cs
@@ -69,6 +69,7 @@ The following systems have headers that this program can work with:
logger.User($"\nGetting skipper information for '{file}'");
// Get the skipper rule that matches the file, if any
+ SkipperMatch.Init();
SkipperRule rule = SkipperMatch.GetMatchingRule(file, string.Empty);
// If we have an empty rule, return false