+#
+# this routine accepts a composite filter with a reject component and then an accept
+# the filter returns 0 if an entry is matched by any reject rule and also if any
+# accept rule fails otherwise it returns 1
+#
+# the either set of rules may be missing meaning an implicit 'ok'
+#
+# reject rules are implicitly 'or' logic (any reject rules which fires kicks it out)
+# accept rules are implicitly 'and' logic (all accept rules must pass to indicate a match)
+#
+# unlike the old system, this is kept as a hash of hashes so that you can
+# easily change them by program.
+#
+# you can have a [any] number of 'filters', they are tried in random order until one matches
+#
+# an example in machine readable form:-
+# bless ({
+# name => 'G7BRN.pl',
+# sort => 'spots',
+# filter1 => {
+# user_rej => {
+# by_dxcc => 'W,VE',
+# },
+# reject => {
+# by_dxcc => [6, 'n', 226,197],
+# },
+# user_acc => {
+# freq => '0/30000',
+# },
+# accept => {
+# freq => [0, 'r', 0, 30000],
+# },
+# },
+# filter2 => {
+# user_acc => {
+# freq => 'vhf',
+# by_zone => '14,15,16',
+# },
+# accept => {
+# freq => [0, 'r', 50000,52000,70000,70500,144000,148000],
+# by_zone => [11, 'n', 14,15,16],
+# }
+# },
+# }, 'Filter');
+#
+# in user commands:-
+#
+# clear/spots 1 2
+# accept/spots 1 freq 0/30000
+# reject/spots 1 by_dxcc W,VE
+# accept/spots 2 freq vhf
+# accept/spots 2 by_zone 14,15,16
+#
+# no filter no implies filter 1
+#
+# The field nos are the same as for the 'Old' filters
+#
+# The user_* fields are there so that the structure can be listed easily
+# in human readable form when required. They are not used in the filtering
+# process itself.
+#
+# This defines an HF filter and a VHF filter (as it happens)
+#