From ad0e5a7f0f11287bec9d35dde683f24c80ee94b2 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Thu, 3 Sep 2020 21:39:16 -0700 Subject: [PATCH] Add and use Endianness enum --- SabreTools.Library/DatFiles/SoftwareList.cs | 4 +- SabreTools.Library/DatItems/Auxiliary.cs | 2 +- SabreTools.Library/DatItems/Enums.cs | 16 ++++++ SabreTools.Library/DatItems/Machine.cs | 5 -- SabreTools.Library/DatItems/Rom.cs | 10 ++-- SabreTools.Library/Filtering/Filter.cs | 6 +-- SabreTools.Library/Tools/Converters.cs | 54 +++++++++++++++++++++ 7 files changed, 81 insertions(+), 16 deletions(-) diff --git a/SabreTools.Library/DatFiles/SoftwareList.cs b/SabreTools.Library/DatFiles/SoftwareList.cs index 5baf228c..b98d79c1 100644 --- a/SabreTools.Library/DatFiles/SoftwareList.cs +++ b/SabreTools.Library/DatFiles/SoftwareList.cs @@ -257,7 +257,7 @@ namespace SabreTools.Library.DatFiles Name = reader.GetAttribute("name"), Size = Sanitizer.CleanSize(reader.GetAttribute("size")), Width = reader.GetAttribute("width"), - Endianness = reader.GetAttribute("endianness"), + Endianness = reader.GetAttribute("endianness").AsEndianness(), }; List roms = ReadDataArea(reader.ReadSubtree(), dataArea); @@ -770,7 +770,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteRequiredAttributeString("name", dataAreaName); xtw.WriteOptionalAttributeString("size", rom.DataArea?.Size.ToString()); xtw.WriteOptionalAttributeString("width", rom.DataArea?.Width); - xtw.WriteOptionalAttributeString("endianness", rom.DataArea?.Endianness); + xtw.WriteOptionalAttributeString("endianness", rom.DataArea?.Endianness.FromEndianness()); xtw.WriteStartElement("rom"); xtw.WriteRequiredAttributeString("name", rom.Name); diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs index d2f0e8a1..3ad205d1 100644 --- a/SabreTools.Library/DatItems/Auxiliary.cs +++ b/SabreTools.Library/DatItems/Auxiliary.cs @@ -65,7 +65,7 @@ namespace SabreTools.Library.DatItems /// Byte endianness of the area /// [JsonProperty("endianness", DefaultValueHandling = DefaultValueHandling.Ignore)] - public string Endianness { get; set; } // TODO: (big|little) "little" + public Endianness Endianness { get; set; } } /// diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs index b3cd3e3a..c4113218 100644 --- a/SabreTools.Library/DatItems/Enums.cs +++ b/SabreTools.Library/DatItems/Enums.cs @@ -50,6 +50,22 @@ namespace SabreTools.Library.DatItems External = 1 << 3, } + /// + /// Determine the endianness + /// + [Flags] + public enum Endianness + { + /// + /// This is a fake flag that is used for filter only + /// + NULL = 0, + + // TODO: (big|little) "little" + Big = 1 << 0, + Little = 1 << 1, + } + /// /// Determine the emulation status /// diff --git a/SabreTools.Library/DatItems/Machine.cs b/SabreTools.Library/DatItems/Machine.cs index f10b85fd..23944f6a 100644 --- a/SabreTools.Library/DatItems/Machine.cs +++ b/SabreTools.Library/DatItems/Machine.cs @@ -665,9 +665,6 @@ namespace SabreTools.Library.DatItems if (filter.Machine_Runnable.MatchesNegative(Runnable.NULL, Runnable) == true) return false; - // TODO: Inputs - // TODO: Inputs.Controls - #endregion // ListXML #region Logiqx @@ -781,7 +778,6 @@ namespace SabreTools.Library.DatItems /// Remove fields from the Machine /// /// List of Fields to remove - /// TODO: Add new ListXML and SoftwareList fields public void RemoveFields(List fields) { #region Common @@ -928,7 +924,6 @@ namespace SabreTools.Library.DatItems /// DatItem to pull new information from /// List of Fields representing what should be updated /// True if descriptions should only be replaced if the game name is the same, false otherwise - /// TODO: Add new ListXML and SoftwareList fields public void ReplaceFields(Machine machine, List fields, bool onlySame) { #region Common diff --git a/SabreTools.Library/DatItems/Rom.cs b/SabreTools.Library/DatItems/Rom.cs index 5a552a11..a6ecb513 100644 --- a/SabreTools.Library/DatItems/Rom.cs +++ b/SabreTools.Library/DatItems/Rom.cs @@ -397,7 +397,7 @@ namespace SabreTools.Library.DatItems if (DataArea == null) DataArea = new DataArea(); - DataArea.Endianness = mappings[Field.DatItem_AreaEndianness]; + DataArea.Endianness = mappings[Field.DatItem_AreaEndianness].AsEndianness(); } if (mappings.Keys.Contains(Field.DatItem_LoadFlag)) @@ -913,9 +913,9 @@ namespace SabreTools.Library.DatItems return false; // Filter on area endianness - if (filter.DatItem_AreaEndianness.MatchesPositiveSet(DataArea?.Endianness) == false) + if (filter.DatItem_AreaEndianness.MatchesPositive(Endianness.NULL, DataArea?.Endianness ?? Endianness.NULL) == false) return false; - if (filter.DatItem_AreaEndianness.MatchesNegativeSet(DataArea?.Endianness) == true) + if (filter.DatItem_AreaEndianness.MatchesNegative(Endianness.NULL, DataArea?.Endianness ?? Endianness.NULL) == true) return false; // Filter on load flag @@ -1069,7 +1069,7 @@ namespace SabreTools.Library.DatItems if (fields.Contains(Field.DatItem_AreaEndianness)) { if (DataArea != null) - DataArea.Endianness = null; + DataArea.Endianness = Endianness.NULL; } if (fields.Contains(Field.DatItem_LoadFlag)) @@ -1317,7 +1317,7 @@ namespace SabreTools.Library.DatItems if (DataArea == null) DataArea = new DataArea(); - DataArea.Endianness = newItem.DataArea?.Endianness; + DataArea.Endianness = newItem.DataArea?.Endianness ?? Endianness.NULL; } if (fields.Contains(Field.DatItem_LoadFlag)) diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs index c5d34814..f7acbcdf 100644 --- a/SabreTools.Library/Filtering/Filter.cs +++ b/SabreTools.Library/Filtering/Filter.cs @@ -137,7 +137,7 @@ namespace SabreTools.Library.Filtering public FilterItem DatItem_AreaName { get; private set; } = new FilterItem(); public FilterItem DatItem_AreaSize { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null }; public FilterItem DatItem_AreaWidth { get; private set; } = new FilterItem(); - public FilterItem DatItem_AreaEndianness { get; private set; } = new FilterItem(); + public FilterItem DatItem_AreaEndianness { get; private set; } = new FilterItem() { Positive = Endianness.NULL, Negative = Endianness.NULL }; public FilterItem DatItem_LoadFlag { get; private set; } = new FilterItem() { Positive = LoadFlag.NULL, Negative = LoadFlag.NULL }; public FilterItem DatItem_Part_Name { get; private set; } = new FilterItem(); public FilterItem DatItem_Part_Interface { get; private set; } = new FilterItem(); @@ -921,9 +921,9 @@ namespace SabreTools.Library.Filtering case Field.DatItem_AreaEndianness: if (negate) - DatItem_AreaEndianness.NegativeSet.Add(value); + DatItem_AreaEndianness.Negative |= value.AsEndianness(); else - DatItem_AreaEndianness.PositiveSet.Add(value); + DatItem_AreaEndianness.Positive |= value.AsEndianness(); break; case Field.DatItem_LoadFlag: diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs index ce79c2b9..1683f090 100644 --- a/SabreTools.Library/Tools/Converters.cs +++ b/SabreTools.Library/Tools/Converters.cs @@ -208,6 +208,33 @@ namespace SabreTools.Library.Tools #endif } + /// + /// Get Endianness value from input string + /// + /// String to get value from + /// Endianness value corresponding to the string + public static Endianness AsEndianness(this string endianness) + { +#if NET_FRAMEWORK + switch (endianness?.ToLowerInvariant()) + { + case "big": + return Endianness.Big; + case "little": + return Endianness.Little; + default: + return Endianness.NULL; + } +#else + return endianness?.ToLowerInvariant() switch + { + "big" => Endianness.Big, + "little" => Endianness.Little, + _ => Endianness.NULL, + }; +#endif + } + /// /// Get FeatureStatus value from input string /// @@ -2207,6 +2234,33 @@ namespace SabreTools.Library.Tools #endif } + /// + /// Get string value from input Endianness + /// + /// Endianness to get value from + /// String value corresponding to the Endianness + public static string FromEndianness(this Endianness endianness) + { +#if NET_FRAMEWORK + switch (endianness) + { + case Endianness.Big: + return "big"; + case Endianness.Little: + return "little"; + default: + return null; + } +#else + return endianness switch + { + Endianness.Big => "big", + Endianness.Little => "little", + _ => null, + }; +#endif + } + /// /// Get string value from input FeatureStatus ///