Instead inlining code for formatting sized integers, call out to the new qemu_szutostr function.
Signed-off-by: Daniel P. Berrange <berra...@redhat.com> --- qapi/string-output-visitor.c | 20 +++++--------------- tests/test-string-output-visitor.c | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/qapi/string-output-visitor.c b/qapi/string-output-visitor.c index 94ac821..dfb15b5 100644 --- a/qapi/string-output-visitor.c +++ b/qapi/string-output-visitor.c @@ -15,6 +15,7 @@ #include "qapi/string-output-visitor.h" #include "qapi/visitor-impl.h" #include "qemu/host-utils.h" +#include "qemu/cutils.h" #include <math.h> #include "qemu/range.h" @@ -211,10 +212,8 @@ static void print_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp) { StringOutputVisitor *sov = to_sov(v); - static const char suffixes[] = { 'B', 'K', 'M', 'G', 'T', 'P', 'E' }; - uint64_t div, val; + char *szval; char *out; - int i; if (!sov->human) { out = g_strdup_printf("%"PRIu64, *obj); @@ -222,20 +221,11 @@ static void print_type_size(Visitor *v, const char *name, uint64_t *obj, return; } - val = *obj; + szval = qemu_szutostr_full(*obj, '\0', true, " "); - /* The exponent (returned in i) minus one gives us - * floor(log2(val * 1024 / 1000). The correction makes us - * switch to the higher power when the integer part is >= 1000. - */ - frexp(val / (1000.0 / 1024.0), &i); - i = (i - 1) / 10; - assert(i < ARRAY_SIZE(suffixes)); - div = 1ULL << (i * 10); - - out = g_strdup_printf("%"PRIu64" (%0.3g %c%s)", val, - (double)val/div, suffixes[i], i ? "iB" : ""); + out = g_strdup_printf("%"PRIu64" (%s)", *obj, szval); string_output_set(sov, out); + g_free(szval); } static void print_type_bool(Visitor *v, const char *name, bool *obj, diff --git a/tests/test-string-output-visitor.c b/tests/test-string-output-visitor.c index 444844a..dd6e00f 100644 --- a/tests/test-string-output-visitor.c +++ b/tests/test-string-output-visitor.c @@ -87,6 +87,24 @@ static void test_visitor_out_int(TestOutputVisitorData *data, } } +static void test_visitor_out_size(TestOutputVisitorData *data, + const void *unused) +{ + uint64_t value = 1729; + Error *err = NULL; + char *str; + + visit_type_size(data->ov, NULL, &value, &err); + g_assert(!err); + + str = visitor_get(data); + if (data->human) { + g_assert_cmpstr(str, ==, "1729 (1.69 KiB)"); + } else { + g_assert_cmpstr(str, ==, "1729"); + } +} + static void test_visitor_out_intList(TestOutputVisitorData *data, const void *unused) { @@ -240,6 +258,10 @@ int main(int argc, char **argv) &out_visitor_data, test_visitor_out_int, false); output_visitor_test_add("/string-visitor/output/int-human", &out_visitor_data, test_visitor_out_int, true); + output_visitor_test_add("/string-visitor/output/size", + &out_visitor_data, test_visitor_out_size, false); + output_visitor_test_add("/string-visitor/output/size-human", + &out_visitor_data, test_visitor_out_size, true); output_visitor_test_add("/string-visitor/output/bool", &out_visitor_data, test_visitor_out_bool, false); output_visitor_test_add("/string-visitor/output/bool-human", -- 2.7.4