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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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