aboutsummaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@redhat.com>2017-05-18 10:16:38 +0100
committerStefan Hajnoczi <stefanha@redhat.com>2017-05-18 13:36:15 +0100
commit56821559f0ba682fe6b367815572e6f974d329ab (patch)
tree75e93f8fc47707f61c1f6ad5ac45c7609c8da15a /util
parent2ccbd47c1def618b31af1d88b550f6d2bdd15b0f (diff)
parentbe9b23c4a539090da30b482015ee660850e8bb5f (diff)
Merge remote-tracking branch 'dgilbert/tags/pull-hmp-20170517' into staging
HMP pull # gpg: Signature made Wed 17 May 2017 07:03:39 PM BST # gpg: using RSA key 0x0516331EBC5BFDE7 # gpg: Good signature from "Dr. David Alan Gilbert (RH2) <dgilbert@redhat.com>" # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 45F5 C71B 4A0C B7FB 977A 9FA9 0516 331E BC5B FDE7 * dgilbert/tags/pull-hmp-20170517: ramblock: add new hmp command "info ramblock" utils: provide size_to_str() ramblock: add RAMBLOCK_FOREACH() Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'util')
-rw-r--r--util/cutils.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/util/cutils.c b/util/cutils.c
index 50ad179dc5..1534682083 100644
--- a/util/cutils.c
+++ b/util/cutils.c
@@ -619,3 +619,28 @@ const char *qemu_ether_ntoa(const MACAddr *mac)
return ret;
}
+
+/*
+ * Return human readable string for size @val.
+ * @val can be anything that uint64_t allows (no more than "16 EiB").
+ * Use IEC binary units like KiB, MiB, and so forth.
+ * Caller is responsible for passing it to g_free().
+ */
+char *size_to_str(uint64_t val)
+{
+ static const char *suffixes[] = { "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei" };
+ unsigned long div;
+ int i;
+
+ /*
+ * 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.
+ * (see e41b509d68afb1f for more info)
+ */
+ frexp(val / (1000.0 / 1024.0), &i);
+ i = (i - 1) / 10;
+ div = 1ULL << (i * 10);
+
+ return g_strdup_printf("%0.3g %sB", (double)val / div, suffixes[i]);
+}