diff --git a/configure.ac b/configure.ac index 827b70d..e8dc082 100644 --- a/configure.ac +++ b/configure.ac @@ -128,14 +128,29 @@ then CFLAGS="$CFLAGS -msse2" fi + AC_ARG_ENABLE([intfilter], [AS_HELP_STRING([--enable-intfilter], - [use 64bit integers for filtering. faster but limits filter length @<:@default=no@:>@])], + [use 64-bit integers for filtering. faster but limits filter length to 12 @<:@default=no@:>@])], [], [enable_intfilter=no] ) -if test "x$enable_intfilter" = "xyes" +AC_ARG_ENABLE([intfilter32], + [AS_HELP_STRING([--enable-intfilter32], + [use 32-bit integers for filtering. even faster on 32-bit machines but limits filter length to 6 @<:@default=no@:>@])], + [], [enable_intfilter32=no] +) +if test "x$enable_intfilter32" = "xyes" then - MYDEFS="$MYDEFS -DINTFILTER" + if test "x$enable_intfilter" = "xyes" + then + AC_MSG_WARN([both intfilter and intfilter32 specified; using intfilter32]) + fi + MYDEFS="$MYDEFS -DINTFILTER -DIFT=u32" +else + if test "x$enable_intfilter" = "xyes" + then + MYDEFS="$MYDEFS -DINTFILTER" + fi fi AC_ARG_ENABLE([statistics], diff --git a/main.c b/main.c index cf46562..4f27090 100644 --- a/main.c +++ b/main.c @@ -74,8 +74,11 @@ struct binfilter { } ; #ifdef INTFILTER +#ifndef IFT +#define IFT u64 +#endif struct intfilter { - u64 f,m; + IFT f,m; } ; VEC_STRUCT(ifiltervec,struct intfilter) ifilters; #else @@ -146,8 +149,8 @@ static void filters_add(const char *filter) size_t ret, ret2; #ifdef INTFILTER union intconv { - u64 i; - u8 b[8]; + IFT i; + u8 b[sizeof(IFT)]; } fc,mc; #endif @@ -161,7 +164,7 @@ static void filters_add(const char *filter) if (!ret) return; #ifdef INTFILTER - if (ret > 8) + if (ret > sizeof(IFT)) #else if (ret > PUBLIC_LEN) #endif @@ -177,7 +180,7 @@ static void filters_add(const char *filter) for (size_t i = 0;i < bf.len;++i) mc.b[i] = 0xFF; mc.b[bf.len] = bf.mask; - memcpy(fc.b,bf.f,8); + memcpy(fc.b,bf.f,sizeof(fc.b)); fc.i &= mc.i; struct intfilter ifltr = {.f = fc.i,.m = mc.i}; VEC_FOR(ifilters,i) { @@ -227,7 +230,7 @@ static size_t filters_count() #ifdef INTFILTER #define FILTERFOR(it) for (it = 0;it < VEC_LENGTH(ifilters);++it) -#define MATCHFILTER(it,pk) ((*(u64 *)(pk) & VEC_BUF(ifilters,it).m) == VEC_BUF(ifilters,it).f) +#define MATCHFILTER(it,pk) ((*(IFT *)(pk) & VEC_BUF(ifilters,it).m) == VEC_BUF(ifilters,it).f) #else @@ -273,7 +276,7 @@ static void printfilters() #ifdef INTFILTER size_t len = 0; u8 *imraw = (u8 *)&VEC_BUF(ifilters,i).m; - while (len < 8 && imraw[len] != 0x00) ++len; + while (len < sizeof(IFT) && imraw[len] != 0x00) ++len; u8 mask = imraw[len-1]; u8 *ifraw = (u8 *)&VEC_BUF(ifilters,i).f; #else