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);