ifilters/bfilters -> filters

This commit is contained in:
cathugger
2018-01-20 15:24:29 +00:00
parent 486d7118f8
commit 5023775a37

108
main.c
View File

@@ -96,34 +96,30 @@ struct intfilter {
IFT m; IFT m;
# endif # endif
} ; } ;
VEC_STRUCT(ifiltervec,struct intfilter) ifilters; VEC_STRUCT(ifiltervec,struct intfilter) filters;
# ifdef OMITMASK # ifdef OMITMASK
IFT ifiltermask; IFT ifiltermask;
# endif // BINSEARCH # endif // BINSEARCH
#else // INTFILTER #else // INTFILTER
VEC_STRUCT(bfiltervec,struct binfilter) bfilters; VEC_STRUCT(bfiltervec,struct binfilter) filters;
#endif // INTFILTER #endif // INTFILTER
static void filters_init() static void filters_init()
{ {
#ifdef INTFILTER VEC_INIT(filters);
VEC_INIT(ifilters);
#else
VEC_INIT(bfilters);
#endif
} }
#ifdef INTFILTER #ifdef INTFILTER
static void filter_sort(int (*compf)(const void *,const void *)) static void filter_sort(int (*compf)(const void *,const void *))
{ {
qsort(&VEC_BUF(ifilters,0),VEC_LENGTH(ifilters),sizeof(struct intfilter),compf); qsort(&VEC_BUF(filters,0),VEC_LENGTH(filters),sizeof(struct intfilter),compf);
} }
static inline size_t filter_len(size_t i) static inline size_t filter_len(size_t i)
{ {
# ifndef OMITMASK # ifndef OMITMASK
const u8 *m = (const u8 *)&VEC_BUF(ifilters,i).m; const u8 *m = (const u8 *)&VEC_BUF(filters,i).m;
# else // OMITMASK # else // OMITMASK
const u8 *m = (const u8 *)&ifiltermask; const u8 *m = (const u8 *)&ifiltermask;
# endif // OMITMASK # endif // OMITMASK
@@ -214,10 +210,10 @@ static void ifilter_addexpanded(
int ishift,int rshift) int ishift,int rshift)
{ {
flattened = 1; flattened = 1;
size_t i = VEC_LENGTH(ifilters); size_t i = VEC_LENGTH(filters);
VEC_ADDN(ifilters,cmask + 1); VEC_ADDN(filters,cmask + 1);
for (size_t j = 0;;++j) { for (size_t j = 0;;++j) {
VEC_BUF(ifilters,i + j).f = VEC_BUF(filters,i + j).f =
EXPVAL(ifltr->f,j,dmask,smask,ishift,rshift); EXPVAL(ifltr->f,j,dmask,smask,ishift,rshift);
if (j == cmask) if (j == cmask)
break; break;
@@ -229,13 +225,13 @@ static void ifilter_addexpanded(
static void ifilter_expand(IFT dmask,IFT smask,IFT cmask,int ishift,int rshift) static void ifilter_expand(IFT dmask,IFT smask,IFT cmask,int ishift,int rshift)
{ {
flattened = 1; flattened = 1;
size_t len = VEC_LENGTH(ifilters); size_t len = VEC_LENGTH(filters);
VEC_ADDN(ifilters,cmask * len); VEC_ADDN(filters,cmask * len);
size_t esz = cmask + 1; // size of expanded elements size_t esz = cmask + 1; // size of expanded elements
for (size_t i = len - 1;;--i) { for (size_t i = len - 1;;--i) {
for (IFT j = 0;;++j) { for (IFT j = 0;;++j) {
VEC_BUF(ifilters,i * esz + j).f = VEC_BUF(filters,i * esz + j).f =
EXPVAL(VEC_BUF(ifilters,i).f,j,dmask,smask,ishift,rshift); EXPVAL(VEC_BUF(filters,i).f,j,dmask,smask,ishift,rshift);
if (j == cmask) if (j == cmask)
break; break;
} }
@@ -246,15 +242,15 @@ static void ifilter_expand(IFT dmask,IFT smask,IFT cmask,int ishift,int rshift)
static inline void ifilter_addflatten(struct intfilter *ifltr,IFT mask) static inline void ifilter_addflatten(struct intfilter *ifltr,IFT mask)
{ {
if (VEC_LENGTH(ifilters) == 0) { if (VEC_LENGTH(filters) == 0) {
// simple // simple
VEC_ADD(ifilters,*ifltr); VEC_ADD(filters,*ifltr);
ifiltermask = mask; ifiltermask = mask;
return; return;
} }
if (ifiltermask == mask) { if (ifiltermask == mask) {
// lucky // lucky
VEC_ADD(ifilters,*ifltr); VEC_ADD(filters,*ifltr);
return; return;
} }
IFT cross = ifiltermask ^ mask; IFT cross = ifiltermask ^ mask;
@@ -278,7 +274,7 @@ static inline void ifilter_addflatten(struct intfilter *ifltr,IFT mask)
else { else {
ifiltermask = mask; ifiltermask = mask;
ifilter_expand(dmask,smask,cmask,ishift,rshift); ifilter_expand(dmask,smask,cmask,ishift,rshift);
VEC_ADD(ifilters,*ifltr); VEC_ADD(filters,*ifltr);
} }
} }
@@ -304,8 +300,8 @@ static int filter_compare(const void *p1,const void *p2)
static inline size_t filter_len(size_t i) static inline size_t filter_len(size_t i)
{ {
size_t c = VEC_BUF(bfilters,i).len * 8; size_t c = VEC_BUF(filters,i).len * 8;
u8 v = VEC_BUF(bfilters,i).mask; u8 v = VEC_BUF(filters,i).mask;
for (size_t k = 0;;) { for (size_t k = 0;;) {
if (!v) if (!v)
return c; return c;
@@ -318,7 +314,7 @@ static inline size_t filter_len(size_t i)
static void filter_sort(int (*compf)(const void *,const void *)) static void filter_sort(int (*compf)(const void *,const void *))
{ {
qsort(&VEC_BUF(bfilters,0),VEC_LENGTH(bfilters),sizeof(struct binfilter),compf); qsort(&VEC_BUF(filters,0),VEC_LENGTH(filters),sizeof(struct binfilter),compf);
} }
static int filter_compare(const void *p1,const void *p2) static int filter_compare(const void *p1,const void *p2)
@@ -402,10 +398,10 @@ static void filters_add(const char *filter)
# ifdef OMITMASK # ifdef OMITMASK
ifilter_addflatten(&ifltr,mc.i); ifilter_addflatten(&ifltr,mc.i);
# else // OMITMASK # else // OMITMASK
VEC_ADD(ifilters,ifltr); VEC_ADD(filters,ifltr);
# endif // OMITMASK # endif // OMITMASK
#else // INTFILTER #else // INTFILTER
VEC_ADD(bfilters,bf); VEC_ADD(filters,bf);
#endif // INTFILTER #endif // INTFILTER
} }
@@ -430,20 +426,12 @@ static void filters_prepare()
static void filters_clean() static void filters_clean()
{ {
#ifdef INTFILTER VEC_FREE(filters);
VEC_FREE(ifilters);
#else
VEC_FREE(bfilters);
#endif
} }
static size_t filters_count() static size_t filters_count()
{ {
#ifdef INTFILTER return VEC_LENGTH(filters);
return VEC_LENGTH(ifilters);
#else
return VEC_LENGTH(bfilters);
#endif
} }
#ifdef STATISTICS #ifdef STATISTICS
@@ -457,11 +445,11 @@ static size_t filters_count()
# ifndef BINSEARCH # ifndef BINSEARCH
#define MATCHFILTER(it,pk) \ #define MATCHFILTER(it,pk) \
((*(IFT *)(pk) & VEC_BUF(ifilters,it).m) == VEC_BUF(ifilters,it).f) ((*(IFT *)(pk) & VEC_BUF(filters,it).m) == VEC_BUF(filters,it).f)
#define DOFILTER(it,pk,code) \ #define DOFILTER(it,pk,code) \
do { \ do { \
for (it = 0;it < VEC_LENGTH(ifilters);++it) { \ for (it = 0;it < VEC_LENGTH(filters);++it) { \
if (unlikely(MATCHFILTER(it,pk))) { \ if (unlikely(MATCHFILTER(it,pk))) { \
code; \ code; \
break; \ break; \
@@ -476,11 +464,11 @@ do { \
#define DOFILTER(it,pk,code) \ #define DOFILTER(it,pk,code) \
do { \ do { \
register IFT maskedpk = *(IFT *)(pk) & ifiltermask; \ register IFT maskedpk = *(IFT *)(pk) & ifiltermask; \
for (size_t down = 0,up = VEC_LENGTH(ifilters);down < up;) { \ for (size_t down = 0,up = VEC_LENGTH(filters);down < up;) { \
it = (up + down) / 2; \ it = (up + down) / 2; \
if (maskedpk < VEC_BUF(ifilters,it).f) \ if (maskedpk < VEC_BUF(filters,it).f) \
up = it; \ up = it; \
else if (maskedpk > VEC_BUF(ifilters,it).f) \ else if (maskedpk > VEC_BUF(filters,it).f) \
down = it + 1; \ down = it + 1; \
else { \ else { \
code; \ code; \
@@ -493,10 +481,10 @@ do { \
#define DOFILTER(it,pk,code) \ #define DOFILTER(it,pk,code) \
do { \ do { \
for (size_t down = 0,up = VEC_LENGTH(ifilters);down < up;) { \ for (size_t down = 0,up = VEC_LENGTH(filters);down < up;) { \
it = (up + down) / 2; \ it = (up + down) / 2; \
IFT maskedpk = *(IFT *)(pk) & VEC_BUF(ifilters,it).m; \ IFT maskedpk = *(IFT *)(pk) & VEC_BUF(filters,it).m; \
register int cmp = memcmp(&maskedpk,&VEC_BUF(ifilters,it).f,sizeof(IFT)); \ register int cmp = memcmp(&maskedpk,&VEC_BUF(filters,it).f,sizeof(IFT)); \
if (cmp < 0) \ if (cmp < 0) \
up = it; \ up = it; \
else if (cmp > 0) \ else if (cmp > 0) \
@@ -517,12 +505,12 @@ do { \
# ifndef BINSEARCH # ifndef BINSEARCH
#define MATCHFILTER(it,pk) ( \ #define MATCHFILTER(it,pk) ( \
memcmp(pk,VEC_BUF(bfilters,it).f,VEC_BUF(bfilters,it).len) == 0 && \ memcmp(pk,VEC_BUF(filters,it).f,VEC_BUF(filters,it).len) == 0 && \
(pk[VEC_BUF(bfilters,it).len] & VEC_BUF(bfilters,it).mask) == VEC_BUF(bfilters,it).f[VEC_BUF(bfilters,it).len]) (pk[VEC_BUF(filters,it).len] & VEC_BUF(filters,it).mask) == VEC_BUF(filters,it).f[VEC_BUF(filters,it).len])
#define DOFILTER(it,pk,code) \ #define DOFILTER(it,pk,code) \
do { \ do { \
for (it = 0;it < VEC_LENGTH(bfilters);++it) { \ for (it = 0;it < VEC_LENGTH(filters);++it) { \
if (unlikely(MATCHFILTER(it,pk))) { \ if (unlikely(MATCHFILTER(it,pk))) { \
code; \ code; \
break; \ break; \
@@ -534,10 +522,10 @@ do { \
#define DOFILTER(it,pk,code) \ #define DOFILTER(it,pk,code) \
do { \ do { \
for (size_t down = 0,up = VEC_LENGTH(bfilters);down < up;) { \ for (size_t down = 0,up = VEC_LENGTH(filters);down < up;) { \
it = (up + down) / 2; \ it = (up + down) / 2; \
{ \ { \
register int filterdiff = memcmp(pk,VEC_BUF(bfilters,it).f,VEC_BUF(bfilters,it).len); \ register int filterdiff = memcmp(pk,VEC_BUF(filters,it).f,VEC_BUF(filters,it).len); \
if (filterdiff < 0) { \ if (filterdiff < 0) { \
up = it; \ up = it; \
continue; \ continue; \
@@ -547,14 +535,14 @@ do { \
continue; \ continue; \
} \ } \
} \ } \
if ((pk[VEC_BUF(bfilters,it).len] & VEC_BUF(bfilters,it).mask) < \ if ((pk[VEC_BUF(filters,it).len] & VEC_BUF(filters,it).mask) < \
VEC_BUF(bfilters,it).f[VEC_BUF(bfilters,it).len]) \ VEC_BUF(filters,it).f[VEC_BUF(filters,it).len]) \
{ \ { \
up = it; \ up = it; \
continue; \ continue; \
} \ } \
if ((pk[VEC_BUF(bfilters,it).len] & VEC_BUF(bfilters,it).mask) > \ if ((pk[VEC_BUF(filters,it).len] & VEC_BUF(filters,it).mask) > \
VEC_BUF(bfilters,it).f[VEC_BUF(bfilters,it).len]) \ VEC_BUF(filters,it).f[VEC_BUF(filters,it).len]) \
{ \ { \
down = it + 1; \ down = it + 1; \
continue; \ continue; \
@@ -591,11 +579,7 @@ static void filters_print()
if (quietflag) if (quietflag)
return; return;
size_t i,l; size_t i,l;
#ifdef INTFILTER l = VEC_LENGTH(filters);
l = VEC_LENGTH(ifilters);
#else
l = VEC_LENGTH(bfilters);
#endif
if (l) if (l)
fprintf(stderr,"filters:\n"); fprintf(stderr,"filters:\n");
@@ -615,17 +599,17 @@ static void filters_print()
u8 *imraw; u8 *imraw;
# ifndef OMITMASK # ifndef OMITMASK
imraw = (u8 *)&VEC_BUF(ifilters,i).m; imraw = (u8 *)&VEC_BUF(filters,i).m;
# else # else
imraw = (u8 *)&ifiltermask; imraw = (u8 *)&ifiltermask;
# endif # endif
while (len < sizeof(IFT) && imraw[len] != 0x00) ++len; while (len < sizeof(IFT) && imraw[len] != 0x00) ++len;
u8 mask = imraw[len-1]; u8 mask = imraw[len-1];
u8 *ifraw = (u8 *)&VEC_BUF(ifilters,i).f; u8 *ifraw = (u8 *)&VEC_BUF(filters,i).f;
#else #else
size_t len = VEC_BUF(bfilters,i).len + 1; size_t len = VEC_BUF(filters,i).len + 1;
u8 mask = VEC_BUF(bfilters,i).mask; u8 mask = VEC_BUF(filters,i).mask;
u8 *ifraw = VEC_BUF(bfilters,i).f; u8 *ifraw = VEC_BUF(filters,i).f;
#endif #endif
base32_to(buf0,ifraw,len); base32_to(buf0,ifraw,len);
memcpy(bufx,ifraw,len); memcpy(bufx,ifraw,len);