Use DatData for everything; read header elements

Reading the header elements will come in handy for when built-in parse and generate code will take care of converting from any format to any format.
This commit is contained in:
Matt Nadareski
2016-05-16 14:28:23 -07:00
parent d5b5a9a30b
commit d2e96a8f24
3 changed files with 142 additions and 53 deletions

View File

@@ -144,16 +144,19 @@ namespace SabreTools
{ {
// First get the combination Dictionary of currentAllMerged and currentNewMerged // First get the combination Dictionary of currentAllMerged and currentNewMerged
_logger.User("Adding Current and New Merged DATs to the dictionary"); _logger.User("Adding Current and New Merged DATs to the dictionary");
Dictionary<string, List<RomData>> completeDats = new Dictionary<string, List<RomData>>(); DatData completeDats = new DatData
{
Roms = new Dictionary<string, List<RomData>>(),
};
completeDats = RomManipulation.ParseDict(_currentAllMerged, 0, 0, completeDats, _logger); completeDats = RomManipulation.ParseDict(_currentAllMerged, 0, 0, completeDats, _logger);
completeDats = RomManipulation.ParseDict(_currentNewMerged, 0, 0, completeDats, _logger); completeDats = RomManipulation.ParseDict(_currentNewMerged, 0, 0, completeDats, _logger);
// Now get Net New output dictionary [(currentNewMerged)-(currentAllMerged)] // Now get Net New output dictionary [(currentNewMerged)-(currentAllMerged)]
_logger.User("Creating and populating Net New dictionary"); _logger.User("Creating and populating Net New dictionary");
Dictionary<string, List<RomData>> netNew = new Dictionary<string, List<RomData>>(); Dictionary<string, List<RomData>> netNew = new Dictionary<string, List<RomData>>();
foreach (string key in completeDats.Keys) foreach (string key in completeDats.Roms.Keys)
{ {
List<RomData> templist = RomManipulation.Merge(completeDats[key]); List<RomData> templist = RomManipulation.Merge(completeDats.Roms[key]);
foreach (RomData rom in templist) foreach (RomData rom in templist)
{ {
if (rom.Dupe == DupeType.None && rom.System == _currentNewMerged) if (rom.Dupe == DupeType.None && rom.System == _currentNewMerged)
@@ -175,9 +178,9 @@ namespace SabreTools
// Now create the Unneeded dictionary [(currentAllMerged)-(currentNewMerged)] // Now create the Unneeded dictionary [(currentAllMerged)-(currentNewMerged)]
_logger.User("Creating and populating Uneeded dictionary"); _logger.User("Creating and populating Uneeded dictionary");
Dictionary<string, List<RomData>> unneeded = new Dictionary<string, List<RomData>>(); Dictionary<string, List<RomData>> unneeded = new Dictionary<string, List<RomData>>();
foreach (string key in completeDats.Keys) foreach (string key in completeDats.Roms.Keys)
{ {
List<RomData> templist = RomManipulation.Merge(completeDats[key]); List<RomData> templist = RomManipulation.Merge(completeDats.Roms[key]);
foreach (RomData rom in templist) foreach (RomData rom in templist)
{ {
if (rom.Dupe == DupeType.None && rom.System == _currentAllMerged) if (rom.Dupe == DupeType.None && rom.System == _currentAllMerged)
@@ -198,23 +201,26 @@ namespace SabreTools
// Now create the New Missing dictionary [(Net New)+(currentMissingMerged-(Unneeded))] // Now create the New Missing dictionary [(Net New)+(currentMissingMerged-(Unneeded))]
_logger.User("Creating and populating New Missing dictionary"); _logger.User("Creating and populating New Missing dictionary");
Dictionary<string, List<RomData>> midMissing = new Dictionary<string, List<RomData>>(); DatData midMissing = new DatData
{
Roms = new Dictionary<string, List<RomData>>(),
};
midMissing = RomManipulation.ParseDict(_currentMissingMerged, 0, 0, midMissing, _logger); midMissing = RomManipulation.ParseDict(_currentMissingMerged, 0, 0, midMissing, _logger);
foreach (string key in unneeded.Keys) foreach (string key in unneeded.Keys)
{ {
if (midMissing.ContainsKey(key)) if (midMissing.Roms.ContainsKey(key))
{ {
midMissing[key].AddRange(unneeded[key]); midMissing.Roms[key].AddRange(unneeded[key]);
} }
else else
{ {
midMissing.Add(key, unneeded[key]); midMissing.Roms.Add(key, unneeded[key]);
} }
} }
Dictionary<string, List<RomData>> newMissing = new Dictionary<string, List<RomData>>(); Dictionary<string, List<RomData>> newMissing = new Dictionary<string, List<RomData>>();
foreach (string key in midMissing.Keys) foreach (string key in midMissing.Roms.Keys)
{ {
List<RomData> templist = RomManipulation.Merge(midMissing[key]); List<RomData> templist = RomManipulation.Merge(midMissing.Roms[key]);
foreach (RomData rom in templist) foreach (RomData rom in templist)
{ {
if (rom.Dupe == DupeType.None && rom.System == _currentMissingMerged) if (rom.Dupe == DupeType.None && rom.System == _currentMissingMerged)
@@ -258,11 +264,11 @@ namespace SabreTools
midHave.Add(key, newMissing[key]); midHave.Add(key, newMissing[key]);
} }
} }
foreach (string key in completeDats.Keys) foreach (string key in completeDats.Roms.Keys)
{ {
if (midHave.ContainsKey(key)) if (midHave.ContainsKey(key))
{ {
foreach (RomData rom in completeDats[key]) foreach (RomData rom in completeDats.Roms[key])
{ {
if (rom.System == _currentNewMerged) if (rom.System == _currentNewMerged)
{ {
@@ -273,7 +279,7 @@ namespace SabreTools
else else
{ {
List<RomData> roms = new List<RomData>(); List<RomData> roms = new List<RomData>();
foreach (RomData rom in completeDats[key]) foreach (RomData rom in completeDats.Roms[key])
{ {
if (rom.System == _currentNewMerged) if (rom.System == _currentNewMerged)
{ {
@@ -448,13 +454,16 @@ namespace SabreTools
{ {
// Now create the Have dictionary [(currentAllMerged)-(currentMissingMerged)] // Now create the Have dictionary [(currentAllMerged)-(currentMissingMerged)]
_logger.User("Creating and populating Have dictionary"); _logger.User("Creating and populating Have dictionary");
Dictionary<string, List<RomData>> midHave = new Dictionary<string, List<RomData>>(); DatData midHave = new DatData
{
Roms = new Dictionary<string, List<RomData>>(),
};
midHave = RomManipulation.ParseDict(_currentMissingMerged, 0, 0, midHave, _logger); midHave = RomManipulation.ParseDict(_currentMissingMerged, 0, 0, midHave, _logger);
midHave = RomManipulation.ParseDict(_currentAllMerged, 0, 0, midHave, _logger); midHave = RomManipulation.ParseDict(_currentAllMerged, 0, 0, midHave, _logger);
Dictionary<string, List<RomData>> have = new Dictionary<string, List<RomData>>(); Dictionary<string, List<RomData>> have = new Dictionary<string, List<RomData>>();
foreach (string key in midHave.Keys) foreach (string key in midHave.Roms.Keys)
{ {
List<RomData> templist = RomManipulation.Merge(midHave[key]); List<RomData> templist = RomManipulation.Merge(midHave.Roms[key]);
foreach (RomData rom in templist) foreach (RomData rom in templist)
{ {
if (rom.Dupe == DupeType.None && rom.System == _currentAllMerged) if (rom.Dupe == DupeType.None && rom.System == _currentAllMerged)
@@ -518,13 +527,16 @@ namespace SabreTools
{ {
// Now create the Have dictionary [(currentNewMerged)-(currentMissingMerged)] // Now create the Have dictionary [(currentNewMerged)-(currentMissingMerged)]
_logger.User("Creating and populating Have dictionary"); _logger.User("Creating and populating Have dictionary");
Dictionary<string, List<RomData>> midHave = new Dictionary<string, List<RomData>>(); DatData midHave = new DatData
{
Roms = new Dictionary<string, List<RomData>>(),
};
midHave = RomManipulation.ParseDict(_currentMissingMerged, 0, 0, midHave, _logger); midHave = RomManipulation.ParseDict(_currentMissingMerged, 0, 0, midHave, _logger);
midHave = RomManipulation.ParseDict(_currentNewMerged, 0, 0, midHave, _logger); midHave = RomManipulation.ParseDict(_currentNewMerged, 0, 0, midHave, _logger);
Dictionary<string, List<RomData>> have = new Dictionary<string, List<RomData>>(); Dictionary<string, List<RomData>> have = new Dictionary<string, List<RomData>>();
foreach (string key in midHave.Keys) foreach (string key in midHave.Roms.Keys)
{ {
List<RomData> templist = RomManipulation.Merge(midHave[key]); List<RomData> templist = RomManipulation.Merge(midHave.Roms[key]);
foreach (RomData rom in templist) foreach (RomData rom in templist)
{ {
if (rom.Dupe == DupeType.None && rom.System == _currentNewMerged) if (rom.Dupe == DupeType.None && rom.System == _currentNewMerged)

View File

@@ -375,22 +375,6 @@ namespace SabreTools.Helper
/// <param name="logger">Logger object for console and/or file output</param> /// <param name="logger">Logger object for console and/or file output</param>
/// <returns>DatData object representing the read-in data</returns> /// <returns>DatData object representing the read-in data</returns>
public static DatData ParseDict(string filename, int sysid, int srcid, DatData datdata, Logger logger) public static DatData ParseDict(string filename, int sysid, int srcid, DatData datdata, Logger logger)
{
Dictionary<string, List<RomData>> roms = ParseDict(filename, sysid, srcid, datdata.Roms, logger);
datdata.Roms = roms;
return datdata;
}
/// <summary>
/// Parse a DAT and return all found games and roms within
/// </summary>
/// <param name="filename">Name of the file to be parsed</param>
/// <param name="sysid">System ID for the DAT</param>
/// <param name="srcid">Source ID for the DAT</param>
/// <param name="dict">The dictionary to add found roms to</param>
/// <param name="logger">Logger object for console and/or file output</param>
/// <returns>Dictionary with "size-crc" key and List of RomData objects value representing the found data</returns>
public static Dictionary<string, List<RomData>> ParseDict(string filename, int sysid, int srcid, Dictionary<string, List<RomData>> dict, Logger logger)
{ {
XmlTextReader xtr = GetXmlTextReader(filename, logger); XmlTextReader xtr = GetXmlTextReader(filename, logger);
bool superdat = false, shouldbreak = false; bool superdat = false, shouldbreak = false;
@@ -415,14 +399,104 @@ namespace SabreTools.Helper
xtr.Read(); xtr.Read();
break; break;
case "header": case "header":
xtr.ReadToDescendant("name"); // We want to process the entire subtree of the header
string content = xtr.ReadElementContentAsString(); XmlReader headreader = xtr.ReadSubtree();
superdat = (content != null ? content.Contains(" - SuperDAT") : false);
while (xtr.Name != "header") if (headreader != null)
{ {
xtr.Read(); while (headreader.Read())
{
// We only want elements
if (headreader.NodeType != XmlNodeType.Element)
{
continue;
} }
xtr.Read();
// Get all header items (ONLY OVERWRITE IF THERE'S NO DATA)
switch (xtr.Name)
{
case "name":
string readname = headreader.ReadElementContentAsString();
datdata.Name = (datdata.Name == "" ? readname : "");
superdat = superdat || readname.Contains(" - SuperDAT");
break;
case "description":
datdata.Description = (datdata.Description == "" ? headreader.ReadElementContentAsString() : datdata.Description);
break;
case "category":
datdata.Category = (datdata.Category == "" ? headreader.ReadElementContentAsString() : datdata.Category);
break;
case "version":
datdata.Version = (datdata.Version == "" ? headreader.ReadElementContentAsString() : datdata.Version);
break;
case "date":
datdata.Date = (datdata.Date == "" ? headreader.ReadElementContentAsString() : datdata.Date);
break;
case "author":
datdata.Author = (datdata.Author == "" ? headreader.ReadElementContentAsString() : datdata.Author);
break;
case "email":
datdata.Email = (datdata.Email == "" ? headreader.ReadElementContentAsString() : datdata.Email);
break;
case "homepage":
datdata.Homepage = (datdata.Homepage == "" ? headreader.ReadElementContentAsString() : datdata.Homepage);
break;
case "url":
datdata.Url = (datdata.Url == "" ? headreader.ReadElementContentAsString() : datdata.Url);
break;
case "comment":
datdata.Comment = (datdata.Comment == "" ? headreader.ReadElementContentAsString() : datdata.Comment);
break;
case "clrmamepro":
if (headreader.GetAttribute("forcemerging") != null)
{
switch (headreader.GetAttribute("forcemerging"))
{
case "split":
datdata.ForceMerging = ForceMerging.Split;
break;
case "none":
datdata.ForceMerging = ForceMerging.None;
break;
case "full":
datdata.ForceMerging = ForceMerging.Full;
break;
}
}
if (headreader.GetAttribute("forcenodump") != null)
{
switch (headreader.GetAttribute("forcenodump"))
{
case "obsolete":
datdata.ForceNodump = ForceNodump.Obsolete;
break;
case "required":
datdata.ForceNodump = ForceNodump.Required;
break;
case "ignore":
datdata.ForceNodump = ForceNodump.Ignore;
break;
}
}
if (headreader.GetAttribute("forcepacking") != null)
{
switch (headreader.GetAttribute("forcepacking"))
{
case "zip":
datdata.ForcePacking = ForcePacking.Zip;
break;
case "unzip":
datdata.ForcePacking = ForcePacking.Unzip;
break;
}
}
break;
}
}
}
// Skip the header node now that we've processed it
xtr.Skip();
break; break;
case "machine": case "machine":
case "game": case "game":
@@ -491,11 +565,11 @@ namespace SabreTools.Helper
// If the rom is continue or ignore, add the size to the previous rom // If the rom is continue or ignore, add the size to the previous rom
if (xtr.GetAttribute("loadflag") == "continue" || xtr.GetAttribute("loadflag") == "ignore") if (xtr.GetAttribute("loadflag") == "continue" || xtr.GetAttribute("loadflag") == "ignore")
{ {
int index = dict[key].Count() - 1; int index = datdata.Roms[key].Count() - 1;
RomData lastrom = dict[key][index]; RomData lastrom = datdata.Roms[key][index];
lastrom.Size += size; lastrom.Size += size;
dict[key].RemoveAt(index); datdata.Roms[key].RemoveAt(index);
dict[key].Add(lastrom); datdata.Roms[key].Add(lastrom);
continue; continue;
} }
@@ -548,15 +622,15 @@ namespace SabreTools.Helper
System = filename, System = filename,
}; };
if (dict.ContainsKey(key)) if (datdata.Roms.ContainsKey(key))
{ {
dict[key].Add(value); datdata.Roms[key].Add(value);
} }
else else
{ {
List<RomData> newvalue = new List<RomData>(); List<RomData> newvalue = new List<RomData>();
newvalue.Add(value); newvalue.Add(value);
dict.Add(key, newvalue); datdata.Roms.Add(key, newvalue);
} }
} }
break; break;
@@ -583,7 +657,7 @@ namespace SabreTools.Helper
} }
} }
return dict; return datdata;
} }
/// <summary> /// <summary>

View File

@@ -34,9 +34,12 @@ namespace SabreTools
long size = 0; long size = 0;
foreach (string filename in inputs) foreach (string filename in inputs)
{ {
Dictionary<string, List<RomData>> roms = new Dictionary<string, List<RomData>>(); DatData datdata = new DatData
roms = RomManipulation.ParseDict(filename, 0, 0, roms, logger); {
foreach (List<RomData> romlist in roms.Values) Roms = new Dictionary<string, List<RomData>>(),
};
datdata = RomManipulation.ParseDict(filename, 0, 0, datdata, logger);
foreach (List<RomData> romlist in datdata.Roms.Values)
{ {
foreach (RomData rom in romlist) foreach (RomData rom in romlist)
{ {