qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Andreas Färber" <afaerber@suse.de>
To: qemu-devel@nongnu.org
Cc: "Michael Roth" <mdroth@linux.vnet.ibm.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Andreas Färber" <afaerber@suse.de>,
	"Luiz Capitulino" <lcapitulino@redhat.com>
Subject: [Qemu-devel] [PULL v2 41/49] qapi: Add human mode to StringOutputVisitor
Date: Mon, 17 Feb 2014 23:24:51 +0100	[thread overview]
Message-ID: <1392675899-21210-42-git-send-email-afaerber@suse.de> (raw)
In-Reply-To: <1392675899-21210-1-git-send-email-afaerber@suse.de>

From: Paolo Bonzini <pbonzini@redhat.com>

This will be used by "info qtree".  For numbers it prints both the
decimal and hex values.  For sizes it rounds to the nearest power
of 2^10.  For strings, it puts quotes around the string and separates
NULL and empty string.

Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
---
 include/qapi/string-output-visitor.h |  2 +-
 include/qom/object.h                 |  3 +-
 qapi/string-output-visitor.c         | 55 ++++++++++++++++++++++++++++++++++--
 qdev-monitor.c                       |  2 +-
 qom/object.c                         |  4 +--
 tests/test-string-output-visitor.c   |  2 +-
 tests/test-visitor-serialization.c   |  2 +-
 7 files changed, 60 insertions(+), 10 deletions(-)

diff --git a/include/qapi/string-output-visitor.h b/include/qapi/string-output-visitor.h
index ec81e42..d99717f 100644
--- a/include/qapi/string-output-visitor.h
+++ b/include/qapi/string-output-visitor.h
@@ -17,7 +17,7 @@
 
 typedef struct StringOutputVisitor StringOutputVisitor;
 
-StringOutputVisitor *string_output_visitor_new(void);
+StringOutputVisitor *string_output_visitor_new(bool human);
 void string_output_visitor_cleanup(StringOutputVisitor *v);
 
 char *string_output_get_string(StringOutputVisitor *v);
