Add support for inverted CRC flag

This commit is contained in:
Matt Nadareski
2020-07-28 17:00:19 -07:00
parent 1f25dc4bac
commit e23596983a
9 changed files with 70 additions and 2 deletions

View File

@@ -480,6 +480,7 @@ namespace SabreTools.Library.DatFiles
Field.Writable,
Field.Optional,
Field.Status,
Field.Inverted,
Field.CRC,
Field.MD5,
@@ -682,6 +683,12 @@ namespace SabreTools.Library.DatFiles
rom.ItemStatus = romDupe.ItemStatus;
}
if (updateFields.Contains(Field.Inverted))
{
if (newDatItem.ItemType == ItemType.Rom)
rom.Inverted = romDupe.Inverted;
}
#endregion
#region Hash fields

View File

@@ -254,6 +254,11 @@ namespace SabreTools.Library.DatFiles
/// </summary>
private FilterItem<string> Offset = new FilterItem<string>();
/// <summary>
/// Include or exclude offsets
/// </summary>
private FilterItem<bool?> Inverted = new FilterItem<bool?>();
#endregion
#endregion // Private instance variables
@@ -779,6 +784,13 @@ namespace SabreTools.Library.DatFiles
Offset.PositiveSet.Add(value);
break;
case Field.Inverted:
if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
Inverted.Neutral = false;
else
Inverted.Neutral = true;
break;
#endregion
}
}
@@ -1318,6 +1330,10 @@ namespace SabreTools.Library.DatFiles
if (this.Optional.MatchesNeutral(null, rom.Optional) == false)
return false;
// Filter on inverted
if (this.Inverted.MatchesNeutral(null, rom.Inverted) == false)
return false;
break;
case ItemType.Sample:
@@ -2268,6 +2284,11 @@ namespace SabreTools.Library.DatFiles
if (item.ItemType == ItemType.Rom)
(item as Rom).Offset = null;
}
if (field == Field.Inverted)
{
if (item.ItemType == ItemType.Rom)
(item as Rom).Inverted = null;
}
}
items[j] = item;

View File

@@ -492,7 +492,8 @@ namespace SabreTools.Library.DatFiles
// Prepare internal variables
bool? def = null,
writable = null,
optional = null;
optional = null,
inverted = null;
long size = -1;
long? areaSize = null;
string name = null,
@@ -588,6 +589,7 @@ namespace SabreTools.Library.DatFiles
(datItem as Rom).Date = date;
(datItem as Rom).ItemStatus = itemStatus ?? ItemStatus.None;
(datItem as Rom).Optional = optional;
(datItem as Rom).Inverted = inverted;
}
ParseAddHelper(datItem);
@@ -733,6 +735,10 @@ namespace SabreTools.Library.DatFiles
bios = jtr.ReadAsString();
break;
case "inverted":
inverted = jtr.ReadAsBoolean();
break;
default:
break;
}
@@ -1408,6 +1414,11 @@ namespace SabreTools.Library.DatFiles
jtw.WritePropertyName("optional");
jtw.WriteValue(rom.Optional);
}
if (!string.IsNullOrWhiteSpace(rom.GetField(Field.Inverted, Header.ExcludeFields)))
{
jtw.WritePropertyName("inverted");
jtw.WriteValue(rom.Inverted);
}
break;
case ItemType.Sample:

View File

@@ -447,6 +447,7 @@ namespace SabreTools.Library.DatFiles
MergeTag = reader.GetAttribute("merge"),
ItemStatus = reader.GetAttribute("status").AsItemStatus(),
Date = Sanitizer.CleanDate(reader.GetAttribute("date")),
Inverted = reader.GetAttribute("inverted").AsYesNo(),
IndexId = indexId,
IndexSource = filename,
@@ -1033,6 +1034,8 @@ namespace SabreTools.Library.DatFiles
xtw.WriteAttributeString("date", rom.Date);
if (!Header.ExcludeFields.Contains(Field.Status) && rom.ItemStatus != ItemStatus.None)
xtw.WriteAttributeString("status", rom.ItemStatus.ToString().ToLowerInvariant());
if (!Header.ExcludeFields.Contains(Field.Inverted) && rom.Inverted != null)
xtw.WriteAttributeString("inverted", rom.Inverted.ToString().ToLowerInvariant());
xtw.WriteEndElement();
break;

View File

@@ -80,7 +80,8 @@ namespace SabreTools.Library.DatFiles
bool? def = null,
writable = null,
optional = null;
optional = null,
inverted = null;
string name = null,
partName = null,
partInterface = null,
@@ -410,6 +411,10 @@ namespace SabreTools.Library.DatFiles
offset = string.IsNullOrWhiteSpace(value) ? offset : value;
break;
case "DatItem.Inverted":
offset = string.IsNullOrWhiteSpace(value) ? inverted : value;
break;
#endregion
case "INVALID":
@@ -544,6 +549,7 @@ namespace SabreTools.Library.DatFiles
Date = date,
ItemStatus = status,
Optional = optional,
Inverted = inverted,
IndexId = indexId,
IndexSource = filename,
@@ -844,6 +850,9 @@ namespace SabreTools.Library.DatFiles
case "offset":
return "DatItem.Offset";
case "inverted":
return "DatItem.Inverted";
#endregion
default:

View File

@@ -810,6 +810,10 @@ namespace SabreTools.Library.DatItems
if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).Offset;
break;
case Field.Inverted:
if (ItemType == ItemType.Rom)
fieldValue = (this as Rom).Inverted?.ToString();
break;
case Field.NULL:
default:

View File

@@ -148,6 +148,12 @@ namespace SabreTools.Library.DatItems
[JsonProperty("optional")]
public bool? Optional { get; set; }
/// <summary>
/// Determine if the CRC32 hash is inverted
/// </summary>
[JsonProperty("inverted")]
public bool? Inverted { get; set; }
#endregion
#region Constructors

View File

@@ -408,6 +408,7 @@
Size,
CRC,
Offset,
Inverted,
}
/// <summary>

View File

@@ -182,6 +182,8 @@ namespace SabreTools.Library.Tools
return Field.Index;
case "infos":
return Field.Infos;
case "inverted":
return Field.Inverted;
case "itemname":
case "item-name":
case "name":
@@ -561,8 +563,10 @@ namespace SabreTools.Library.Tools
switch (yesno?.ToLowerInvariant())
{
case "yes":
case "true":
return true;
case "no":
case "false":
return false;
case "partial":
default:
@@ -572,7 +576,9 @@ namespace SabreTools.Library.Tools
return yesno?.ToLowerInvariant() switch
{
"yes" => true,
"true" => true,
"no" => false,
"false" => false,
"partial" => null,
_ => null,
};