check_ctz64(0, 64);
}
+static void
+check_clz32(uint32_t x, int n)
+{
+ if (clz32(x) != n) {
+ fprintf(stderr, "clz32(%"PRIu32") is %d but should be %d\n",
+ x, clz32(x), n);
+ abort();
+ }
+}
+
+static void
+check_clz64(uint64_t x, int n)
+{
+ if (clz64(x) != n) {
+ fprintf(stderr, "clz64(%"PRIu64") is %d but should be %d\n",
+ x, clz64(x), n);
+ abort();
+ }
+}
+
+static void
+test_clz(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
+{
+ int n;
+
+ for (n = 0; n < 32; n++) {
+ /* Check minimum x such that f(x) == n. */
+ check_clz32((1u << 31) >> n, n);
+
+ /* Check maximum x such that f(x) == n. */
+ check_clz32(UINT32_MAX >> n, n);
+
+ /* Check a random value in the middle. */
+ check_clz32((random_uint32() | 1u << 31) >> n, n);
+ }
+
+ for (n = 0; n < 64; n++) {
+ /* Check minimum x such that f(x) == n. */
+ check_clz64((UINT64_C(1) << 63) >> n, n);
+
+ /* Check maximum x such that f(x) == n. */
+ check_clz64(UINT64_MAX >> n, n);
+
+ /* Check a random value in the middle. */
+ check_clz64((random_uint64() | UINT64_C(1) << 63) >> n, n);
+ }
+
+ /* Check clz(0). */
+ check_clz32(0, 32);
+ check_clz64(0, 64);
+}
+
/* Returns a random number in the range 'min'...'max' inclusive. */
static uint32_t
random_in_range(uint32_t min, uint32_t max)
ovs_assert(sscanf("0x12-3]xyz", "%[^-a-f]", str));
ovs_assert(!strcmp(str, "0x12"));
}
+
+static void
+test_snprintf(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
+{
+ char s[16];
+
+ ovs_assert(snprintf(s, 4, "abcde") == 5);
+ ovs_assert(!strcmp(s, "abc"));
+
+ ovs_assert(snprintf(s, 5, "abcde") == 5);
+ ovs_assert(!strcmp(s, "abcd"));
+
+ ovs_assert(snprintf(s, 6, "abcde") == 5);
+ ovs_assert(!strcmp(s, "abcde"));
+
+ ovs_assert(snprintf(NULL, 0, "abcde") == 5);
+}
\f
static const struct command commands[] = {
{"ctz", 0, 0, test_ctz},
+ {"clz", 0, 0, test_clz},
{"round_up_pow2", 0, 0, test_round_up_pow2},
{"round_down_pow2", 0, 0, test_round_down_pow2},
{"count_1bits", 0, 0, test_count_1bits},
{"follow-symlinks", 1, INT_MAX, test_follow_symlinks},
{"assert", 0, 0, test_assert},
{"ovs_scan", 0, 0, test_ovs_scan},
+ {"snprintf", 0, 0, test_snprintf},
{NULL, 0, 0, NULL},
};