/* { 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) */
/* { from mrt.h */
-#define PATRICIA_MAXSLOTS 5
+#define PATRICIA_MAXSLOTS 7
typedef struct _prefix_t {
int findnodeext(const char *name);
void releasenodeext(int index);
+void node_increment_usercount( patricia_node_t *node);
+void node_decrement_usercount( patricia_node_t *node);
+int is_normalized_ipmask( struct irc_in_addr *sin, unsigned char bitlen );
+
/* alloc */
void freeprefix (prefix_t *prefix);
prefix_t *newprefix();
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 { \
} \
} while (0)
+#define PATRICIA_WALK_CLEAR(Xhead, Xnode) \
+ patricia_node_t *Xstack[PATRICIA_MAXBITS+1]; \
+ patricia_node_t **Xsp = Xstack; \
+ patricia_node_t *Xrn = (Xhead); \
+ while ((Xnode = Xrn)) { \
+ patricia_node_t *l = Xrn->l; \
+ patricia_node_t *r = Xrn->r; \
+
+#define PATRICIA_WALK_CLEAR_END \
+ if (l) { \
+ if (r) { \
+ *Xsp++ = r; \
+ } \
+ Xrn = l; \
+ } else if (r) { \
+ Xrn = r; \
+ } else if (Xsp != Xstack) { \
+ Xrn = *(--Xsp); \
+ } else { \
+ Xrn = (patricia_node_t *) 0; \
+ } \
+ }
+
#endif /* _PATRICIA_H */