diff --git a/include/qom/object.h b/include/qom/object.h
index e0ff212..9c7c361 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -946,12 +946,13 @@ void object_property_parse(Object *obj, const char *string,
  * object_property_print:
  * @obj: the object
  * @name: the name of the property
+ * @human: if true, print for human consumption
  * @errp: returns an error if this function fails
  *
  * Returns a string representation of the value of the property.  The
  * caller shall free the string.
  */
-char *object_property_print(Object *obj, const char *name,
+char *object_property_print(Object *obj, const char *name, bool human,
                             Error **errp);
 
 /**
diff --git a/qapi/string-output-visitor.c b/qapi/string-output-visitor.c
index 921653d..67a8798 100644
--- a/qapi/string-output-visitor.c
+++ b/qapi/string-output-visitor.c
@@ -14,10 +14,12 @@
 #include "qapi/string-output-visitor.h"
 #include "qapi/visitor-impl.h"
 #include "qapi/qmp/qerror.h"
+#include "qemu/host-utils.h"
 
 struct StringOutputVisitor
 {
     Visitor visitor;
+    bool human;
     char *string;
 };
 
@@ -31,7 +33,45 @@ static void print_type_int(Visitor *v, int64_t *obj, const char *name,
                            Error **errp)
 {
     StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v);
-    string_output_set(sov, g_strdup_printf("%lld", (long long) *obj));
+    char *out;
+
+    if (sov->human) {
+        out = g_strdup_printf("%lld (%#llx)", (long long) *obj, (long long) *obj);
+    } else {
+        out = g_strdup_printf("%lld", (long long) *obj);
+    }
+    string_output_set(sov, out);
+}
+
+static void print_type_size(Visitor *v, uint64_t *obj, const char *name,
+                           Error **errp)
+{
+    StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v);
+    static const char suffixes[] = { 'B', 'K', 'M', 'G', 'T' };
+    uint64_t div, val;
+    char *out;
+    int i;
+
+    if (!sov->human) {
+        out = g_strdup_printf("%llu", (long long) *obj);
+        string_output_set(sov, out);
+        return;
+    }
+
+    val = *obj;
+
+    /* Compute floor(log2(val)).  */
+    i = 64 - clz64(val);
+
+    /* Find the power of 1024 that we'll display as the units.  */
+    i /= 10;
+    if (i >= ARRAY_SIZE(suffixes)) {
+        i = ARRAY_SIZE(suffixes) - 1;
+    }
+    div = 1ULL << (i * 10);
+
+    out = g_strdup_printf("%0.03f%c", (double)val/div, suffixes[i]);
+    string_output_set(sov, out);
 }
 
 static void print_type_bool(Visitor *v, bool *obj, const char *name,
@@ -45,7 +85,14 @@ static void print_type_str(Visitor *v, char **obj, const char *name,
                            Error **errp)
 {
     StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v);
-    string_output_set(sov, g_strdup(*obj ? *obj : ""));
+    char *out;
+
+    if (sov->human) {
+        out = *obj ? g_strdup_printf("\"%s\"", *obj) : g_strdup("<null>");
+    } else {
+        out = g_strdup(*obj ? *obj : "");
+    }
+    string_output_set(sov, out);
 }
 
 static void print_type_number(Visitor *v, double *obj, const char *name,
@@ -73,14 +120,16 @@ void string_output_visitor_cleanup(StringOutputVisitor *sov)
     g_free(sov);
 }
 
-StringOutputVisitor *string_output_visitor_new(void)
+StringOutputVisitor *string_output_visitor_new(bool human)
 {
     StringOutputVisitor *v;
 
     v = g_malloc0(sizeof(*v));
 
+    v->human = human;
     v->visitor.type_enum = output_type_enum;
     v->visitor.type_int = print_type_int;
+    v->visitor.type_size = print_type_size;
     v->visitor.type_bool = print_type_bool;
     v->visitor.type_str = print_type_str;
     v->visitor.type_number = print_type_number;
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 4d1634c..f385fb3 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -577,7 +577,7 @@ static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props,
         if (object_property_get_type(OBJECT(dev), legacy_name, NULL)) {
             value = object_property_get_str(OBJECT(dev), legacy_name, &err);
         } else {
-            value = object_property_print(OBJECT(dev), props->name, &err);
+            value = object_property_print(OBJECT(dev), props->name, false, &err);
         }
         g_free(legacy_name);
 
diff --git a/qom/object.c b/qom/object.c
index 62e7e41..660859c 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -948,13 +948,13 @@ void object_property_parse(Object *obj, const char *string,
     string_input_visitor_cleanup(mi);
 }
 
-char *object_property_print(Object *obj, const char *name,
+char *object_property_print(Object *obj, const char *name, bool human,
                             Error **errp)
 {
     StringOutputVisitor *mo;
     char *string;
 
-    mo = string_output_visitor_new();
+    mo = string_output_visitor_new(human);
     object_property_get(obj, string_output_get_visitor(mo), name, errp);
     string = string_output_get_string(mo);
     string_output_visitor_cleanup(mo);
diff --git a/tests/test-string-output-visitor.c b/tests/test-string-output-visitor.c
index 79d815f..56cc21d 100644
--- a/tests/test-string-output-visitor.c
+++ b/tests/test-string-output-visitor.c
@@ -26,7 +26,7 @@ typedef struct TestOutputVisitorData {
 static void visitor_output_setup(TestOutputVisitorData *data,
                                  const void *unused)
 {
-    data->sov = string_output_visitor_new();
+    data->sov = string_output_visitor_new(false);
     g_assert(data->sov != NULL);
 
     data->ov = string_output_get_visitor(data->sov);
diff --git a/tests/test-visitor-serialization.c b/tests/test-visitor-serialization.c
index 9aaa587..6bff950 100644
--- a/tests/test-visitor-serialization.c
+++ b/tests/test-visitor-serialization.c
@@ -1083,7 +1083,7 @@ static void string_serialize(void *native_in, void **datap,
 {
     StringSerializeData *d = g_malloc0(sizeof(*d));
 
-    d->sov = string_output_visitor_new();
+    d->sov = string_output_visitor_new(false);
     visit(string_output_get_visitor(d->sov), &native_in, errp);
     *datap = d;
 }
-- 
1.8.4.5

  parent reply	other threads:[~2014-02-17 22:25 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-17 22:24 [Qemu-devel] [PULL v2 00/49] QOM devices patch queue 2014-02-17 Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 01/49] qtest: don't report signals if qtest driver enabled Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 02/49] ppcemb-softmmu: Drop Mac and e500 emulation Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 03/49] target-ppc: Make ppc40x CPUs available in ppcemb Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 04/49] tests: Fix gcov paths for relocated device sources Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 05/49] qom-test: Run for all available machines Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 06/49] qom-test: Test shutdown in addition to startup Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 07/49] tests: Run qom-test for every architecture Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 08/49] nand: Don't use qdev_create() in nand_init() Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 09/49] i2c: Rename i2c_bus to I2CBus Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 10/49] pxa2xx: QOM'ify I2C slave Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 11/49] tosa: QOM'ify DAC Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 12/49] z2: QOM'ify AER915 Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 13/49] wm8750: QOM'ify Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 14/49] ssd0303: QOM'ify Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 15/49] max7310: QOM'ify Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 16/49] lm832x: QOM'ify Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 17/49] ds1338: QOM'ify Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 18/49] twl92230: QOM'ify Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 19/49] i2c: Drop FROM_I2C_SLAVE() macro Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 20/49] tests: Add e1000 qtest Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 21/49] tests: Add vmxnet3 qtest Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 22/49] tests: Add rtl8139 qtest Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 23/49] tests: Add pcnet qtest Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 24/49] tests: Add eepro100 qtest Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 25/49] tests: Add ne2000 qtest Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 26/49] tests: Add virtio-net qtest Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 27/49] tests: Add tpci200 qtest Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 28/49] tests: Add ipoctal232 qtest Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 29/49] ipack: Convert to QOM realize Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 30/49] ipack: QOM parent field cleanup for IPackBus Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 31/49] ipack: QOM parent field cleanup for IPackDevice Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 32/49] ipoctal232: QOM parent field cleanup Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 33/49] ipack: Move IndustryPack out of hw/char/ Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 34/49] qtest: Don't segfault with invalid -qtest option Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 35/49] qapi: Add size parser to StringInputVisitor Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 36/49] qdev: Sizes are now parsed by StringInputVisitor Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 37/49] qdev: Remove legacy parsers for hex8/32/64 Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 38/49] qdev: Legacy properties are now read-only Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 39/49] qdev: Legacy properties are just strings Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 40/49] qdev: Inline qdev_prop_parse() Andreas Färber
2014-02-17 22:24 ` Andreas Färber [this message]
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 42/49] qdev: Use human mode in "info qtree" Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 43/49] qdev: Remove most legacy printers Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 44/49] qdev: Remove hex8/32/64 property types Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 45/49] block: Handle "rechs" and "large" translation options Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 46/49] qdev: Add enum property types to QAPI schema Andreas Färber
2014-02-17 22:30   ` Eric Blake
2014-02-18  8:05     ` Paolo Bonzini
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 47/49] qdev: Use QAPI type names for properties Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 48/49] qapi: Refine human printing of sizes Andreas Färber
2014-02-17 22:24 ` [Qemu-devel] [PULL v2 49/49] qtest: Include system headers before user headers Andreas Färber
2014-02-20 15:02 ` [Qemu-devel] [PULL v2 00/49] QOM devices patch queue 2014-02-17 Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1392675899-21210-42-git-send-email-afaerber@suse.de \
    --to=afaerber@suse.de \
    --cc=lcapitulino@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).