/* { from defs.h */
#define prefix_touchar(prefix) ((u_char *)&(prefix)->sin)
#define MAXLINE 1024
-#define BIT_TEST(f, b) ((f) & (b))
/* } */
#include <sys/types.h> /* for u_* definitions (on FreeBSD 5) */
patricia_node_t *refnode(patricia_tree_t *tree, struct irc_in_addr *sin, int bitlen);
void derefnode(patricia_tree_t *tree, patricia_node_t *node);
+#define get_byte_for_bit(base, nr) (base)[(nr) >> 3]
+#define bigendian_bitfor(nr) (0x80 >> ((nr) & 0x07))
+#define is_bit_set(base, nr) (get_byte_for_bit(base, nr) & bigendian_bitfor(nr))
+
#define PATRICIA_MAXBITS 128
-#define PATRICIA_NBYTE(x) ((x) >> 3)
#define PATRICIA_WALK(Xhead, Xnode) \
do { \
addr = (u_char *)sin;
while (node->bit < bitlen) {
- if (BIT_TEST (addr[node->bit >> 3], 0x80 >> (node->bit & 0x07)))
+ if (is_bit_set(addr,node->bit))
node = node->r;
else
node = node->l;
stack[cnt++] = node;
}
- if (BIT_TEST (addr[node->bit >> 3], 0x80 >> (node->bit & 0x07))) {
+ if (is_bit_set(addr,node->bit)) {
node = node->r;
}
else {
while (node->bit < bitlen || node->prefix == NULL) {
/* check that we're not at the lowest leaf i.e. node->bit is less than max bits */
if (node->bit < patricia->maxbits &&
- (addr[node->bit >> 3]) & (0x80 >> (node->bit & 0x07))) {
+ (is_bit_set(addr,node->bit))) {
if (node->r == NULL)
break;
node = node->r;
if (node->bit == differ_bit) {
new_node->parent = node;
if (node->bit < patricia->maxbits &&
- (addr[node->bit >> 3]) & (0x80 >> (node->bit & 0x07))) {
+ (is_bit_set(addr, node->bit))) {
assert (node->r == NULL);
node->r = new_node;
}
if (bitlen == differ_bit) {
if (bitlen < patricia->maxbits &&
- (test_addr[bitlen >> 3]) & (0x80 >> (bitlen & 0x07))) {
+ (is_bit_set(addr,bitlen))) {
new_node->r = node;
}
else {
glue->parent = node->parent;
if (differ_bit < patricia->maxbits &&
- (addr[differ_bit >> 3]) & (0x80 >> (differ_bit & 0x07))) {
+ (is_bit_set(addr, differ_bit))) {
glue->r = new_node;
glue->l = node;
}