diff --git a/SabreTools.DatTools/Modification.cs b/SabreTools.DatTools/Modification.cs index 5eeddaec..9b925c93 100644 --- a/SabreTools.DatTools/Modification.cs +++ b/SabreTools.DatTools/Modification.cs @@ -187,7 +187,7 @@ namespace SabreTools.DatTools public static bool ApplyFilters(DatFile datFile, Cleaner cleaner, bool perMachine = false, bool throwOnError = false) { // If we have a null cleaner or filters, return false - if (cleaner == null || cleaner.DatHeaderFilter == null || cleaner.MachineFilter == null || cleaner.DatItemFilter == null) + if (cleaner == null || cleaner.MachineFilter == null || cleaner.DatItemFilter == null) return false; // If we're filtering per machine, bucket by machine first diff --git a/SabreTools.Filtering/Cleaner.cs b/SabreTools.Filtering/Cleaner.cs index de469664..7beff3b0 100644 --- a/SabreTools.Filtering/Cleaner.cs +++ b/SabreTools.Filtering/Cleaner.cs @@ -37,11 +37,6 @@ namespace SabreTools.Filtering #region Filter Fields - /// - /// Filter for DatHeader fields - /// - public DatHeaderFilter DatHeaderFilter { get; set; } - /// /// Filter for DatItem fields /// @@ -186,7 +181,6 @@ namespace SabreTools.Filtering public void PopulateFiltersFromList(List filters) { // Instantiate the filters, if necessary - DatHeaderFilter ??= new DatHeaderFilter(); MachineFilter ??= new MachineFilter(); DatItemFilter ??= new DatItemFilter(); @@ -202,14 +196,6 @@ namespace SabreTools.Filtering if (field == null && value == null) continue; - // DatHeader fields - DatHeaderField datHeaderField = field.AsDatHeaderField(); - if (datHeaderField != DatHeaderField.NULL) - { - DatHeaderFilter.SetFilter(datHeaderField, value, negate); - continue; - } - // Machine fields MachineField machineField = field.AsMachineField(); if (machineField != MachineField.NULL) @@ -227,7 +213,7 @@ namespace SabreTools.Filtering } // If we didn't match anything, log an error - logger.Warning($"The value {field} did not match any known field names. Please check the wiki for more details on supported field names."); + logger.Warning($"The value {field} did not match any filterable field names. Please check the wiki for more details on supported field names."); } } @@ -478,1322 +464,19 @@ namespace SabreTools.Filtering /// Check to see if a DatItem passes the filters /// /// DatItem to check - /// True if this is a subitem, false otherwise /// True if the item passed the filter, false otherwise - /// TODO: Name can be made into a common one if name exists - public bool PassesFilters(DatItem datItem, bool sub = false) + public bool PassesFilters(DatItem datItem) { + // Null item means it will never pass if (datItem == null) return false; - #region Common - - // Filter on machine fields - if (!PassesFilters(datItem.Machine)) + // Filter on Machine fields + if (!MachineFilter.PassesFilters(datItem.Machine)) return false; - // Filters for if we're a top-level item - if (!sub) - { - // Filter on item type - if (!Filter.PassStringFilter(DatItemFilter.Type, datItem.ItemType.ToString())) - return false; - } - - #endregion - - #region Adjuster - - if (datItem is Adjuster adjuster) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, adjuster.Name)) - return false; - - // Filter on default - if (!Filter.PassBoolFilter(DatItemFilter.Default, adjuster.Default)) - return false; - - // Filter on individual conditions - if (adjuster.ConditionsSpecified) - { - foreach (Condition condition in adjuster.Conditions) - { - if (!PassesFilters(condition, true)) - return false; - } - } - } - - #endregion - - #region Analog - - else if (datItem is Analog analog) - { - // Filter on mask - if (!Filter.PassStringFilter(DatItemFilter.Analog_Mask, analog.Mask)) - return false; - } - - #endregion - - #region Archive - - else if (datItem is Archive archive) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, archive.Name)) - return false; - } - - #endregion - - #region BiosSet - - else if (datItem is BiosSet biosSet) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, biosSet.Name)) - return false; - - // Filter on description - if (!Filter.PassStringFilter(DatItemFilter.Description, biosSet.Description)) - return false; - - // Filter on default - if (!Filter.PassBoolFilter(DatItemFilter.Default, biosSet.Default)) - return false; - } - - #endregion - - #region Chip - - else if (datItem is Chip chip) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, chip.Name)) - return false; - - // DatItem_Tag - if (!Filter.PassStringFilter(DatItemFilter.Tag, chip.Tag)) - return false; - - // DatItem_ChipType - if (DatItemFilter.ChipType.MatchesPositive(ChipType.NULL, chip.ChipType) == false) - return false; - if (DatItemFilter.ChipType.MatchesNegative(ChipType.NULL, chip.ChipType) == true) - return false; - - // DatItem_Clock - if (!Filter.PassLongFilter(DatItemFilter.Clock, chip.Clock)) - return false; - } - - #endregion - - #region Condition - - else if (datItem is Condition condition) - { - if (sub) - { - // Filter on tag - if (!Filter.PassStringFilter(DatItemFilter.Condition_Tag, condition.Tag)) - return false; - - // Filter on mask - if (!Filter.PassStringFilter(DatItemFilter.Condition_Mask, condition.Mask)) - return false; - - // Filter on relation - if (DatItemFilter.Condition_Relation.MatchesPositive(Relation.NULL, condition.Relation) == false) - return false; - if (DatItemFilter.Condition_Relation.MatchesNegative(Relation.NULL, condition.Relation) == true) - return false; - - // Filter on value - if (!Filter.PassStringFilter(DatItemFilter.Condition_Value, condition.Value)) - return false; - } - else - { - // Filter on tag - if (!Filter.PassStringFilter(DatItemFilter.Tag, condition.Tag)) - return false; - - // Filter on mask - if (!Filter.PassStringFilter(DatItemFilter.Mask, condition.Mask)) - return false; - - // Filter on relation - if (DatItemFilter.Relation.MatchesPositive(Relation.NULL, condition.Relation) == false) - return false; - if (DatItemFilter.Relation.MatchesNegative(Relation.NULL, condition.Relation) == true) - return false; - - // Filter on value - if (!Filter.PassStringFilter(DatItemFilter.Value, condition.Value)) - return false; - } - } - - #endregion - - #region Configuration - - else if (datItem is Configuration configuration) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, configuration.Name)) - return false; - - // Filter on tag - if (!Filter.PassStringFilter(DatItemFilter.Tag, configuration.Tag)) - return false; - - // Filter on mask - if (!Filter.PassStringFilter(DatItemFilter.Mask, configuration.Mask)) - return false; - - // Filter on individual conditions - if (configuration.ConditionsSpecified) - { - foreach (Condition subCondition in configuration.Conditions) - { - if (!PassesFilters(subCondition, true)) - return false; - } - } - - // Filter on individual locations - if (configuration.LocationsSpecified) - { - foreach (Location subLocation in configuration.Locations) - { - if (!PassesFilters(subLocation, true)) - return false; - } - } - - // Filter on individual conditions - if (configuration.SettingsSpecified) - { - foreach (Setting subSetting in configuration.Settings) - { - if (!PassesFilters(subSetting, true)) - return false; - } - } - } - - #endregion - - #region Control - - else if (datItem is Control control) - { - // Filter on control type - if (DatItemFilter.Control_Type.MatchesPositive(ControlType.NULL, control.ControlType) == false) - return false; - if (DatItemFilter.Control_Type.MatchesNegative(ControlType.NULL, control.ControlType) == true) - return false; - - // Filter on player - if (!Filter.PassLongFilter(DatItemFilter.Control_Player, control.Player)) - return false; - - // Filter on buttons - if (!Filter.PassLongFilter(DatItemFilter.Control_Buttons, control.Buttons)) - return false; - - // Filter on reqbuttons - if (!Filter.PassLongFilter(DatItemFilter.Control_ReqButtons, control.RequiredButtons)) - return false; - - // Filter on minimum - if (!Filter.PassLongFilter(DatItemFilter.Control_Minimum, control.Minimum)) - return false; - - // Filter on maximum - if (!Filter.PassLongFilter(DatItemFilter.Control_Maximum, control.Maximum)) - return false; - - // Filter on sensitivity - if (!Filter.PassLongFilter(DatItemFilter.Control_Sensitivity, control.Sensitivity)) - return false; - - // Filter on keydelta - if (!Filter.PassLongFilter(DatItemFilter.Control_KeyDelta, control.KeyDelta)) - return false; - - // Filter on reverse - if (!Filter.PassBoolFilter(DatItemFilter.Control_Reverse, control.Reverse)) - return false; - - // Filter on ways - if (!Filter.PassStringFilter(DatItemFilter.Control_Ways, control.Ways)) - return false; - - // Filter on ways2 - if (!Filter.PassStringFilter(DatItemFilter.Control_Ways2, control.Ways2)) - return false; - - // Filter on ways3 - if (!Filter.PassStringFilter(DatItemFilter.Control_Ways3, control.Ways3)) - return false; - } - - #endregion - - #region DataArea - - else if (datItem is DataArea dataArea) - { - // Filter on area name - if (!Filter.PassStringFilter(DatItemFilter.AreaName, dataArea.Name)) - return false; - - // Filter on area size - if (!Filter.PassLongFilter(DatItemFilter.AreaSize, dataArea.Size)) - return false; - - // Filter on area width - if (!Filter.PassLongFilter(DatItemFilter.AreaWidth, dataArea.Width)) - return false; - - // Filter on area endianness - if (DatItemFilter.AreaEndianness.MatchesPositive(Endianness.NULL, dataArea.Endianness) == false) - return false; - if (DatItemFilter.AreaEndianness.MatchesNegative(Endianness.NULL, dataArea.Endianness) == true) - return false; - } - - #endregion - - #region Device - - else if (datItem is Device device) - { - // Filter on device type - if (DatItemFilter.DeviceType.MatchesPositive(DeviceType.NULL, device.DeviceType) == false) - return false; - if (DatItemFilter.DeviceType.MatchesNegative(DeviceType.NULL, device.DeviceType) == true) - return false; - - // Filter on tag - if (!Filter.PassStringFilter(DatItemFilter.Tag, device.Tag)) - return false; - - // Filter on fixed image - if (!Filter.PassStringFilter(DatItemFilter.FixedImage, device.FixedImage)) - return false; - - // Filter on mandatory - if (!Filter.PassLongFilter(DatItemFilter.Mandatory, device.Mandatory)) - return false; - - // Filter on interface - if (!Filter.PassStringFilter(DatItemFilter.Interface, device.Interface)) - return false; - - // Filter on individual instances - if (device.InstancesSpecified) - { - foreach (Instance subInstance in device.Instances) - { - if (!PassesFilters(subInstance, true)) - return false; - } - } - - // Filter on individual extensions - if (device.ExtensionsSpecified) - { - foreach (Extension subExtension in device.Extensions) - { - if (!PassesFilters(subExtension, true)) - return false; - } - } - } - - #endregion - - #region DeviceReference - - else if (datItem is DeviceReference deviceReference) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, deviceReference.Name)) - return false; - } - - #endregion - - #region DipSwitch - - else if (datItem is DipSwitch dipSwitch) - { - #region Common - - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, dipSwitch.Name)) - return false; - - // Filter on tag - if (!Filter.PassStringFilter(DatItemFilter.Tag, dipSwitch.Tag)) - return false; - - // Filter on mask - if (!Filter.PassStringFilter(DatItemFilter.Mask, dipSwitch.Mask)) - return false; - - // Filter on individual conditions - if (dipSwitch.ConditionsSpecified) - { - foreach (Condition subCondition in dipSwitch.Conditions) - { - if (!PassesFilters(subCondition, true)) - return false; - } - } - - // Filter on individual locations - if (dipSwitch.LocationsSpecified) - { - foreach (Location subLocation in dipSwitch.Locations) - { - if (!PassesFilters(subLocation, true)) - return false; - } - } - - // Filter on individual conditions - if (dipSwitch.ValuesSpecified) - { - foreach (Setting subValue in dipSwitch.Values) - { - if (!PassesFilters(subValue, true)) - return false; - } - } - - #endregion - - #region SoftwareList - - // Filter on Part - if (dipSwitch.PartSpecified) - { - if (!PassesFilters(dipSwitch.Part, true)) - return false; - } - - #endregion - } - - #endregion - - #region Disk - - else if (datItem is Disk disk) - { - #region Common - - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, disk.Name)) - return false; - - // Filter on MD5 - if (!Filter.PassStringFilter(DatItemFilter.MD5, disk.MD5)) - return false; - - // Filter on SHA-1 - if (!Filter.PassStringFilter(DatItemFilter.SHA1, disk.SHA1)) - return false; - - // Filter on merge tag - if (!Filter.PassStringFilter(DatItemFilter.Merge, disk.MergeTag)) - return false; - - // Filter on region - if (!Filter.PassStringFilter(DatItemFilter.Region, disk.Region)) - return false; - - // Filter on index - if (!Filter.PassStringFilter(DatItemFilter.Index, disk.Index)) - return false; - - // Filter on writable - if (!Filter.PassBoolFilter(DatItemFilter.Writable, disk.Writable)) - return false; - - // Filter on status - if (DatItemFilter.Status.MatchesPositive(ItemStatus.NULL, disk.ItemStatus) == false) - return false; - if (DatItemFilter.Status.MatchesNegative(ItemStatus.NULL, disk.ItemStatus) == true) - return false; - - // Filter on optional - if (!Filter.PassBoolFilter(DatItemFilter.Optional, disk.Optional)) - return false; - - #endregion - - #region SoftwareList - - // Filter on DiskArea - if (disk.DiskAreaSpecified) - { - if (!PassesFilters(disk.DiskArea, true)) - return false; - } - - // Filter on Part - if (disk.PartSpecified) - { - if (!PassesFilters(disk.Part, true)) - return false; - } - - #endregion - } - - #endregion - - #region DiskArea - - else if (datItem is DiskArea diskArea) - { - // Filter on area name - if (!Filter.PassStringFilter(DatItemFilter.AreaName, diskArea.Name)) - return false; - } - - #endregion - - #region Display - - else if (datItem is Display display) - { - // Filter on tag - if (!Filter.PassStringFilter(DatItemFilter.Tag, display.Tag)) - return false; - - // Filter on display type - if (DatItemFilter.DisplayType.MatchesPositive(DisplayType.NULL, display.DisplayType) == false) - return false; - if (DatItemFilter.DisplayType.MatchesNegative(DisplayType.NULL, display.DisplayType) == true) - return false; - - // Filter on rotation - if (!Filter.PassLongFilter(DatItemFilter.Rotate, display.Rotate)) - return false; - - // Filter on flipx - if (!Filter.PassBoolFilter(DatItemFilter.FlipX, display.FlipX)) - return false; - - // Filter on width - if (!Filter.PassLongFilter(DatItemFilter.Width, display.Width)) - return false; - - // Filter on height - if (!Filter.PassLongFilter(DatItemFilter.Height, display.Height)) - return false; - - // Filter on refresh - if (!Filter.PassDoubleFilter(DatItemFilter.Refresh, display.Refresh)) - return false; - - // Filter on pixclock - if (!Filter.PassLongFilter(DatItemFilter.PixClock, display.PixClock)) - return false; - - // Filter on htotal - if (!Filter.PassLongFilter(DatItemFilter.HTotal, display.HTotal)) - return false; - - // Filter on hbend - if (!Filter.PassLongFilter(DatItemFilter.HBEnd, display.HBEnd)) - return false; - - // Filter on hbstart - if (!Filter.PassLongFilter(DatItemFilter.HBStart, display.HBStart)) - return false; - - // Filter on vtotal - if (!Filter.PassLongFilter(DatItemFilter.VTotal, display.VTotal)) - return false; - - // Filter on vbend - if (!Filter.PassLongFilter(DatItemFilter.VBEnd, display.VBEnd)) - return false; - - // Filter on vbstart - if (!Filter.PassLongFilter(DatItemFilter.VBStart, display.VBStart)) - return false; - } - - #endregion - - #region Driver - - else if (datItem is Driver driver) - { - // Filter on status - if (DatItemFilter.SupportStatus.MatchesPositive(SupportStatus.NULL, driver.Status) == false) - return false; - if (DatItemFilter.SupportStatus.MatchesNegative(SupportStatus.NULL, driver.Status) == true) - return false; - - // Filter on emulation - if (DatItemFilter.EmulationStatus.MatchesPositive(SupportStatus.NULL, driver.Emulation) == false) - return false; - if (DatItemFilter.EmulationStatus.MatchesNegative(SupportStatus.NULL, driver.Emulation) == true) - return false; - - // Filter on cocktail - if (DatItemFilter.CocktailStatus.MatchesPositive(SupportStatus.NULL, driver.Cocktail) == false) - return false; - if (DatItemFilter.CocktailStatus.MatchesNegative(SupportStatus.NULL, driver.Cocktail) == true) - return false; - - // Filter on savestate - if (DatItemFilter.SaveStateStatus.MatchesPositive(Supported.NULL, driver.SaveState) == false) - return false; - if (DatItemFilter.SaveStateStatus.MatchesNegative(Supported.NULL, driver.SaveState) == true) - return false; - } - - #endregion - - #region Extension - - else if (datItem is Extension extension) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Extension_Name, extension.Name)) - return false; - } - - #endregion - - #region Feature - - else if (datItem is Feature feature) - { - // Filter on type - if (DatItemFilter.FeatureType.MatchesPositive(FeatureType.NULL, feature.Type) == false) - return false; - if (DatItemFilter.FeatureType.MatchesNegative(FeatureType.NULL, feature.Type) == true) - return false; - - // Filter on status - if (DatItemFilter.FeatureStatus.MatchesPositive(FeatureStatus.NULL, feature.Status) == false) - return false; - if (DatItemFilter.FeatureStatus.MatchesNegative(FeatureStatus.NULL, feature.Status) == true) - return false; - - // Filter on overall - if (DatItemFilter.FeatureOverall.MatchesPositive(FeatureStatus.NULL, feature.Overall) == false) - return false; - if (DatItemFilter.FeatureOverall.MatchesNegative(FeatureStatus.NULL, feature.Overall) == true) - return false; - } - - #endregion - - #region Info - - else if (datItem is Info info) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, info.Name)) - return false; - - // Filter on info value - if (!Filter.PassStringFilter(DatItemFilter.Value, info.Value)) - return false; - } - - #endregion - - #region Input - - else if (datItem is Input input) - { - // Filter on service - if (!Filter.PassBoolFilter(DatItemFilter.Service, input.Service)) - return false; - - // Filter on tilt - if (!Filter.PassBoolFilter(DatItemFilter.Tilt, input.Tilt)) - return false; - - // Filter on players - if (!Filter.PassLongFilter(DatItemFilter.Players, input.Players)) - return false; - - // Filter on coins - if (!Filter.PassLongFilter(DatItemFilter.Coins, input.Coins)) - return false; - - // Filter on individual controls - if (input.ControlsSpecified) - { - foreach (Control subControl in input.Controls) - { - if (!PassesFilters(subControl, true)) - return false; - } - } - } - - #endregion - - #region Instance - - else if (datItem is Instance instance) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Instance_Name, instance.Name)) - return false; - - // Filter on brief name - if (!Filter.PassStringFilter(DatItemFilter.Instance_BriefName, instance.BriefName)) - return false; - } - - #endregion - - #region Location - - else if (datItem is Location location) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Location_Name, location.Name)) - return false; - - // Filter on number - if (!Filter.PassLongFilter(DatItemFilter.Location_Number, location.Number)) - return false; - - // Filter on inverted - if (!Filter.PassBoolFilter(DatItemFilter.Location_Inverted, location.Inverted)) - return false; - } - - #endregion - - #region Media - - else if (datItem is Media media) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, media.Name)) - return false; - - // Filter on MD5 - if (!Filter.PassStringFilter(DatItemFilter.MD5, media.MD5)) - return false; - - // Filter on SHA-1 - if (!Filter.PassStringFilter(DatItemFilter.SHA1, media.SHA1)) - return false; - - // Filter on SHA-256 - if (!Filter.PassStringFilter(DatItemFilter.SHA256, media.SHA256)) - return false; - - // Filter on SpamSum - if (!Filter.PassStringFilter(DatItemFilter.SpamSum, media.SpamSum)) - return false; - } - - #endregion - - #region Part - - else if (datItem is Part part) - { - // Filter on part name - if (!Filter.PassStringFilter(DatItemFilter.Part_Name, part.Name)) - return false; - - // Filter on part interface - if (!Filter.PassStringFilter(DatItemFilter.Part_Interface, part.Interface)) - return false; - - // Filter on features - if (part.FeaturesSpecified) - { - foreach (PartFeature subPartFeature in part.Features) - { - if (!PassesFilters(subPartFeature, true)) - return false; - } - } - } - - #endregion - - #region PartFeature - - else if (datItem is PartFeature partFeature) - { - // Filter on name - if (!Filter.PassStringFilter(DatItemFilter.Part_Feature_Name, partFeature.Name)) - return false; - - // Filter on value - if (!Filter.PassStringFilter(DatItemFilter.Part_Feature_Value, partFeature.Value)) - return false; - } - - #endregion - - #region Port - - else if (datItem is Port port) - { - // Filter on tag - if (!Filter.PassStringFilter(DatItemFilter.Tag, port.Tag)) - return false; - - // Filter on individual analogs - if (port.AnalogsSpecified) - { - foreach (Analog subAnalog in port.Analogs) - { - if (!PassesFilters(subAnalog, true)) - return false; - } - } - } - - #endregion - - #region RamOption - - else if (datItem is RamOption ramOption) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, ramOption.Name)) - return false; - - // Filter on default - if (!Filter.PassBoolFilter(DatItemFilter.Default, ramOption.Default)) - return false; - - // Filter on content - if (!Filter.PassStringFilter(DatItemFilter.Content, ramOption.Content)) - return false; - } - - #endregion - - #region Release - - else if (datItem is Release release) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, release.Name)) - return false; - - // Filter on region - if (!Filter.PassStringFilter(DatItemFilter.Region, release.Region)) - return false; - - // Filter on language - if (!Filter.PassStringFilter(DatItemFilter.Language, release.Language)) - return false; - - // Filter on date - if (!Filter.PassStringFilter(DatItemFilter.Date, release.Date)) - return false; - - // Filter on default - if (!Filter.PassBoolFilter(DatItemFilter.Default, release.Default)) - return false; - } - - #endregion - - #region Rom - - else if (datItem is Rom rom) - { - #region Common - - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, rom.Name)) - return false; - - // Filter on bios - if (!Filter.PassStringFilter(DatItemFilter.Bios, rom.Bios)) - return false; - - // Filter on rom size - if (!Filter.PassLongFilter(DatItemFilter.Size, rom.Size)) - return false; - - // Filter on CRC - if (!Filter.PassStringFilter(DatItemFilter.CRC, rom.CRC)) - return false; - - // Filter on MD5 - if (!Filter.PassStringFilter(DatItemFilter.MD5, rom.MD5)) - return false; - - // Filter on SHA-1 - if (!Filter.PassStringFilter(DatItemFilter.SHA1, rom.SHA1)) - return false; - - // Filter on SHA-256 - if (!Filter.PassStringFilter(DatItemFilter.SHA256, rom.SHA256)) - return false; - - // Filter on SHA-384 - if (!Filter.PassStringFilter(DatItemFilter.SHA384, rom.SHA384)) - return false; - - // Filter on SHA-512 - if (!Filter.PassStringFilter(DatItemFilter.SHA512, rom.SHA512)) - return false; - - // Filter on SpamSum - if (!Filter.PassStringFilter(DatItemFilter.SpamSum, rom.SpamSum)) - return false; - - // Filter on merge tag - if (!Filter.PassStringFilter(DatItemFilter.Merge, rom.MergeTag)) - return false; - - // Filter on region - if (!Filter.PassStringFilter(DatItemFilter.Region, rom.Region)) - return false; - - // Filter on offset - if (!Filter.PassStringFilter(DatItemFilter.Offset, rom.Offset)) - return false; - - // Filter on date - if (!Filter.PassStringFilter(DatItemFilter.Date, rom.Date)) - return false; - - // Filter on status - if (DatItemFilter.Status.MatchesPositive(ItemStatus.NULL, rom.ItemStatus) == false) - return false; - if (DatItemFilter.Status.MatchesNegative(ItemStatus.NULL, rom.ItemStatus) == true) - return false; - - // Filter on optional - if (!Filter.PassBoolFilter(DatItemFilter.Optional, rom.Optional)) - return false; - - // Filter on inverted - if (!Filter.PassBoolFilter(DatItemFilter.Inverted, rom.Inverted)) - return false; - - #endregion - - #region AttractMode - - // Filter on alt name - if (!Filter.PassStringFilter(DatItemFilter.AltName, rom.AltName)) - return false; - - // Filter on alt title - if (!Filter.PassStringFilter(DatItemFilter.AltTitle, rom.AltTitle)) - return false; - - #endregion - - #region OpenMSX - - // Filter on original - if (!Filter.PassStringFilter(DatItemFilter.Original, rom.Original?.Content)) - return false; - - // Filter on OpenMSX subtype - if (DatItemFilter.OpenMSXSubType.MatchesPositive(OpenMSXSubType.NULL, rom.OpenMSXSubType) == false) - return false; - if (DatItemFilter.OpenMSXSubType.MatchesNegative(OpenMSXSubType.NULL, rom.OpenMSXSubType) == true) - return false; - - // Filter on OpenMSX type - if (!Filter.PassStringFilter(DatItemFilter.OpenMSXType, rom.OpenMSXType)) - return false; - - // Filter on remark - if (!Filter.PassStringFilter(DatItemFilter.Remark, rom.Remark)) - return false; - - // Filter on boot - if (!Filter.PassStringFilter(DatItemFilter.Boot, rom.Boot)) - return false; - - #endregion - - #region SoftwareList - - // Filter on load flag - if (DatItemFilter.LoadFlag.MatchesPositive(LoadFlag.NULL, rom.LoadFlag) == false) - return false; - if (DatItemFilter.LoadFlag.MatchesNegative(LoadFlag.NULL, rom.LoadFlag) == true) - return false; - - // Filter on value - if (!Filter.PassStringFilter(DatItemFilter.Value, rom.Value)) - return false; - - // Filter on DataArea - if (rom.DataAreaSpecified) - { - if (!PassesFilters(rom.DataArea, true)) - return false; - } - - // Filter on Part - if (rom.PartSpecified) - { - if (!PassesFilters(rom.Part, true)) - return false; - } - - #endregion - } - - #endregion - - #region Sample - - else if (datItem is Sample sample) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, sample.Name)) - return false; - } - - #endregion - - #region Setting - - else if (datItem is Setting setting) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Setting_Name, setting.Name)) - return false; - - // Filter on value - if (!Filter.PassStringFilter(DatItemFilter.Setting_Value, setting.Value)) - return false; - - // Filter on default - if (!Filter.PassBoolFilter(DatItemFilter.Setting_Default, setting.Default)) - return false; - - // Filter on individual conditions - if (setting.ConditionsSpecified) - { - foreach (Condition subCondition in setting.Conditions) - { - if (!PassesFilters(subCondition, true)) - return false; - } - } - } - - #endregion - - #region SharedFeature - - else if (datItem is SharedFeature sharedFeature) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, sharedFeature.Name)) - return false; - - // Filter on value - if (!Filter.PassStringFilter(DatItemFilter.Value, sharedFeature.Value)) - return false; - } - - #endregion - - #region Slot - - else if (datItem is Slot slot) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, slot.Name)) - return false; - - // Filter on individual slot options - if (slot.SlotOptionsSpecified) - { - foreach (SlotOption subSlotOption in slot.SlotOptions) - { - if (!PassesFilters(subSlotOption, true)) - return false; - } - } - } - - #endregion - - #region SlotOption - - else if (datItem is SlotOption slotOption) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.SlotOption_Name, slotOption.Name)) - return false; - - // Filter on device name - if (!Filter.PassStringFilter(DatItemFilter.SlotOption_DeviceName, slotOption.DeviceName)) - return false; - - // Filter on default - if (!Filter.PassBoolFilter(DatItemFilter.SlotOption_Default, slotOption.Default)) - return false; - } - - #endregion - - #region SoftwareList - - else if (datItem is SoftwareList softwareList) - { - // Filter on item name - if (!Filter.PassStringFilter(DatItemFilter.Name, softwareList.Name)) - return false; - - // Filter on status - if (DatItemFilter.SoftwareListStatus.MatchesPositive(SoftwareListStatus.NULL, softwareList.Status) == false) - return false; - if (DatItemFilter.SoftwareListStatus.MatchesNegative(SoftwareListStatus.NULL, softwareList.Status) == true) - return false; - - // Filter on filter - if (!Filter.PassStringFilter(DatItemFilter.Filter, softwareList.Filter)) - return false; - } - - #endregion - - #region Sound - - else if (datItem is Sound sound) - { - // Filter on channels - if (!Filter.PassLongFilter(DatItemFilter.Channels, sound.Channels)) - return false; - } - - #endregion - - return true; - } - - /// - /// Check to see if a Machine passes the filters - /// - /// Machine to check - /// True if the machine passed the filter, false otherwise - public bool PassesFilters(Machine machine) - { - if (machine == null) - return false; - - #region Common - - // Machine_Name - bool passes = Filter.PassStringFilter(MachineFilter.Name, machine.Name); - if (MachineFilter.IncludeOfInGame) - { - passes |= Filter.PassStringFilter(MachineFilter.Name, machine.CloneOf); - passes |= Filter.PassStringFilter(MachineFilter.Name, machine.RomOf); - } - if (!passes) - return false; - - // Machine_Comment - if (!Filter.PassStringFilter(MachineFilter.Comment, machine.Comment)) - return false; - - // Machine_Description - if (!Filter.PassStringFilter(MachineFilter.Description, machine.Description)) - return false; - - // Machine_Year - if (!Filter.PassStringFilter(MachineFilter.Year, machine.Year)) - return false; - - // Machine_Manufacturer - if (!Filter.PassStringFilter(MachineFilter.Manufacturer, machine.Manufacturer)) - return false; - - // Machine_Publisher - if (!Filter.PassStringFilter(MachineFilter.Publisher, machine.Publisher)) - return false; - - // Machine_Category - if (!Filter.PassStringFilter(MachineFilter.Category, machine.Category)) - return false; - - // Machine_RomOf - if (!Filter.PassStringFilter(MachineFilter.RomOf, machine.RomOf)) - return false; - - // Machine_CloneOf - if (!Filter.PassStringFilter(MachineFilter.CloneOf, machine.CloneOf)) - return false; - - // Machine_SampleOf - if (!Filter.PassStringFilter(MachineFilter.SampleOf, machine.SampleOf)) - return false; - - // Machine_Type - if (MachineFilter.Type.MatchesPositive(0x0, machine.MachineType) == false) - return false; - if (MachineFilter.Type.MatchesNegative(0x0, machine.MachineType) == true) - return false; - - #endregion - - #region AttractMode - - // Machine_Players - if (!Filter.PassStringFilter(MachineFilter.Players, machine.Players)) - return false; - - // Machine_Rotation - if (!Filter.PassStringFilter(MachineFilter.Rotation, machine.Rotation)) - return false; - - // Machine_Control - if (!Filter.PassStringFilter(MachineFilter.Control, machine.Control)) - return false; - - // Machine_Status - if (!Filter.PassStringFilter(MachineFilter.Status, machine.Status)) - return false; - - // Machine_DisplayCount - if (!Filter.PassStringFilter(MachineFilter.DisplayCount, machine.DisplayCount)) - return false; - - // Machine_DisplayType - if (!Filter.PassStringFilter(MachineFilter.DisplayType, machine.DisplayType)) - return false; - - // Machine_Buttons - if (!Filter.PassStringFilter(MachineFilter.Buttons, machine.Buttons)) - return false; - - #endregion - - #region ListXML - - // Machine_History - if (!Filter.PassStringFilter(MachineFilter.History, machine.History)) - return false; - - // Machine_SourceFile - if (!Filter.PassStringFilter(MachineFilter.SourceFile, machine.SourceFile)) - return false; - - // Machine_Runnable - if (MachineFilter.Runnable.MatchesPositive(Runnable.NULL, machine.Runnable) == false) - return false; - if (MachineFilter.Runnable.MatchesNegative(Runnable.NULL, machine.Runnable) == true) - return false; - - #endregion - - #region Logiqx - - // Machine_Board - if (!Filter.PassStringFilter(MachineFilter.Board, machine.Board)) - return false; - - // Machine_RebuildTo - if (!Filter.PassStringFilter(MachineFilter.RebuildTo, machine.RebuildTo)) - return false; - - #endregion - - #region Logiqx EmuArc - - // Machine_TitleID - if (!Filter.PassStringFilter(MachineFilter.TitleID, machine.TitleID)) - return false; - - // Machine_Developer - if (!Filter.PassStringFilter(MachineFilter.Developer, machine.Developer)) - return false; - - // Machine_Genre - if (!Filter.PassStringFilter(MachineFilter.Genre, machine.Genre)) - return false; - - // Machine_Subgenre - if (!Filter.PassStringFilter(MachineFilter.Subgenre, machine.Subgenre)) - return false; - - // Machine_Ratings - if (!Filter.PassStringFilter(MachineFilter.Ratings, machine.Ratings)) - return false; - - // Machine_Score - if (!Filter.PassStringFilter(MachineFilter.Score, machine.Score)) - return false; - - // Machine_Enabled - if (!Filter.PassStringFilter(MachineFilter.Enabled, machine.Enabled)) - return false; - - // Machine_CRC - if (!Filter.PassBoolFilter(MachineFilter.CRC, machine.Crc)) - return false; - - // Machine_RelatedTo - if (!Filter.PassStringFilter(MachineFilter.RelatedTo, machine.RelatedTo)) - return false; - - #endregion - - #region OpenMSX - - // Machine_GenMSXID - if (!Filter.PassStringFilter(MachineFilter.GenMSXID, machine.GenMSXID)) - return false; - - // Machine_System - if (!Filter.PassStringFilter(MachineFilter.System, machine.System)) - return false; - - // Machine_Country - if (!Filter.PassStringFilter(MachineFilter.Country, machine.Country)) - return false; - - #endregion - - #region SoftwareList - - // Machine_Supported - if (MachineFilter.Supported.MatchesPositive(Supported.NULL, machine.Supported) == false) - return false; - if (MachineFilter.Supported.MatchesNegative(Supported.NULL, machine.Supported) == true) - return false; - - #endregion // SoftwareList - - return true; + // Filter on DatItem fields + return DatItemFilter.PassesFilters(datItem); } #endregion diff --git a/SabreTools.Filtering/DatHeaderFilter.cs b/SabreTools.Filtering/DatHeaderFilter.cs deleted file mode 100644 index 328c90e3..00000000 --- a/SabreTools.Filtering/DatHeaderFilter.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Collections.Generic; - -using SabreTools.Core; -using SabreTools.Core.Tools; -using SabreTools.Logging; - -namespace SabreTools.Filtering -{ - /// - /// Represents the filtering operations that need to be performed on a DatHeader - /// - public class DatHeaderFilter : Filter - { - #region Constructors - - /// - /// Constructor - /// - public DatHeaderFilter() - { - logger = new Logger(this); - } - - #endregion - - #region Filter Population - - /// - /// Set multiple filters from key - /// - /// Key for the filter to be set - /// List of values for the filter - /// True if negative filter, false otherwise - public void SetFilter(DatHeaderField key, List values, bool negate) - { - foreach (string value in values) - { - SetFilter(key, value, negate); - } - } - - /// - /// Set a single filter from key - /// - /// Key for the filter to be set - /// Value of the filter - /// True if negative filter, false otherwise - public void SetFilter(DatHeaderField key, string value, bool negate) - { - // TODO: Add DatHeader filters - } - - #endregion - } -} diff --git a/SabreTools.Filtering/DatItemFilter.cs b/SabreTools.Filtering/DatItemFilter.cs index 998cc31e..47023f49 100644 --- a/SabreTools.Filtering/DatItemFilter.cs +++ b/SabreTools.Filtering/DatItemFilter.cs @@ -2,6 +2,7 @@ using SabreTools.Core; using SabreTools.Core.Tools; +using SabreTools.DatItems; using SabreTools.Logging; namespace SabreTools.Filtering @@ -761,5 +762,1183 @@ namespace SabreTools.Filtering } #endregion + + #region Filter Running + + /// + /// Check to see if a DatItem passes the filters + /// + /// DatItem to check + /// True if the item passed the filter, false otherwise + public bool PassesFilters(DatItem datItem) + { + if (datItem == null) + return false; + + #region Common + + // Filter on item type + if (!PassStringFilter(Type, datItem.ItemType.ToString())) + return false; + + // Name is common if the name is non-null + if (datItem.GetName() != null) + { + // Filter on item name + if (!PassStringFilter(Name, datItem.GetName())) + return false; + } + + #endregion + + #region Item-Specific + + return datItem switch + { + Adjuster adjuster => PassesFilters(adjuster), + Analog analog => PassesFilters(analog), + BiosSet biosSet => PassesFilters(biosSet), + Chip chip => PassesFilters(chip), + Condition condition => PassesFilters(condition), + Configuration configuration => PassesFilters(configuration), + Control control => PassesFilters(control), + DataArea dataArea => PassesFilters(dataArea), + Device device => PassesFilters(device), + DipSwitch dipSwitch => PassesFilters(dipSwitch), + Disk disk => PassesFilters(disk), + DiskArea diskArea => PassesFilters(diskArea), + Display display => PassesFilters(display), + Driver driver => PassesFilters(driver), + Extension extension => PassesFilters(extension), + Feature feature => PassesFilters(feature), + Info info => PassesFilters(info), + Input input => PassesFilters(input), + Instance instance => PassesFilters(instance), + Location location => PassesFilters(location), + Media media => PassesFilters(media), + Part part => PassesFilters(part), + PartFeature partFeature => PassesFilters(partFeature), + Port port => PassesFilters(port), + RamOption ramOption => PassesFilters(ramOption), + Release release => PassesFilters(release), + Rom rom => PassesFilters(rom), + Setting setting => PassesFilters(setting), + SharedFeature sharedFeature => PassesFilters(sharedFeature), + Slot slot => PassesFilters(slot), + SlotOption slotOption => PassesFilters(slotOption), + SoftwareList softwareList => PassesFilters(softwareList), + Sound sound => PassesFilters(sound), + _ => false, + }; + + #endregion + } + + /// + /// Check to see if an Adjuster passes the filters + /// + /// Adjuster to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Adjuster adjuster) + { + // Filter on default + if (!PassBoolFilter(Default, adjuster.Default)) + return false; + + // Filter on individual conditions + if (adjuster.ConditionsSpecified) + { + foreach (Condition condition in adjuster.Conditions) + { + if (!PassesFilters(condition, true)) + return false; + } + } + + return true; + } + + /// + /// Check to see if an Analog passes the filters + /// + /// Analog to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Analog analog) + { + // Filter on mask + if (!PassStringFilter(Analog_Mask, analog.Mask)) + return false; + + return true; + } + + /// + /// Check to see if a BiosSet passes the filters + /// + /// BiosSet to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(BiosSet biosSet) + { + // Filter on description + if (!PassStringFilter(Description, biosSet.Description)) + return false; + + // Filter on default + if (!PassBoolFilter(Default, biosSet.Default)) + return false; + + return true; + } + + /// + /// Check to see if a Chip passes the filters + /// + /// Chip to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Chip chip) + { + // DatItem_Tag + if (!PassStringFilter(Tag, chip.Tag)) + return false; + + // DatItem_ChipType + if (ChipType.MatchesPositive(Core.ChipType.NULL, chip.ChipType) == false) + return false; + if (ChipType.MatchesNegative(Core.ChipType.NULL, chip.ChipType) == true) + return false; + + // DatItem_Clock + if (!PassLongFilter(Clock, chip.Clock)) + return false; + + return true; + } + + /// + /// Check to see if a Condition passes the filters + /// + /// Condition to check + /// True if this is a subitem, false otherwise + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Condition condition, bool sub = false) + { + if (sub) + { + // Filter on tag + if (!PassStringFilter(Condition_Tag, condition.Tag)) + return false; + + // Filter on mask + if (!PassStringFilter(Condition_Mask, condition.Mask)) + return false; + + // Filter on relation + if (Condition_Relation.MatchesPositive(Core.Relation.NULL, condition.Relation) == false) + return false; + if (Condition_Relation.MatchesNegative(Core.Relation.NULL, condition.Relation) == true) + return false; + + // Filter on value + if (!PassStringFilter(Condition_Value, condition.Value)) + return false; + } + else + { + // Filter on tag + if (!PassStringFilter(Tag, condition.Tag)) + return false; + + // Filter on mask + if (!PassStringFilter(Mask, condition.Mask)) + return false; + + // Filter on relation + if (Relation.MatchesPositive(Core.Relation.NULL, condition.Relation) == false) + return false; + if (Relation.MatchesNegative(Core.Relation.NULL, condition.Relation) == true) + return false; + + // Filter on value + if (!PassStringFilter(Value, condition.Value)) + return false; + } + + return true; + } + + /// + /// Check to see if a Configuration passes the filters + /// + /// Configuration to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Configuration configuration) + { + // Filter on tag + if (!PassStringFilter(Tag, configuration.Tag)) + return false; + + // Filter on mask + if (!PassStringFilter(Mask, configuration.Mask)) + return false; + + // Filter on individual conditions + if (configuration.ConditionsSpecified) + { + foreach (Condition subCondition in configuration.Conditions) + { + if (!PassesFilters(subCondition, true)) + return false; + } + } + + // Filter on individual locations + if (configuration.LocationsSpecified) + { + foreach (Location subLocation in configuration.Locations) + { + if (!PassesFilters(subLocation)) + return false; + } + } + + // Filter on individual conditions + if (configuration.SettingsSpecified) + { + foreach (Setting subSetting in configuration.Settings) + { + if (!PassesFilters(subSetting)) + return false; + } + } + + return true; + } + + /// + /// Check to see if a Control passes the filters + /// + /// Control to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Control control) + { + // Filter on control type + if (Control_Type.MatchesPositive(ControlType.NULL, control.ControlType) == false) + return false; + if (Control_Type.MatchesNegative(ControlType.NULL, control.ControlType) == true) + return false; + + // Filter on player + if (!PassLongFilter(Control_Player, control.Player)) + return false; + + // Filter on buttons + if (!PassLongFilter(Control_Buttons, control.Buttons)) + return false; + + // Filter on reqbuttons + if (!PassLongFilter(Control_ReqButtons, control.RequiredButtons)) + return false; + + // Filter on minimum + if (!PassLongFilter(Control_Minimum, control.Minimum)) + return false; + + // Filter on maximum + if (!PassLongFilter(Control_Maximum, control.Maximum)) + return false; + + // Filter on sensitivity + if (!PassLongFilter(Control_Sensitivity, control.Sensitivity)) + return false; + + // Filter on keydelta + if (!PassLongFilter(Control_KeyDelta, control.KeyDelta)) + return false; + + // Filter on reverse + if (!PassBoolFilter(Control_Reverse, control.Reverse)) + return false; + + // Filter on ways + if (!PassStringFilter(Control_Ways, control.Ways)) + return false; + + // Filter on ways2 + if (!PassStringFilter(Control_Ways2, control.Ways2)) + return false; + + // Filter on ways3 + if (!PassStringFilter(Control_Ways3, control.Ways3)) + return false; + + return true; + } + + /// + /// Check to see if a DataArea passes the filters + /// + /// DataArea to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(DataArea dataArea) + { + // Filter on area name + if (!PassStringFilter(AreaName, dataArea.Name)) + return false; + + // Filter on area size + if (!PassLongFilter(AreaSize, dataArea.Size)) + return false; + + // Filter on area width + if (!PassLongFilter(AreaWidth, dataArea.Width)) + return false; + + // Filter on area endianness + if (AreaEndianness.MatchesPositive(Endianness.NULL, dataArea.Endianness) == false) + return false; + if (AreaEndianness.MatchesNegative(Endianness.NULL, dataArea.Endianness) == true) + return false; + + return true; + } + + /// + /// Check to see if a Device passes the filters + /// + /// Device to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Device device) + { + // Filter on device type + if (DeviceType.MatchesPositive(Core.DeviceType.NULL, device.DeviceType) == false) + return false; + if (DeviceType.MatchesNegative(Core.DeviceType.NULL, device.DeviceType) == true) + return false; + + // Filter on tag + if (!PassStringFilter(Tag, device.Tag)) + return false; + + // Filter on fixed image + if (!PassStringFilter(FixedImage, device.FixedImage)) + return false; + + // Filter on mandatory + if (!PassLongFilter(Mandatory, device.Mandatory)) + return false; + + // Filter on interface + if (!PassStringFilter(Interface, device.Interface)) + return false; + + // Filter on individual instances + if (device.InstancesSpecified) + { + foreach (Instance subInstance in device.Instances) + { + if (!PassesFilters(subInstance)) + return false; + } + } + + // Filter on individual extensions + if (device.ExtensionsSpecified) + { + foreach (Extension subExtension in device.Extensions) + { + if (!PassesFilters(subExtension)) + return false; + } + } + + return true; + } + + /// + /// Check to see if a DipSwitch passes the filters + /// + /// DipSwitch to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(DipSwitch dipSwitch) + { + #region Common + + // Filter on tag + if (!PassStringFilter(Tag, dipSwitch.Tag)) + return false; + + // Filter on mask + if (!PassStringFilter(Mask, dipSwitch.Mask)) + return false; + + // Filter on individual conditions + if (dipSwitch.ConditionsSpecified) + { + foreach (Condition subCondition in dipSwitch.Conditions) + { + if (!PassesFilters(subCondition, true)) + return false; + } + } + + // Filter on individual locations + if (dipSwitch.LocationsSpecified) + { + foreach (Location subLocation in dipSwitch.Locations) + { + if (!PassesFilters(subLocation)) + return false; + } + } + + // Filter on individual conditions + if (dipSwitch.ValuesSpecified) + { + foreach (Setting subValue in dipSwitch.Values) + { + if (!PassesFilters(subValue)) + return false; + } + } + + #endregion + + #region SoftwareList + + // Filter on Part + if (dipSwitch.PartSpecified) + { + if (!PassesFilters(dipSwitch.Part)) + return false; + } + + #endregion + + return true; + } + + /// + /// Check to see if a Disk passes the filters + /// + /// Disk to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Disk disk) + { + #region Common + + // Filter on MD5 + if (!PassStringFilter(MD5, disk.MD5)) + return false; + + // Filter on SHA-1 + if (!PassStringFilter(SHA1, disk.SHA1)) + return false; + + // Filter on merge tag + if (!PassStringFilter(Merge, disk.MergeTag)) + return false; + + // Filter on region + if (!PassStringFilter(Region, disk.Region)) + return false; + + // Filter on index + if (!PassStringFilter(Index, disk.Index)) + return false; + + // Filter on writable + if (!PassBoolFilter(Writable, disk.Writable)) + return false; + + // Filter on status + if (Status.MatchesPositive(ItemStatus.NULL, disk.ItemStatus) == false) + return false; + if (Status.MatchesNegative(ItemStatus.NULL, disk.ItemStatus) == true) + return false; + + // Filter on optional + if (!PassBoolFilter(Optional, disk.Optional)) + return false; + + #endregion + + #region SoftwareList + + // Filter on DiskArea + if (disk.DiskAreaSpecified) + { + if (!PassesFilters(disk.DiskArea)) + return false; + } + + // Filter on Part + if (disk.PartSpecified) + { + if (!PassesFilters(disk.Part)) + return false; + } + + #endregion + + return true; + } + + /// + /// Check to see if a DiskArea passes the filters + /// + /// DiskArea to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(DiskArea diskArea) + { + // Filter on area name + if (!PassStringFilter(AreaName, diskArea.Name)) + return false; + + return true; + } + + /// + /// Check to see if a Display passes the filters + /// + /// Display to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Display display) + { + // Filter on tag + if (!PassStringFilter(Tag, display.Tag)) + return false; + + // Filter on display type + if (DisplayType.MatchesPositive(Core.DisplayType.NULL, display.DisplayType) == false) + return false; + if (DisplayType.MatchesNegative(Core.DisplayType.NULL, display.DisplayType) == true) + return false; + + // Filter on rotation + if (!PassLongFilter(Rotate, display.Rotate)) + return false; + + // Filter on flipx + if (!PassBoolFilter(FlipX, display.FlipX)) + return false; + + // Filter on width + if (!PassLongFilter(Width, display.Width)) + return false; + + // Filter on height + if (!PassLongFilter(Height, display.Height)) + return false; + + // Filter on refresh + if (!PassDoubleFilter(Refresh, display.Refresh)) + return false; + + // Filter on pixclock + if (!PassLongFilter(PixClock, display.PixClock)) + return false; + + // Filter on htotal + if (!PassLongFilter(HTotal, display.HTotal)) + return false; + + // Filter on hbend + if (!PassLongFilter(HBEnd, display.HBEnd)) + return false; + + // Filter on hbstart + if (!PassLongFilter(HBStart, display.HBStart)) + return false; + + // Filter on vtotal + if (!PassLongFilter(VTotal, display.VTotal)) + return false; + + // Filter on vbend + if (!PassLongFilter(VBEnd, display.VBEnd)) + return false; + + // Filter on vbstart + if (!PassLongFilter(VBStart, display.VBStart)) + return false; + + return true; + } + + /// + /// Check to see if a Driver passes the filters + /// + /// Driver to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Driver driver) + { + // Filter on status + if (SupportStatus.MatchesPositive(Core.SupportStatus.NULL, driver.Status) == false) + return false; + if (SupportStatus.MatchesNegative(Core.SupportStatus.NULL, driver.Status) == true) + return false; + + // Filter on emulation + if (EmulationStatus.MatchesPositive(Core.SupportStatus.NULL, driver.Emulation) == false) + return false; + if (EmulationStatus.MatchesNegative(Core.SupportStatus.NULL, driver.Emulation) == true) + return false; + + // Filter on cocktail + if (CocktailStatus.MatchesPositive(Core.SupportStatus.NULL, driver.Cocktail) == false) + return false; + if (CocktailStatus.MatchesNegative(Core.SupportStatus.NULL, driver.Cocktail) == true) + return false; + + // Filter on savestate + if (SaveStateStatus.MatchesPositive(Supported.NULL, driver.SaveState) == false) + return false; + if (SaveStateStatus.MatchesNegative(Supported.NULL, driver.SaveState) == true) + return false; + + return true; + } + + /// + /// Check to see if a Extension passes the filters + /// + /// Extension to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Extension extension) + { + // Filter on item name + if (!PassStringFilter(Extension_Name, extension.Name)) + return false; + + return true; + } + + /// + /// Check to see if a Feature passes the filters + /// + /// Feature to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Feature feature) + { + // Filter on type + if (FeatureType.MatchesPositive(Core.FeatureType.NULL, feature.Type) == false) + return false; + if (FeatureType.MatchesNegative(Core.FeatureType.NULL, feature.Type) == true) + return false; + + // Filter on status + if (FeatureStatus.MatchesPositive(Core.FeatureStatus.NULL, feature.Status) == false) + return false; + if (FeatureStatus.MatchesNegative(Core.FeatureStatus.NULL, feature.Status) == true) + return false; + + // Filter on overall + if (FeatureOverall.MatchesPositive(Core.FeatureStatus.NULL, feature.Overall) == false) + return false; + if (FeatureOverall.MatchesNegative(Core.FeatureStatus.NULL, feature.Overall) == true) + return false; + + return true; + } + + /// + /// Check to see if a Info passes the filters + /// + /// Info to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Info info) + { + // Filter on info value + if (!PassStringFilter(Value, info.Value)) + return false; + + return true; + } + + /// + /// Check to see if a Input passes the filters + /// + /// Input to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Input input) + { + // Filter on service + if (!PassBoolFilter(Service, input.Service)) + return false; + + // Filter on tilt + if (!PassBoolFilter(Tilt, input.Tilt)) + return false; + + // Filter on players + if (!PassLongFilter(Players, input.Players)) + return false; + + // Filter on coins + if (!PassLongFilter(Coins, input.Coins)) + return false; + + // Filter on individual controls + if (input.ControlsSpecified) + { + foreach (Control subControl in input.Controls) + { + if (!PassesFilters(subControl)) + return false; + } + } + + return true; + } + + /// + /// Check to see if a Instance passes the filters + /// + /// Instance to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Instance instance) + { + // Filter on item name + if (!PassStringFilter(Instance_Name, instance.Name)) + return false; + + // Filter on brief name + if (!PassStringFilter(Instance_BriefName, instance.BriefName)) + return false; + + return true; + } + + /// + /// Check to see if a Location passes the filters + /// + /// Location to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Location location) + { + // Filter on item name + if (!PassStringFilter(Location_Name, location.Name)) + return false; + + // Filter on number + if (!PassLongFilter(Location_Number, location.Number)) + return false; + + // Filter on inverted + if (!PassBoolFilter(Location_Inverted, location.Inverted)) + return false; + + return true; + } + + /// + /// Check to see if a Media passes the filters + /// + /// Media to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Media media) + { + // Filter on MD5 + if (!PassStringFilter(MD5, media.MD5)) + return false; + + // Filter on SHA-1 + if (!PassStringFilter(SHA1, media.SHA1)) + return false; + + // Filter on SHA-256 + if (!PassStringFilter(SHA256, media.SHA256)) + return false; + + // Filter on SpamSum + if (!PassStringFilter(SpamSum, media.SpamSum)) + return false; + + return true; + } + + /// + /// Check to see if a Part passes the filters + /// + /// Part to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Part part) + { + // Filter on part name + if (!PassStringFilter(Part_Name, part.Name)) + return false; + + // Filter on part interface + if (!PassStringFilter(Part_Interface, part.Interface)) + return false; + + // Filter on features + if (part.FeaturesSpecified) + { + foreach (PartFeature subPartFeature in part.Features) + { + if (!PassesFilters(subPartFeature)) + return false; + } + } + + return true; + } + + /// + /// Check to see if a PartFeature passes the filters + /// + /// PartFeature to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(PartFeature partFeature) + { + // Filter on name + if (!PassStringFilter(Part_Feature_Name, partFeature.Name)) + return false; + + // Filter on value + if (!PassStringFilter(Part_Feature_Value, partFeature.Value)) + return false; + + return true; + } + + /// + /// Check to see if a Port passes the filters + /// + /// Port to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Port port) + { + // Filter on tag + if (!PassStringFilter(Tag, port.Tag)) + return false; + + // Filter on individual analogs + if (port.AnalogsSpecified) + { + foreach (Analog subAnalog in port.Analogs) + { + if (!PassesFilters(subAnalog)) + return false; + } + } + + return true; + } + + /// + /// Check to see if a RamOption passes the filters + /// + /// RamOption to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(RamOption ramOption) + { + // Filter on default + if (!PassBoolFilter(Default, ramOption.Default)) + return false; + + // Filter on content + if (!PassStringFilter(Content, ramOption.Content)) + return false; + + return true; + } + + /// + /// Check to see if a Release passes the filters + /// + /// Release to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Release release) + { + // Filter on region + if (!PassStringFilter(Region, release.Region)) + return false; + + // Filter on language + if (!PassStringFilter(Language, release.Language)) + return false; + + // Filter on date + if (!PassStringFilter(Date, release.Date)) + return false; + + // Filter on default + if (!PassBoolFilter(Default, release.Default)) + return false; + + return true; + } + + /// + /// Check to see if a Rom passes the filters + /// + /// Rom to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Rom rom) + { + #region Common + + // Filter on bios + if (!PassStringFilter(Bios, rom.Bios)) + return false; + + // Filter on rom size + if (!PassLongFilter(Size, rom.Size)) + return false; + + // Filter on CRC + if (!PassStringFilter(CRC, rom.CRC)) + return false; + + // Filter on MD5 + if (!PassStringFilter(MD5, rom.MD5)) + return false; + + // Filter on SHA-1 + if (!PassStringFilter(SHA1, rom.SHA1)) + return false; + + // Filter on SHA-256 + if (!PassStringFilter(SHA256, rom.SHA256)) + return false; + + // Filter on SHA-384 + if (!PassStringFilter(SHA384, rom.SHA384)) + return false; + + // Filter on SHA-512 + if (!PassStringFilter(SHA512, rom.SHA512)) + return false; + + // Filter on SpamSum + if (!PassStringFilter(SpamSum, rom.SpamSum)) + return false; + + // Filter on merge tag + if (!PassStringFilter(Merge, rom.MergeTag)) + return false; + + // Filter on region + if (!PassStringFilter(Region, rom.Region)) + return false; + + // Filter on offset + if (!PassStringFilter(Offset, rom.Offset)) + return false; + + // Filter on date + if (!PassStringFilter(Date, rom.Date)) + return false; + + // Filter on status + if (Status.MatchesPositive(ItemStatus.NULL, rom.ItemStatus) == false) + return false; + if (Status.MatchesNegative(ItemStatus.NULL, rom.ItemStatus) == true) + return false; + + // Filter on optional + if (!PassBoolFilter(Optional, rom.Optional)) + return false; + + // Filter on inverted + if (!PassBoolFilter(Inverted, rom.Inverted)) + return false; + + #endregion + + #region AttractMode + + // Filter on alt name + if (!PassStringFilter(AltName, rom.AltName)) + return false; + + // Filter on alt title + if (!PassStringFilter(AltTitle, rom.AltTitle)) + return false; + + #endregion + + #region OpenMSX + + // Filter on original + if (!PassStringFilter(Original, rom.Original?.Content)) + return false; + + // Filter on OpenMSX subtype + if (OpenMSXSubType.MatchesPositive(Core.OpenMSXSubType.NULL, rom.OpenMSXSubType) == false) + return false; + if (OpenMSXSubType.MatchesNegative(Core.OpenMSXSubType.NULL, rom.OpenMSXSubType) == true) + return false; + + // Filter on OpenMSX type + if (!PassStringFilter(OpenMSXType, rom.OpenMSXType)) + return false; + + // Filter on remark + if (!PassStringFilter(Remark, rom.Remark)) + return false; + + // Filter on boot + if (!PassStringFilter(Boot, rom.Boot)) + return false; + + #endregion + + #region SoftwareList + + // Filter on load flag + if (LoadFlag.MatchesPositive(Core.LoadFlag.NULL, rom.LoadFlag) == false) + return false; + if (LoadFlag.MatchesNegative(Core.LoadFlag.NULL, rom.LoadFlag) == true) + return false; + + // Filter on value + if (!PassStringFilter(Value, rom.Value)) + return false; + + // Filter on DataArea + if (rom.DataAreaSpecified) + { + if (!PassesFilters(rom.DataArea)) + return false; + } + + // Filter on Part + if (rom.PartSpecified) + { + if (!PassesFilters(rom.Part)) + return false; + } + + #endregion + + return true; + } + + /// + /// Check to see if a Setting passes the filters + /// + /// Setting to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Setting setting) + { + // Filter on item name + if (!PassStringFilter(Setting_Name, setting.Name)) + return false; + + // Filter on value + if (!PassStringFilter(Setting_Value, setting.Value)) + return false; + + // Filter on default + if (!PassBoolFilter(Setting_Default, setting.Default)) + return false; + + // Filter on individual conditions + if (setting.ConditionsSpecified) + { + foreach (Condition subCondition in setting.Conditions) + { + if (!PassesFilters(subCondition, true)) + return false; + } + } + + return true; + } + + /// + /// Check to see if a SharedFeature passes the filters + /// + /// SharedFeature to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(SharedFeature sharedFeature) + { + // Filter on value + if (!PassStringFilter(Value, sharedFeature.Value)) + return false; + + return true; + } + + /// + /// Check to see if a Slot passes the filters + /// + /// Slot to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Slot slot) + { + // Filter on individual slot options + if (slot.SlotOptionsSpecified) + { + foreach (SlotOption subSlotOption in slot.SlotOptions) + { + if (!PassesFilters(subSlotOption)) + return false; + } + } + + return true; + } + + /// + /// Check to see if a SlotOption passes the filters + /// + /// SlotOption to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(SlotOption slotOption) + { + // Filter on item name + if (!PassStringFilter(SlotOption_Name, slotOption.Name)) + return false; + + // Filter on device name + if (!PassStringFilter(SlotOption_DeviceName, slotOption.DeviceName)) + return false; + + // Filter on default + if (!PassBoolFilter(SlotOption_Default, slotOption.Default)) + return false; + + return true; + } + + /// + /// Check to see if a SoftwareList passes the filters + /// + /// SoftwareList to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(SoftwareList softwareList) + { + // Filter on status + if (SoftwareListStatus.MatchesPositive(Core.SoftwareListStatus.NULL, softwareList.Status) == false) + return false; + if (SoftwareListStatus.MatchesNegative(Core.SoftwareListStatus.NULL, softwareList.Status) == true) + return false; + + // Filter on filter + if (!PassStringFilter(Filter, softwareList.Filter)) + return false; + + return true; + } + + /// + /// Check to see if a Sound passes the filters + /// + /// Sound to check + /// True if the item passed the filter, false otherwise + private bool PassesFilters(Sound sound) + { + // Filter on channels + if (!PassLongFilter(Channels, sound.Channels)) + return false; + + return true; + } + + #endregion } } diff --git a/SabreTools.Filtering/Filter.cs b/SabreTools.Filtering/Filter.cs index cbf8dc48..0127d34e 100644 --- a/SabreTools.Filtering/Filter.cs +++ b/SabreTools.Filtering/Filter.cs @@ -302,7 +302,7 @@ namespace SabreTools.Filtering /// Filter item to check /// Value to check /// True if the value passes, false otherwise - public static bool PassBoolFilter(FilterItem filterItem, bool? value) + protected static bool PassBoolFilter(FilterItem filterItem, bool? value) { if (filterItem.MatchesNeutral(null, value) == false) return false; @@ -316,7 +316,7 @@ namespace SabreTools.Filtering /// Filter item to check /// Value to check /// True if the value passes, false otherwise - public static bool PassDoubleFilter(FilterItem filterItem, double? value) + protected static bool PassDoubleFilter(FilterItem filterItem, double? value) { if (filterItem.MatchesNeutral(null, value) == false) return false; @@ -334,7 +334,7 @@ namespace SabreTools.Filtering /// Filter item to check /// Value to check /// True if the value passes, false otherwise - public static bool PassLongFilter(FilterItem filterItem, long? value) + protected static bool PassLongFilter(FilterItem filterItem, long? value) { if (filterItem.MatchesNeutral(null, value) == false) return false; @@ -352,7 +352,7 @@ namespace SabreTools.Filtering /// Filter item to check /// Value to check /// True if the value passes, false otherwise - public static bool PassStringFilter(FilterItem filterItem, string value) + protected static bool PassStringFilter(FilterItem filterItem, string value) { if (filterItem.MatchesPositiveSet(value) == false) return false; diff --git a/SabreTools.Filtering/MachineFilter.cs b/SabreTools.Filtering/MachineFilter.cs index 57a8fbfb..99f452fc 100644 --- a/SabreTools.Filtering/MachineFilter.cs +++ b/SabreTools.Filtering/MachineFilter.cs @@ -322,5 +322,206 @@ namespace SabreTools.Filtering } #endregion + + #region Filter Running + + /// + /// Check to see if a Machine passes the filters + /// + /// Machine to check + /// True if the machine passed the filter, false otherwise + public bool PassesFilters(Machine machine) + { + if (machine == null) + return false; + + #region Common + + // Machine_Name + bool passes = PassStringFilter(Name, machine.Name); + if (IncludeOfInGame) + { + passes |= PassStringFilter(Name, machine.CloneOf); + passes |= PassStringFilter(Name, machine.RomOf); + } + if (!passes) + return false; + + // Machine_Comment + if (!PassStringFilter(Comment, machine.Comment)) + return false; + + // Machine_Description + if (!PassStringFilter(Description, machine.Description)) + return false; + + // Machine_Year + if (!PassStringFilter(Year, machine.Year)) + return false; + + // Machine_Manufacturer + if (!PassStringFilter(Manufacturer, machine.Manufacturer)) + return false; + + // Machine_Publisher + if (!PassStringFilter(Publisher, machine.Publisher)) + return false; + + // Machine_Category + if (!PassStringFilter(Category, machine.Category)) + return false; + + // Machine_RomOf + if (!PassStringFilter(RomOf, machine.RomOf)) + return false; + + // Machine_CloneOf + if (!PassStringFilter(CloneOf, machine.CloneOf)) + return false; + + // Machine_SampleOf + if (!PassStringFilter(SampleOf, machine.SampleOf)) + return false; + + // Machine_Type + if (Type.MatchesPositive(0x0, machine.MachineType) == false) + return false; + if (Type.MatchesNegative(0x0, machine.MachineType) == true) + return false; + + #endregion + + #region AttractMode + + // Machine_Players + if (!PassStringFilter(Players, machine.Players)) + return false; + + // Machine_Rotation + if (!PassStringFilter(Rotation, machine.Rotation)) + return false; + + // Machine_Control + if (!PassStringFilter(Control, machine.Control)) + return false; + + // Machine_Status + if (!PassStringFilter(Status, machine.Status)) + return false; + + // Machine_DisplayCount + if (!PassStringFilter(DisplayCount, machine.DisplayCount)) + return false; + + // Machine_DisplayType + if (!PassStringFilter(DisplayType, machine.DisplayType)) + return false; + + // Machine_Buttons + if (!PassStringFilter(Buttons, machine.Buttons)) + return false; + + #endregion + + #region ListXML + + // Machine_History + if (!PassStringFilter(History, machine.History)) + return false; + + // Machine_SourceFile + if (!PassStringFilter(SourceFile, machine.SourceFile)) + return false; + + // Machine_Runnable + if (Runnable.MatchesPositive(Core.Runnable.NULL, machine.Runnable) == false) + return false; + if (Runnable.MatchesNegative(Core.Runnable.NULL, machine.Runnable) == true) + return false; + + #endregion + + #region Logiqx + + // Machine_Board + if (!PassStringFilter(Board, machine.Board)) + return false; + + // Machine_RebuildTo + if (!PassStringFilter(RebuildTo, machine.RebuildTo)) + return false; + + #endregion + + #region Logiqx EmuArc + + // Machine_TitleID + if (!PassStringFilter(TitleID, machine.TitleID)) + return false; + + // Machine_Developer + if (!PassStringFilter(Developer, machine.Developer)) + return false; + + // Machine_Genre + if (!PassStringFilter(Genre, machine.Genre)) + return false; + + // Machine_Subgenre + if (!PassStringFilter(Subgenre, machine.Subgenre)) + return false; + + // Machine_Ratings + if (!PassStringFilter(Ratings, machine.Ratings)) + return false; + + // Machine_Score + if (!PassStringFilter(Score, machine.Score)) + return false; + + // Machine_Enabled + if (!PassStringFilter(Enabled, machine.Enabled)) + return false; + + // Machine_CRC + if (!PassBoolFilter(CRC, machine.Crc)) + return false; + + // Machine_RelatedTo + if (!PassStringFilter(RelatedTo, machine.RelatedTo)) + return false; + + #endregion + + #region OpenMSX + + // Machine_GenMSXID + if (!PassStringFilter(GenMSXID, machine.GenMSXID)) + return false; + + // Machine_System + if (!PassStringFilter(System, machine.System)) + return false; + + // Machine_Country + if (!PassStringFilter(Country, machine.Country)) + return false; + + #endregion + + #region SoftwareList + + // Machine_Supported + if (Supported.MatchesPositive(Core.Supported.NULL, machine.Supported) == false) + return false; + if (Supported.MatchesNegative(Core.Supported.NULL, machine.Supported) == true) + return false; + + #endregion // SoftwareList + + return true; + } + + #endregion } } diff --git a/SabreTools/Features/BaseFeature.cs b/SabreTools/Features/BaseFeature.cs index cdc37d78..5f682b20 100644 --- a/SabreTools/Features/BaseFeature.cs +++ b/SabreTools/Features/BaseFeature.cs @@ -2025,7 +2025,6 @@ Some special strings that can be used: { Cleaner cleaner = new Cleaner() { - DatHeaderFilter = new DatHeaderFilter(), DatItemFilter = new DatItemFilter(), MachineFilter = new MachineFilter(), diff --git a/SabreTools/Features/Batch.cs b/SabreTools/Features/Batch.cs index e284726c..87969828 100644 --- a/SabreTools/Features/Batch.cs +++ b/SabreTools/Features/Batch.cs @@ -208,13 +208,11 @@ Reset the internal state: reset();"; // Create cleaner to run filters from Cleaner cleaner = new Cleaner { - DatHeaderFilter = new DatHeaderFilter(), MachineFilter = new MachineFilter(), DatItemFilter = new DatItemFilter(), }; // Set the possible filters - cleaner.DatHeaderFilter.SetFilter(filterDatHeaderField, filterValue, filterRemove.Value); cleaner.MachineFilter.SetFilter(filterMachineField, filterValue, filterRemove.Value); cleaner.DatItemFilter.SetFilter(filterDatItemField, filterValue, filterRemove.Value);