]> jfr.im git - irc/quakenet/newserv.git/blobdiff - patricia/patricia.h
CHANSERV: reduce reason to 15 chars
[irc/quakenet/newserv.git] / patricia / patricia.h
index 68fc4950472c4814ed86b2c7dbba6c597664985a..b67408d06d0ddcc6d256a578ca6ca122576d84e9 100644 (file)
@@ -26,7 +26,6 @@ typedef void (*void_fn_t)();
 /* { 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) */
@@ -43,7 +42,7 @@ typedef void (*void_fn_t)();
 
 /* { from mrt.h */
 
-#define PATRICIA_MAXSLOTS 5
+#define PATRICIA_MAXSLOTS 
 
 
 typedef struct _prefix_t {
@@ -97,6 +96,10 @@ int registernodeext(const char *name);
 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();
@@ -108,8 +111,11 @@ void freenode (patricia_node_t *node);
 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 { \
@@ -151,4 +157,27 @@ 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 */