88static unsigned char normal_chars[] = {0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xFF};
92#define rn_masktop (squid_mask_rnhead->rnh_treetop)
93#define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey
94#define rn_off rn_u.rn_node.rn_Off
95#define rn_l rn_u.rn_node.rn_L
96#define rn_r rn_u.rn_node.rn_R
97#define rm_mask rm_rmu.rmu_mask
98#define rm_leaf rm_rmu.rmu_leaf
101#define squid_Bcmp(a, b, l) (l == 0 ? 0 : memcmp((caddr_t)(a), (caddr_t)(b), (u_long)l))
102#define squid_R_Malloc(p, t, n) (p = (t) xmalloc((unsigned int)(n)))
103#define squid_Free(p) xfree((char *)p)
104#define squid_MKGet(m) {\
105 if (squid_rn_mkfreelist) {\
106 m = squid_rn_mkfreelist; \
107 squid_rn_mkfreelist = (m)->rm_mklist; \
109 squid_R_Malloc(m, struct squid_radix_mask *, sizeof (*(m)));\
112#define squid_MKFree(m) { (m)->rm_mklist = squid_rn_mkfreelist; squid_rn_mkfreelist = (m);}
115#define min(x,y) ((x)<(y)? (x) : (y))
156 for (x =
head, v = v_arg; x->
rn_b >= 0;) {
168 register caddr_t v = v_arg, m = m_arg;
183 register caddr_t m = m_arg, n = n_arg;
184 register caddr_t lim, lim2 = lim = n + *(u_char *) n;
185 int longer = (*(u_char *) n++) - (
int) (*(u_char *) m++);
186 int masks_are_equal = 1;
199 if (masks_are_equal && (longer < 0))
200 for (lim2 = m - longer; m < lim2;)
203 return (!masks_are_equal);
218 while (x && x->rn_mask != netmask)
227 register char *cp = trial, *cp2 = leaf->rn_key, *cp3 = leaf->rn_mask;
229 int length =
min(*(u_char *) cp, *(u_char *) cp2);
234 length =
min(length, *(u_char *) cp3);
238 for (cp += skip; cp < cplim; cp++, cp2++, cp3++)
239 if ((*cp ^ *cp2) & *cp3)
248 register caddr_t cp = v, cp2;
251 int off = t->rn_off, vlen = *(u_char *) cp, matched_off;
252 register int test, b,
rn_b;
258 for (; t->
rn_b >= 0;) {
276 vlen = *(u_char *) t->rn_mask;
278 cp2 = t->rn_key + off;
280 for (; cp < cplim; cp++, cp2++)
291 test = (*cp ^ *cp2) & 0xff;
292 for (b = 7; (test >>= 1) > 0;)
294 matched_off = cp - v;
295 b += matched_off << 3;
300 if ((saved_t = t)->rn_mask == 0)
302 for (; t; t = t->rn_dupedkey)
330 off =
min(t->rn_off, matched_off);
332 while (x && x->rn_mask != m->rm_mask)
347 t->rn_bmask = 0x80 >> (b & 7);
351 tt->rn_key = (caddr_t) v;
361 int head_off = top->rn_off, vlen = (
int) *((u_char *) v);
363 register caddr_t cp = v + head_off;
370 register caddr_t cp2 = t->rn_key + head_off;
371 register int cmp_res;
372 caddr_t cplim = v + vlen;
381 cmp_res = (cp[-1] ^ cp2[-1]) & 0xff;
382 for (b = (cp - v) << 3; cmp_res; b--)
394 }
while (b > (
unsigned) x->
rn_b);
397 if ((cp[p->rn_off] & p->
rn_bmask) == 0)
403 if ((cp[t->rn_off] & t->
rn_bmask) == 0) {
415 caddr_t netmask = (caddr_t) n_arg;
417 register caddr_t cp, cplim;
418 register int b = 0, mlen, j;
419 int maskduplicated, m0, isnormal;
421 static int last_zeroed = 0;
431 if ((m0 = mlen) > skip)
432 memcpy(
addmask_key + skip, netmask + skip, mlen - skip);
440 if (m0 >= last_zeroed)
444 if (m0 < last_zeroed)
453 if ((saved_x = x) == 0)
456 netmask = cp = (caddr_t) (x + 2);
459 if (maskduplicated) {
460 fprintf(stderr,
"squid_rn_addmask: mask impossibly already in tree");
467 cplim = netmask + mlen;
469 for (cp = netmask + skip; (cp < cplim) && *(u_char *) cp == 0xff;)
472 for (j = 0x80; (j & *cp) != 0; j >>= 1)
477 b += (cp - netmask) << 3;
487 register u_char *mp = m_arg, *np = n_arg, *lim;
492 for (lim = mp + *mp; mp < lim;)
504 fprintf(stderr,
"Mask for route not entered\n");
507 memset(m,
'\0',
sizeof *m);
513 m->rm_mask = tt->rn_mask;
521 caddr_t v = (caddr_t) v_arg, netmask = (caddr_t) n_arg;
524 short b = 0, b_leaf = 0;
548 for (t = tt; tt; t = tt, tt = tt->rn_dupedkey) {
549 if (tt->rn_mask == netmask)
553 ((b_leaf < tt->rn_b) ||
568 if (tt == saved_tt) {
574 tt->rn_p = x = t->
rn_p;
583 tt->rn_dupedkey = t->rn_dupedkey;
586 tt->rn_key = (caddr_t) v;
594 tt->rn_mask = netmask;
601 b_leaf = -1 - t->
rn_b;
602 if (t->rn_r == saved_tt)
608 for (mp = &t->
rn_mklist; x; x = x->rn_dupedkey)
609 if (x->rn_mask && (x->
rn_b >= b_leaf) && x->
rn_mklist == 0) {
618 if (m->
rm_b >= b_leaf)
625 if ((netmask == 0) || (b > t->
rn_b))
631 }
while (b <= t->
rn_b && x != top);
639 if (m->
rm_b < b_leaf)
641 if (m->
rm_b > b_leaf)
644 mmask = m->rm_leaf->rn_mask;
647 "Non-unique normal route, mask not entered");
652 if (mmask == netmask) {
670 int b, head_off, vlen;
673 netmask = netmask_arg;
674 x =
head->rnh_treetop;
676 head_off = x->rn_off;
677 vlen = *(u_char *) v;
681 memcmp(v + head_off, tt->rn_key + head_off, vlen - head_off))
690 while (tt->rn_mask != netmask)
691 if ((tt = tt->rn_dupedkey) == 0)
694 if (tt->rn_mask == 0 || (saved_m = m = tt->
rn_mklist) == 0)
697 if (m->rm_leaf != tt || m->
rm_refs > 0) {
698 fprintf(stderr,
"squid_rn_delete: inconsistent annotation\n");
702 if (m->rm_mask != tt->rn_mask) {
703 fprintf(stderr,
"squid_rn_delete: inconsistent annotation\n");
716 }
while (b <= t->
rn_b && x != top);
724 fprintf(stderr,
"squid_rn_delete: couldn't find our annotation\n");
735 if ((dupedkey = saved_tt->rn_dupedkey)) {
736 if (tt == saved_tt) {
744 for (x = p = saved_tt; p && p->rn_dupedkey != tt;)
747 p->rn_dupedkey = tt->rn_dupedkey;
749 fprintf(stderr,
"squid_rn_delete: couldn't find us\n");
786 for (m = t->
rn_mklist; m && x; x = x->rn_dupedkey)
829 while (rn->
rn_b >= 0)
837 for (rn = rn->
rn_p->rn_r; rn->
rn_b >= 0;)
841 while ((rn = base)) {
842 base = rn->rn_dupedkey;
863 memset(rnh,
'\0',
sizeof(*rnh));
890 for (dom = domains; dom; dom = dom->dom_next)
896 "squid_rn_init: radix functions require squid_max_keylen be set\n");
901 fprintf(stderr,
"squid_rn_init failed.\n");
910 fprintf(stderr,
"rn_init2 failed.\n");
void error(char *format,...)
squidaio_request_t * head
int squid_rn_walktree(struct squid_radix_node_head *h, int(*f)(struct squid_radix_node *, void *), void *w)
struct squid_radix_node * squid_rn_addroute(void *v_arg, void *n_arg, struct squid_radix_node_head *head, struct squid_radix_node treenodes[2])
struct squid_radix_node_head * squid_mask_rnhead
int squid_rn_refines(void *m_arg, void *n_arg)
struct squid_radix_node * squid_rn_lookup(void *v_arg, void *m_arg, struct squid_radix_node_head *head)
static struct squid_radix_mask * rn_new_radix_mask(struct squid_radix_node *tt, struct squid_radix_mask *next)
static unsigned char normal_chars[]
int squid_rn_inithead(struct squid_radix_node_head **head, int off)
struct squid_radix_mask * squid_rn_mkfreelist
static int rn_lexobetter(void *m_arg, void *n_arg)
#define squid_R_Malloc(p, t, n)
static char * addmask_key
struct squid_radix_node * squid_rn_newpair(void *v, int b, struct squid_radix_node nodes[2])
struct squid_radix_node * squid_rn_addmask(void *n_arg, int search, int skip)
struct squid_radix_node * squid_rn_search_m(void *v_arg, struct squid_radix_node *head, void *m_arg)
struct squid_radix_node * squid_rn_search(void *v_arg, struct squid_radix_node *head)
struct squid_radix_node * squid_rn_insert(void *v_arg, struct squid_radix_node_head *head, int *dupentry, struct squid_radix_node nodes[2])
struct squid_radix_node * squid_rn_match(void *v_arg, struct squid_radix_node_head *head)
struct squid_radix_node * squid_rn_delete(void *v_arg, void *netmask_arg, struct squid_radix_node_head *head)
static int rn_satsifies_leaf(char *trial, register struct squid_radix_node *leaf, int skip)
struct squid_radix_mask * rm_mklist
struct squid_radix_node * rnh_deladdr(void *v, void *mask, struct squid_radix_node_head *head)
struct squid_radix_node * rnh_lookup(void *v, void *mask, struct squid_radix_node_head *head)
struct squid_radix_node * rnh_matchaddr(void *v, struct squid_radix_node_head *head)
int rnh_walktree(struct squid_radix_node_head *head, int(*f)(struct squid_radix_node *, void *), void *w)
struct squid_radix_node * rnh_treetop
struct squid_radix_node * rnh_addaddr(void *v, void *mask, struct squid_radix_node_head *head, struct squid_radix_node nodes[])
struct squid_radix_node rnh_nodes[3]
struct squid_radix_node * rn_p
struct squid_radix_mask * rn_mklist