Posted to tcl by kbk at Wed Oct 16 20:01:22 GMT 2019view pretty

static inline unsigned char 
Patricia_bit(unsigned char* s, size_t l, int b)
{
    if (b < 0 || b >= 8*l) {
	return 0;
    } else {
	int c = b>>3;
	int cb = b & 0x7;
	return !!(s[c] & (0x80 >> cb));
    }
}


int 
Patricia_search(const Patricia* tree, unsigned char* name)
{
    int p = 0;
    size_t len = strlen(name);
    int x = tree[p].left;
    while (tree[p].bit < tree[x].bit) {
	p = x;
	x = (Patricia_bit(name, len, tree[x].bit)) ? 
	    tree[x].right : tree[x].left;
    }
    if (!strcmp(name, tree[x].key)) {
	return x;
    } else {
	return -1;
    }
}