aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Gschwantner <tharre3@gmail.com>2019-04-13 22:11:15 +0200
committerThomas Gschwantner <tharre3@gmail.com>2019-06-02 00:39:36 +0200
commit1fd03ee3242ee212a63b0ca2dee4a8ae83221d10 (patch)
tree9362cd6e7b07ab4ef3167d4ad68842a6ada3199c
parentradix-trie: remove bits arg from radix_insert_v4/6 (diff)
downloadwg-dynamic-1fd03ee3242ee212a63b0ca2dee4a8ae83221d10.tar.xz
wg-dynamic-1fd03ee3242ee212a63b0ca2dee4a8ae83221d10.zip
radix-trie: fix fls/fls64
-rw-r--r--radix-trie.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/radix-trie.c b/radix-trie.c
index 4786c69..6e086cf 100644
--- a/radix-trie.c
+++ b/radix-trie.c
@@ -25,22 +25,22 @@ struct radix_node {
uint8_t cidr, bit_at_a, bit_at_b;
};
-// TODO: sort out #ifdef business to make this portable
-static unsigned int fls64(uint64_t a)
+static unsigned int fls64(uint64_t x)
{
- return __builtin_ctzl(a) + 1;
+ return x ? sizeof(unsigned long long) * 8 - __builtin_clzll(x) : 0;
}
-static unsigned int fls(uint32_t a)
+static unsigned int fls(uint32_t x)
{
- return __builtin_ctz(a) + 1;
+ return x ? sizeof(unsigned long) * 8 - __builtin_clzl(x) : 0;
}
static unsigned int fls128(uint64_t a, uint64_t b)
{
- return a ? fls64(a) + 64U : (b ? fls64(b) : 0);
+ return a ? fls64(a) + 64U : fls64(b);
}
+/* TODO: portable implementations */
static void swap_endian(uint8_t *dst, const uint8_t *src, uint8_t bits)
{
if (bits == 32) {