diff --git a/DATabase/DATabase.cs b/DATabase/DATabase.cs index 707fb68c..44d95c56 100644 --- a/DATabase/DATabase.cs +++ b/DATabase/DATabase.cs @@ -54,6 +54,7 @@ namespace SabreTools convertMiss = false, convertRV = false, convertXml = false, + datname = false, disableForce = false, extsplit = false, generate = false, @@ -113,6 +114,10 @@ namespace SabreTools case "--disable-force": disableForce = true; break; + case "-dp": + case "--dat-prefix": + datname = true; + break; case "-es": case "--ext-split": extsplit = true; @@ -294,7 +299,7 @@ namespace SabreTools { foreach (string input in inputs) { - InitConvertMiss(input, usegame, prefix, postfix, quotes, repext, addext); + InitConvertMiss(input, usegame, prefix, postfix, quotes, repext, addext, datname); } } @@ -880,7 +885,7 @@ or 'b' to go back to the previous menu: private static void ConvertMissMenu() { string selection = "", input = "", prefix = "", postfix = "", addext = "", repext = ""; - bool usegame = true, quotes = false; + bool usegame = true, quotes = false, datname = false; while (selection.ToLowerInvariant() != "b") { Console.Clear(); @@ -896,7 +901,8 @@ Make a selection: 5) " + (quotes ? "Don't add quotes around each item" : "Add quotes around each item") + @" 6) Replace all extensions with another" + (repext != "" ? ":\t" + repext : "") + @" 7) Add extensions to each item" + (addext != "" ? ":\n\t" + addext : "") + @" - 8) Begin conversion + 8) " + (datname ? "Don't add dat name before every item" : "Add dat name before every item") + @" + 9) Begin conversion B) Go back to the previous menu "); Console.Write("Enter selection: "); @@ -935,8 +941,11 @@ Make a selection: postfix = Console.ReadLine(); break; case "8": + datname = !datname; + break; + case "9": Console.Clear(); - InitConvertMiss(input, usegame, prefix, postfix, quotes, repext, addext); + InitConvertMiss(input, usegame, prefix, postfix, quotes, repext, addext, datname); Console.Write("\nPress any key to continue..."); Console.ReadKey(); break; @@ -954,7 +963,8 @@ Make a selection: /// Add quotes to each item /// Replace all extensions with another /// Add an extension to all items - private static void InitConvertMiss(string input, bool usegame, string prefix, string postfix, bool quotes, string repext, string addext) + /// Add the dat name as a directory prefix + private static void InitConvertMiss(string input, bool usegame, string prefix, string postfix, bool quotes, string repext, string addext, bool datname) { // Strip any quotations from the name input = input.Replace("\"", ""); @@ -967,9 +977,16 @@ Make a selection: // Get the output name string name = Path.GetFileNameWithoutExtension(input) + "-miss.txt"; + // Get the DAT name string + string datstring = ""; + if (datname) + { + datstring = RomManipulation.GetDatName(input, logger); + } + // Read in the roms from the DAT and then write them to the file logger.Log("Converting " + input); - Output.WriteToText(name, Path.GetDirectoryName(input), RomManipulation.Parse(input, 0, 0, logger), logger, usegame, prefix, postfix, addext, repext, quotes); + Output.WriteToText(name, Path.GetDirectoryName(input), RomManipulation.Parse(input, 0, 0, logger), logger, usegame, prefix, postfix, addext, repext, quotes, datstring); logger.Log(input + " converted to: " + name); return; } diff --git a/SabreHelper/Build.cs b/SabreHelper/Build.cs index 0f32d141..36a56033 100644 --- a/SabreHelper/Build.cs +++ b/SabreHelper/Build.cs @@ -89,6 +89,7 @@ Options: url= URL (source only) -cm, --convert-miss -r, --roms Output roms to miss instead of sets + -dp, --dat-prefix Add dat name as a prefix to each item -pre=, --prefix= Set prefix to be printed in front of all lines -post=, --postfix= Set postfix to be printed behind all lines -q, --quotes Put double-quotes around each item diff --git a/SabreHelper/Output.cs b/SabreHelper/Output.cs index cad152cb..4b819d69 100644 --- a/SabreHelper/Output.cs +++ b/SabreHelper/Output.cs @@ -139,9 +139,10 @@ namespace SabreTools.Helper /// True if quotes should be put around the item, false otherwise (default) /// Arbitrary extension added to the end of each item /// Arbitrary extension to replace all extensions in the item + /// The internal name of the DAT to prefix /// True if the file was written, false otherwise public static bool WriteToText(string textfile, string outdir, List roms, Logger logger, bool useGame = true, string prefix = "", - string postfix = "", string addext = "", string repext = "", bool quotes = false) + string postfix = "", string addext = "", string repext = "", bool quotes = false, string datname = "") { // Normalize the output directory if (outdir == "") @@ -153,6 +154,12 @@ namespace SabreTools.Helper outdir += Path.DirectorySeparatorChar; } + // Get the DAT name, if applicable + if (datname != "" && !datname.EndsWith(Path.DirectorySeparatorChar.ToString())) + { + datname = datname + Path.DirectorySeparatorChar; + } + // Make the output directory if it doesn't exist if (!Directory.Exists(outdir)) { @@ -175,7 +182,7 @@ namespace SabreTools.Helper { string pre = prefix + (quotes ? "\"" : ""); string post = (quotes ? "\"" : "") + postfix; - string name = (useGame ? rom.Game : rom.Name); + string name = datname + (useGame ? rom.Game : rom.Name); if (repext != "") { string dir = Path.GetDirectoryName(name); diff --git a/SabreHelper/RomManipulation.cs b/SabreHelper/RomManipulation.cs index 36475905..40375105 100644 --- a/SabreHelper/RomManipulation.cs +++ b/SabreHelper/RomManipulation.cs @@ -28,6 +28,65 @@ namespace SabreTools.Helper return true; } + /// + /// Get the name of the DAT for external use + /// + /// Name of the file to be parsed + /// Logger object for console and file output + /// The internal name of the DAT on success, empty string otherwise + public static string GetDatName(string filename, Logger logger) + { + string name = ""; + + XmlDocument doc = new XmlDocument(); + try + { + doc.LoadXml(File.ReadAllText(filename)); + } + catch (XmlException) + { + try + { + doc.LoadXml(Converters.RomVaultToXML(File.ReadAllLines(filename)).ToString()); + } + catch (Exception ex) + { + logger.Error(ex.ToString()); + return name; + } + } + catch (Exception ex) + { + logger.Error(ex.ToString()); + return name; + } + + // Experimental looping using only XML parsing + XmlNode node = doc.FirstChild; + if (node != null && node.Name == "xml") + { + // Skip over everything that's not an element + while (node.NodeType != XmlNodeType.Element) + { + node = node.NextSibling; + } + } + + // Once we find the main body, enter it + if (node != null && (node.Name == "datafile" || node.Name == "softwarelist")) + { + node = node.FirstChild; + } + + // Get the name from the header + if (node != null && node.Name == "header") + { + name = node.SelectSingleNode("name").InnerText; + } + + return name; + } + /// /// Parse a DAT and return all found games and roms within ///