don't offload dead code elimination to compiler as we can do that in preprocessor
[mkp224o.git] / filters_worker.inc.h
blob3f48746edb71a33f58792ee5a6abe611e07aba15
2 #ifdef BINFILTER
4 struct bfiltervec filters;
6 #endif // BINFILTER
10 #ifdef INTFILTER
12 struct ifiltervec filters;
14 # ifdef OMITMASK
15 IFT ifiltermask;
16 # endif
18 #endif // INTFILTER
22 #ifdef PCRE2FILTER
24 struct pfiltervec filters;
26 #endif // PCRE2FILTER
30 void filters_init(void)
32 VEC_INIT(filters);
37 #include "filters_common.inc.h"
41 #ifdef INTFILTER
43 # ifndef BINSEARCH
45 #define MATCHFILTER(it,pk) \
46 ((*(IFT *)(pk) & VEC_BUF(filters,it).m) == VEC_BUF(filters,it).f)
48 #define DOFILTER(it,pk,code) \
49 do { \
50 for (it = 0;it < VEC_LENGTH(filters);++it) { \
51 if (unlikely(MATCHFILTER(it,pk))) { \
52 code; \
53 break; \
54 } \
55 } \
56 } while (0)
58 # else // BINSEARCH
60 # ifdef OMITMASK
62 #define DOFILTER(it,pk,code) \
63 do { \
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) \
68 up = it; \
69 else if (maskedpk > VEC_BUF(filters,it).f) \
70 down = it + 1; \
71 else { \
72 code; \
73 break; \
74 } \
75 } \
76 } while (0)
78 # else // OMITMASK
80 #define DOFILTER(it,pk,code) \
81 do { \
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)); \
86 if (cmp < 0) \
87 up = it; \
88 else if (cmp > 0) \
89 down = it + 1; \
90 else { \
91 code; \
92 break; \
93 } \
94 } \
95 } while (0)
97 # endif // OMITMASK
99 # endif // BINSEARCH
101 #define PREFILTER
102 #define POSTFILTER
104 #endif // INTFILTER
107 #ifdef BINFILTER
109 # ifndef BINSEARCH
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) \
116 do { \
117 for (it = 0;it < VEC_LENGTH(filters);++it) { \
118 if (unlikely(MATCHFILTER(it,pk))) { \
119 code; \
120 break; \
123 } while (0)
125 # else // BINSEARCH
127 #define DOFILTER(it,pk,code) \
128 do { \
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) { \
134 up = it; \
135 continue; \
137 if (filterdiff > 0) { \
138 down = it + 1; \
139 continue; \
142 if ((pk[VEC_BUF(filters,it).len] & VEC_BUF(filters,it).mask) < \
143 VEC_BUF(filters,it).f[VEC_BUF(filters,it).len]) \
145 up = it; \
146 continue; \
148 if ((pk[VEC_BUF(filters,it).len] & VEC_BUF(filters,it).mask) > \
149 VEC_BUF(filters,it).f[VEC_BUF(filters,it).len]) \
151 down = it + 1; \
152 continue; \
155 code; \
156 break; \
159 } while (0)
161 # endif // BINSEARCH
163 #define PREFILTER
164 #define POSTFILTER
166 #endif // BINFILTER
169 #ifdef PCRE2FILTER
171 #define PREFILTER \
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;
176 #define POSTFILTER \
177 pcre2_match_data_free(pcre2md);
179 #define DOFILTER(it,pk,code) \
180 do { \
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); \
188 code; \
189 break; \
192 } while (0)
194 #endif // PCRE2FILTER