4 struct bfiltervec filters
;
12 struct ifiltervec filters
;
24 struct pfiltervec filters
;
30 void filters_init(void)
37 #include "filters_common.inc.h"
45 #define MATCHFILTER(it,pk) \
46 ((*(IFT *)(pk) & VEC_BUF(filters,it).m) == VEC_BUF(filters,it).f)
48 #define DOFILTER(it,pk,code) \
50 for (it = 0;it < VEC_LENGTH(filters);++it) { \
51 if (unlikely(MATCHFILTER(it,pk))) { \
62 #define DOFILTER(it,pk,code) \
64 register IFT maskedpk = *(IFT *)(pk) & ifiltermask; \
65 for (size_t down = 0,up = VEC_LENGTH(filters);down < up;) { \
66 it = (up + down) / 2; \
67 if (maskedpk < VEC_BUF(filters,it).f) \
69 else if (maskedpk > VEC_BUF(filters,it).f) \
80 #define DOFILTER(it,pk,code) \
82 for (size_t down = 0,up = VEC_LENGTH(filters);down < up;) { \
83 it = (up + down) / 2; \
84 IFT maskedpk = *(IFT *)(pk) & VEC_BUF(filters,it).m; \
85 register int cmp = memcmp(&maskedpk,&VEC_BUF(filters,it).f,sizeof(IFT)); \
111 #define MATCHFILTER(it,pk) ( \
112 memcmp(pk,VEC_BUF(filters,it).f,VEC_BUF(filters,it).len) == 0 && \
113 (pk[VEC_BUF(filters,it).len] & VEC_BUF(filters,it).mask) == VEC_BUF(filters,it).f[VEC_BUF(filters,it).len])
115 #define DOFILTER(it,pk,code) \
117 for (it = 0;it < VEC_LENGTH(filters);++it) { \
118 if (unlikely(MATCHFILTER(it,pk))) { \
127 #define DOFILTER(it,pk,code) \
129 for (size_t down = 0,up = VEC_LENGTH(filters);down < up;) { \
130 it = (up + down) / 2; \
132 register int filterdiff = memcmp(pk,VEC_BUF(filters,it).f,VEC_BUF(filters,it).len); \
133 if (filterdiff < 0) { \
137 if (filterdiff > 0) { \
142 if ((pk[VEC_BUF(filters,it).len] & VEC_BUF(filters,it).mask) < \
143 VEC_BUF(filters,it).f[VEC_BUF(filters,it).len]) \
148 if ((pk[VEC_BUF(filters,it).len] & VEC_BUF(filters,it).mask) > \
149 VEC_BUF(filters,it).f[VEC_BUF(filters,it).len]) \
172 char pkconvbuf[BASE32_TO_LEN(PUBLIC_LEN) + 1]; \
173 pcre2_match_data *pcre2md = pcre2_match_data_create(128,0); \
174 PCRE2_SIZE *pcre2ovector = 0;
177 pcre2_match_data_free(pcre2md);
179 #define DOFILTER(it,pk,code) \
181 base32_to(pkconvbuf,pk,PUBLIC_LEN); \
182 size_t __l = VEC_LENGTH(filters); \
183 for (it = 0;it < __l;++it) { \
184 int rc = pcre2_match(VEC_BUF(filters,it).re,(PCRE2_SPTR8)pkconvbuf,BASE32_TO_LEN(PUBLIC_LEN),0, \
185 PCRE2_NO_UTF_CHECK,pcre2md,0); \
186 if (unlikely(rc >= 0)) { \
187 pcre2ovector = pcre2_get_ovector_pointer(pcre2md); \
194 #endif // PCRE2FILTER