mirror of
https://github.com/cathugger/mkp224o.git
synced 2025-12-05 21:27:13 -06:00
ifilters/bfilters -> filters
This commit is contained in:
108
main.c
108
main.c
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user