diff --git a/SabreTools.Helper/Data/Build.cs b/SabreTools.Helper/Data/Build.cs index 5fb19b99..96734927 100644 --- a/SabreTools.Helper/Data/Build.cs +++ b/SabreTools.Helper/Data/Build.cs @@ -187,8 +187,11 @@ namespace SabreTools.Helper helptext.Add(" -ro, --romba Output in Romba format (requires SHA-1)"); helptext.Add(" -tsv, --tsv Output in Tab-Separated Value format"); helptext.Add(" -csv, --csv Output in Comma-Separated Value format"); + helptext.Add(" -omd5, --output-md5 Output in MD5 format"); helptext.Add(" -or, --output-rc Output in RomCenter format"); helptext.Add(" -os, --output-sd Output in SabreDAT format"); + helptext.Add(" -osfv, --ouput-sfv Output in SFV format"); + helptext.Add(" -osha1, --output-sha1 Output in SHA-1 format"); helptext.Add(" -ox, --output-xml Output in Logiqx XML format"); helptext.Add(" -f=, --filename= Set a new filename"); helptext.Add(" -n=, --name= Set a new internal name"); diff --git a/SabreTools.Helper/Data/Enums.cs b/SabreTools.Helper/Data/Enums.cs index 13aeed5d..d5585471 100644 --- a/SabreTools.Helper/Data/Enums.cs +++ b/SabreTools.Helper/Data/Enums.cs @@ -1,6 +1,4 @@ -using System; - -namespace SabreTools.Helper +namespace SabreTools.Helper { /// /// Possible DAT import classes @@ -164,18 +162,6 @@ namespace SabreTools.Helper Greater, } - /// - /// Determines which diffs should be created - /// - [Flags] - public enum DiffMode - { - Dupes = 0x01, - NoDupes = 0x02, - Individuals = 0x04, - All = Dupes | NoDupes | Individuals, - } - /// /// Determines which fields should be split on /// diff --git a/SabreTools.Helper/Data/Flags.cs b/SabreTools.Helper/Data/Flags.cs new file mode 100644 index 00000000..a6493fcf --- /dev/null +++ b/SabreTools.Helper/Data/Flags.cs @@ -0,0 +1,33 @@ +using System; + +namespace SabreTools.Helper +{ + /// + /// Determines which diffs should be created + /// + [Flags] + public enum DiffMode + { + Dupes = 0x01, + NoDupes = 0x02, + Individuals = 0x04, + All = Dupes | NoDupes | Individuals, + } + + /// + /// Determines the DAT output format + /// + [Flags] + public enum OutputFormatFlag + { + Xml = 0x001, + ClrMamePro = 0x002, + RomCenter = 0x004, + DOSCenter = 0x008, + MissFile = 0x010, + SabreDat = 0x020, + RedumpMD5 = 0x040, + RedumpSHA1 = 0x080, + RedumpSFV = 0x100, + } +} diff --git a/SabreTools.Helper/SabreTools.Helper.csproj b/SabreTools.Helper/SabreTools.Helper.csproj index dacb674a..fa75b7b5 100644 --- a/SabreTools.Helper/SabreTools.Helper.csproj +++ b/SabreTools.Helper/SabreTools.Helper.csproj @@ -85,6 +85,7 @@ + diff --git a/SabreTools/Partials/SabreTools_Inits.cs b/SabreTools/Partials/SabreTools_Inits.cs index 47aa048e..7ed949e4 100644 --- a/SabreTools/Partials/SabreTools_Inits.cs +++ b/SabreTools/Partials/SabreTools_Inits.cs @@ -93,11 +93,7 @@ namespace SabreTools /// None, Split, Full /// None, Obsolete, Required, Ignore /// None, Zip, Unzip - /// True to output to ClrMamePro format - /// True to output to Missfile format - /// True to output to RomCenter format - /// True to output to SabreDAT format - /// True to output to Logiqx XML format + /// Non-zero flag for output format, zero otherwise /// /* Missfile-specific DAT info */ /// True if games are to be used in output, false if roms are /// Generic prefix to be added to each line @@ -110,7 +106,7 @@ namespace SabreTools /// True to output files in TSV format, false to output files in CSV format, null otherwise /// /* Merging and Diffing info */ /// True if input files should be merged into a single file, false otherwise - /// Non-zero flag for diffing mode, zero otherwise + /// Non-zero flag for diffing mode, zero otherwise /// True if the diffed files should be cascade diffed, false if diffed files should be reverse cascaded, null otherwise /// True if the cascade-diffed files should overwrite their inputs, false otherwise /// True if the first cascaded diff file should be skipped on output, false otherwise @@ -156,11 +152,7 @@ namespace SabreTools string forcemerge, string forcend, string forcepack, - bool outputCMP, - bool outputMiss, - bool outputRC, - bool outputSD, - bool outputXML, + OutputFormatFlag outputFormatFlag, /* Missfile-specific DAT info */ bool usegame, @@ -175,7 +167,7 @@ namespace SabreTools /* Merging and Diffing info */ bool merge, - DiffMode diff, + DiffMode diffMode, bool? cascade, bool inplace, bool skip, @@ -261,7 +253,7 @@ namespace SabreTools repext = (repext == "" || repext.StartsWith(".") ? repext : "." + repext); // If we're in merge or diff mode and the names aren't set, set defaults - if (merge || diff != 0) + if (merge || diffMode != 0) { // Get the values that will be used if (date == "") @@ -270,17 +262,17 @@ namespace SabreTools } if (name == "") { - name = (diff != 0 ? "DiffDAT" : "MergeDAT") + (superdat ? "-SuperDAT" : "") + (dedup ? "-deduped" : ""); + name = (diffMode != 0 ? "DiffDAT" : "MergeDAT") + (superdat ? "-SuperDAT" : "") + (dedup ? "-deduped" : ""); } if (description == "") { - description = (diff != 0 ? "DiffDAT" : "MergeDAT") + (superdat ? "-SuperDAT" : "") + (dedup ? " - deduped" : ""); + description = (diffMode != 0 ? "DiffDAT" : "MergeDAT") + (superdat ? "-SuperDAT" : "") + (dedup ? " - deduped" : ""); if (!bare) { description += " (" + date + ")"; } } - if (category == "" && diff != 0) + if (category == "" && diffMode != 0) { category = "DiffDAT"; } @@ -323,39 +315,57 @@ namespace SabreTools XSV = tsv, }; - if (outputCMP) + if ((outputFormatFlag & OutputFormatFlag.ClrMamePro) != 0) { userInputDat.OutputFormat = OutputFormat.ClrMamePro; - DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diff, cascade, inplace, skip, bare, clean, softlist, + DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diffMode, cascade, inplace, skip, bare, clean, softlist, gamename, romname, romtype, sgt, slt, seq, crc, md5, sha1, nodump, trim, single, root, maxDegreeOfParallelism, _logger); } - if (outputMiss || tsv != null) + if ((outputFormatFlag & OutputFormatFlag.MissFile) != 0 || tsv != null) { userInputDat.OutputFormat = OutputFormat.MissFile; - DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diff, cascade, inplace, skip, bare, clean, softlist, + DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diffMode, cascade, inplace, skip, bare, clean, softlist, gamename, romname, romtype, sgt, slt, seq, crc, md5, sha1, nodump, trim, single, root, maxDegreeOfParallelism, _logger); } - if (outputRC) + if ((outputFormatFlag & OutputFormatFlag.RedumpMD5) != 0) + { + userInputDat.OutputFormat = OutputFormat.RedumpMD5; + DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diffMode, cascade, inplace, skip, bare, clean, softlist, + gamename, romname, romtype, sgt, slt, seq, crc, md5, sha1, nodump, trim, single, root, maxDegreeOfParallelism, _logger); + } + if ((outputFormatFlag & OutputFormatFlag.RedumpSFV) != 0) + { + userInputDat.OutputFormat = OutputFormat.RedumpSFV; + DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diffMode, cascade, inplace, skip, bare, clean, softlist, + gamename, romname, romtype, sgt, slt, seq, crc, md5, sha1, nodump, trim, single, root, maxDegreeOfParallelism, _logger); + } + if ((outputFormatFlag & OutputFormatFlag.RedumpSHA1) != 0) + { + userInputDat.OutputFormat = OutputFormat.RedumpSHA1; + DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diffMode, cascade, inplace, skip, bare, clean, softlist, + gamename, romname, romtype, sgt, slt, seq, crc, md5, sha1, nodump, trim, single, root, maxDegreeOfParallelism, _logger); + } + if ((outputFormatFlag & OutputFormatFlag.RomCenter) != 0) { userInputDat.OutputFormat = OutputFormat.RomCenter; - DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diff, cascade, inplace, skip, bare, clean, softlist, + DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diffMode, cascade, inplace, skip, bare, clean, softlist, gamename, romname, romtype, sgt, slt, seq, crc, md5, sha1, nodump, trim, single, root, maxDegreeOfParallelism, _logger); } - if (outputSD) + if ((outputFormatFlag & OutputFormatFlag.SabreDat) != 0) { userInputDat.OutputFormat = OutputFormat.SabreDat; - DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diff, cascade, inplace, skip, bare, clean, softlist, + DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diffMode, cascade, inplace, skip, bare, clean, softlist, gamename, romname, romtype, sgt, slt, seq, crc, md5, sha1, nodump, trim, single, root, maxDegreeOfParallelism, _logger); } - if (outputXML) + if ((outputFormatFlag & OutputFormatFlag.Xml) != 0) { userInputDat.OutputFormat = OutputFormat.Xml; - DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diff, cascade, inplace, skip, bare, clean, softlist, + DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diffMode, cascade, inplace, skip, bare, clean, softlist, gamename, romname, romtype, sgt, slt, seq, crc, md5, sha1, nodump, trim, single, root, maxDegreeOfParallelism, _logger); } - if (!outputCMP && !(outputMiss || tsv != null) && !outputRC && !outputSD && !outputXML) + if (outputFormatFlag == 0 && tsv == null) { - DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diff, cascade, inplace, skip, bare, clean, softlist, + DatTools.UpdateParallel(inputs, userInputDat, outdir, merge, diffMode, cascade, inplace, skip, bare, clean, softlist, gamename, romname, romtype, sgt, slt, seq, crc, md5, sha1, nodump, trim, single, root, maxDegreeOfParallelism, _logger); } } diff --git a/SabreTools/SabreTools.cs b/SabreTools/SabreTools.cs index d818a151..935ffc1f 100644 --- a/SabreTools/SabreTools.cs +++ b/SabreTools/SabreTools.cs @@ -105,11 +105,6 @@ namespace SabreTools noSHA1 = false, offlineMerge = false, old = false, - outputCMP = false, - outputMiss = false, - outputRC = false, - outputSD = false, - outputXML = false, quotes = false, rem = false, romba = false, @@ -125,11 +120,12 @@ namespace SabreTools bool? cascade = null, nodump = null, tsv = null; - DiffMode diff = 0x0; + DiffMode diffMode = 0x0; int maxParallelism = -1; long sgt = -1, slt = -1, seq = -1; + OutputFormatFlag outputFormatFlag = 0x0; string addext = "", author = "", category = "", @@ -193,19 +189,19 @@ namespace SabreTools break; case "-cc": case "--convert-cmp": - outputCMP = true; + outputFormatFlag |= OutputFormatFlag.ClrMamePro; break; case "-cm": case "--convert-miss": - outputMiss = true; + outputFormatFlag |= OutputFormatFlag.MissFile; break; case "-cr": case "--convert-rc": - outputRC = true; + outputFormatFlag |= OutputFormatFlag.RomCenter; break; case "-cs": case "--convert-sd": - outputSD = true; + outputFormatFlag |= OutputFormatFlag.SabreDat; break; case "-csv": case "--csv": @@ -213,7 +209,7 @@ namespace SabreTools break; case "-cx": case "--convert-xml": - outputXML = true; + outputFormatFlag |= OutputFormatFlag.Xml; break; case "-clean": case "--clean": @@ -230,19 +226,19 @@ namespace SabreTools break; case "-di": case "--diff": - diff |= DiffMode.All; + diffMode |= DiffMode.All; break; case "-did": case "--diff-du": - diff |= DiffMode.Dupes; + diffMode |= DiffMode.Dupes; break; case "-dii": case "--diff-in": - diff |= DiffMode.Individuals; + diffMode |= DiffMode.Individuals; break; case "-din": case "--diff-nd": - diff |= DiffMode.NoDupes; + diffMode |= DiffMode.NoDupes; break; case "-dp": case "--d2dp": @@ -331,7 +327,7 @@ namespace SabreTools break; case "-oc": case "--output-cmp": - outputCMP = true; + outputFormatFlag |= OutputFormatFlag.ClrMamePro; break; case "-ol": case "--offmerge": @@ -339,19 +335,31 @@ namespace SabreTools break; case "-om": case "--output-miss": - outputMiss = true; + outputFormatFlag |= OutputFormatFlag.MissFile; + break; + case "-omd5": + case "--output-md5": + outputFormatFlag |= OutputFormatFlag.RedumpMD5; break; case "-or": case "--output-rc": - outputRC = true; + outputFormatFlag |= OutputFormatFlag.RomCenter; break; case "-os": case "--output-sd": - outputSD = true; + outputFormatFlag |= OutputFormatFlag.SabreDat; + break; + case "-osfv": + case "--output-sfv": + outputFormatFlag |= OutputFormatFlag.RedumpSFV; + break; + case "-osha1": + case "--output-sha1": + outputFormatFlag |= OutputFormatFlag.RedumpSHA1; break; case "-ox": case "--output-xml": - outputXML = true; + outputFormatFlag |= OutputFormatFlag.Xml; break; case "-q": case "--quotes": @@ -615,8 +623,7 @@ namespace SabreTools // If more than one switch is enabled, show the help screen if (!(add ^ datfromdir ^ datfromdirparallel ^ extsplit ^ generate ^ genall ^ hashsplit ^ import ^ listsrc ^ listsys ^ - (merge || diff != 0 || update || outputCMP || outputRC || outputSD || outputXML || outputMiss || tsv != null|| trim) ^ - offlineMerge ^ rem ^ stats ^ typesplit)) + (merge || diffMode != 0 || update || outputFormatFlag != 0 || tsv != null|| trim) ^ offlineMerge ^ rem ^ stats ^ typesplit)) { _logger.Error("Only one feature switch is allowed at a time"); Build.Help(); @@ -625,9 +632,8 @@ namespace SabreTools } // If a switch that requires a filename is set and no file is, show the help screen - if (inputs.Count == 0 && (update || (outputMiss || tsv != null) || outputCMP || outputRC || outputSD - || outputXML || extsplit || hashsplit || datfromdir || datfromdirparallel || (merge || diff != 0) - || stats || trim || typesplit)) + if (inputs.Count == 0 && (update || outputFormatFlag != 0 || tsv != null || extsplit || hashsplit || datfromdir + || datfromdirparallel || (merge || diffMode != 0) || stats || trim || typesplit)) { _logger.Error("This feature requires at least one input"); Build.Help(); @@ -670,11 +676,11 @@ namespace SabreTools } // Convert, update, merge, diff, and filter a DAT or folder of DATs - else if (update || outputCMP || outputMiss || tsv != null || outputRC || outputSD || outputXML || merge || diff != 0) + else if (update || tsv != null || outputFormatFlag != 0 || merge || diffMode != 0) { InitUpdate(inputs, filename, name, description, rootdir, category, version, date, author, email, homepage, url, comment, header, - superdat, forcemerge, forcend, forcepack, outputCMP, outputMiss, outputRC, outputSD, outputXML, usegame, prefix, - postfix, quotes, repext, addext, datprefix, romba, tsv, merge, diff, cascade, inplace, skip, bare, gamename, romname, + superdat, forcemerge, forcend, forcepack, outputFormatFlag, usegame, prefix, + postfix, quotes, repext, addext, datprefix, romba, tsv, merge, diffMode, cascade, inplace, skip, bare, gamename, romname, romtype, sgt, slt, seq, crc, md5, sha1, nodump, trim, single, root, outdir, clean, softlist, dedup, maxParallelism); }