2016-03-24 14:03:22 -07:00
|
|
|
|
using System.Linq;
|
2016-03-19 02:16:26 -07:00
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
|
using System.Xml.Linq;
|
|
|
|
|
|
|
2016-03-29 13:48:10 -07:00
|
|
|
|
namespace SabreTools.Helper
|
2016-03-19 02:16:26 -07:00
|
|
|
|
{
|
2016-03-29 14:49:03 -07:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Provide DAT conversion functionality
|
|
|
|
|
|
/// </summary>
|
2016-03-19 02:16:26 -07:00
|
|
|
|
class Converters
|
|
|
|
|
|
{
|
2016-03-29 14:49:03 -07:00
|
|
|
|
// Regex matching patterns
|
2016-03-19 02:16:26 -07:00
|
|
|
|
private static string _headerPattern = @"(^.*?) \($";
|
|
|
|
|
|
private static string _romPattern = @"^\s+((?:rom)|(?:disk)) \( (name) ""(.*?)"" (?:(size) (.*?) )?(?:(crc) (.*?))?(?:(md5) (.*?) )?(?:(sha1) (.*?) )?\)";
|
|
|
|
|
|
private static string _itemPattern = @"^\s+(.*?) ""(.*?)""";
|
|
|
|
|
|
private static string _endPattern = @"^\s*\)\s*$";
|
|
|
|
|
|
|
2016-03-29 14:49:03 -07:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Convert a RomVault style DAT to an XML derived DAT
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="filecontents">Array of strings representing the input file</param>
|
|
|
|
|
|
/// <returns>XElement representing the output XML DAT file</returns>
|
2016-03-19 02:16:26 -07:00
|
|
|
|
public static XElement RomVaultToXML (string[] filecontents)
|
|
|
|
|
|
{
|
|
|
|
|
|
XElement elem = new XElement("datafile");
|
|
|
|
|
|
|
|
|
|
|
|
bool block = false;
|
|
|
|
|
|
for (int k = 0; k < filecontents.Length; k++)
|
|
|
|
|
|
{
|
|
|
|
|
|
string line = filecontents[k];
|
|
|
|
|
|
|
|
|
|
|
|
// If the line is the header or a game
|
|
|
|
|
|
if (Regex.IsMatch(line, _headerPattern))
|
|
|
|
|
|
{
|
|
|
|
|
|
GroupCollection gc = Regex.Match(line, _headerPattern).Groups;
|
|
|
|
|
|
|
|
|
|
|
|
if (gc[1].Value == "clrmamepro" || gc[1].Value == "romvault")
|
|
|
|
|
|
{
|
|
|
|
|
|
elem.Add(new XElement("header"));
|
|
|
|
|
|
elem = elem.Elements("header").Last();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
elem.Add(new XElement(gc[1].Value));
|
|
|
|
|
|
elem = elem.Elements(gc[1].Value).Last();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
block = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// If the line is a rom or disk and we're in a block
|
|
|
|
|
|
else if (Regex.IsMatch(line, _romPattern) && block)
|
|
|
|
|
|
{
|
|
|
|
|
|
GroupCollection gc = Regex.Match(line, _romPattern).Groups;
|
|
|
|
|
|
|
|
|
|
|
|
XElement temp = new XElement(gc[1].Value);
|
|
|
|
|
|
|
|
|
|
|
|
// Loop over all attributes and add them if possible
|
2016-03-31 13:53:26 -07:00
|
|
|
|
for (int i = 2; i < gc.Count - 1; i++)
|
2016-03-19 02:16:26 -07:00
|
|
|
|
{
|
2016-03-31 13:53:26 -07:00
|
|
|
|
if (i + 1 < gc.Count && gc[i].Value != "")
|
2016-03-19 02:16:26 -07:00
|
|
|
|
{
|
2016-03-31 13:53:26 -07:00
|
|
|
|
temp.SetAttributeValue(gc[i].Value, gc[i+1].Value);
|
2016-03-19 02:16:26 -07:00
|
|
|
|
i++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
elem.Add(new XElement(temp));
|
|
|
|
|
|
}
|
|
|
|
|
|
// If the line is anything but a rom or disk and we're in a block
|
|
|
|
|
|
else if (Regex.IsMatch(line, _itemPattern) && block)
|
|
|
|
|
|
{
|
|
|
|
|
|
GroupCollection gc = Regex.Match(line, _itemPattern).Groups;
|
|
|
|
|
|
|
|
|
|
|
|
if (gc[1].Value == "name" && elem.Name != "header")
|
|
|
|
|
|
{
|
|
|
|
|
|
elem.SetAttributeValue(gc[1].Value, gc[2].Value);
|
|
|
|
|
|
elem.Add(new XElement("description", gc[2].Value));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
elem.Add(new XElement(gc[1].Value, gc[2].Value));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// If we find an end bracket that's not associated with anything else, the block is done
|
|
|
|
|
|
else if (Regex.IsMatch(line, _endPattern) && block)
|
|
|
|
|
|
{
|
|
|
|
|
|
block = false;
|
|
|
|
|
|
elem = elem.Parent;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return elem;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|