diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/kvm/lib/test_util.c new file mode 100644 index 0000000000000..706e0f963a44b --- /dev/null +++ b/tools/testing/selftests/kvm/lib/test_util.c @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0-only +/*
- tools/testing/selftests/kvm/lib/test_util.c
- Copyright (C) 2020, Google LLC.
- */
+#include "test_util.h"
+#include <ctype.h>
+/*
- Parses "[0-9]+[kmgt]?".
- */
+size_t parse_size(const char *size) +{
- size_t len = strlen(size);
- size_t i;
- size_t scale_shift = 0;
- size_t base;
- TEST_ASSERT(len > 0, "Need at least 1 digit in '%s'", size);
- /* Find the first letter in the string, indicating scale. */
- for (i = 0; i < len; i++) {
if (!isdigit(size[i])) {
TEST_ASSERT(i > 0, "Need at least 1 digit in '%s'",
size);
TEST_ASSERT(i == len - 1,
"Expected letter at the end in '%s'.",
size);
switch (tolower(size[i])) {
case 't':
scale_shift = 40;
break;
case 'g':
scale_shift = 30;
break;
case 'm':
scale_shift = 20;
break;
case 'k':
scale_shift = 10;
break;
default:
TEST_ASSERT(false, "Unknown size letter %c",
size[i]);
}
}
- }
- TEST_ASSERT(scale_shift < 8 * sizeof(size_t),
"Overflow parsing scale!");
- base = atoi(size);
I'd use strtoull(size, NULL, 0), allowing the user to input full 0x... sizes too. And, if the strtoull is done before the scale parsing, then you could supply a non-null endptr and avoid the need for the for loop.
Thanks, drew