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