]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: Don't output too many zeros from virBitmapToString
authorMartin Kletzander <mkletzan@redhat.com>
Wed, 23 Aug 2017 07:09:17 +0000 (09:09 +0200)
committerMartin Kletzander <mkletzan@redhat.com>
Sat, 18 Nov 2017 09:45:10 +0000 (10:45 +0100)
Truncate the output so that it is only as big as is needed to fit all
the bits, not all the units from the map.  This will be needed in the
future in order to properly format bitmaps for kernel's sysfs files.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/qemu/qemu_capabilities.c
src/util/virbitmap.c
src/util/virbitmap.h

index e318eac557557aa2ab1d4661c67eeb8f8fd681e1..554c8dffeeaa96864195a4d22335c24ea5cbb88a 100644 (file)
@@ -1510,7 +1510,7 @@ int virQEMUCapsParseHelpStr(const char *qemu,
                                    qemuCaps, check_yajl) < 0)
         goto cleanup;
 
-    strflags = virBitmapToString(qemuCaps->flags, true);
+    strflags = virBitmapToString(qemuCaps->flags, true, false);
     VIR_DEBUG("Version %u.%u.%u, cooked version %u, flags %s",
               major, minor, micro, *version, NULLSTR(strflags));
     VIR_FREE(strflags);
@@ -2377,7 +2377,7 @@ virQEMUCapsClear(virQEMUCapsPtr qemuCaps,
 
 char *virQEMUCapsFlagsString(virQEMUCapsPtr qemuCaps)
 {
-    return virBitmapToString(qemuCaps->flags, true);
+    return virBitmapToString(qemuCaps->flags, true, false);
 }
 
 
index f5700a6424b436895d639ce99055e7178f2d8d4e..b1c1236fd3ac98126cc1bad32911f34b3629cf0e 100644 (file)
@@ -313,6 +313,7 @@ int virBitmapGetBit(virBitmapPtr bitmap, size_t b, bool *result)
  * virBitmapToString:
  * @bitmap: Pointer to bitmap
  * @prefix: Whether to prepend "0x"
+ * @trim: Whether to output only the minimum required characters
  *
  * Convert @bitmap to printable string.
  *
@@ -320,10 +321,14 @@ int virBitmapGetBit(virBitmapPtr bitmap, size_t b, bool *result)
  */
 char *
 virBitmapToString(virBitmapPtr bitmap,
-                  bool prefix)
+                  bool prefix,
+                  bool trim)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     size_t sz;
+    size_t len;
+    size_t diff;
+    char *ret = NULL;
 
     if (prefix)
         virBufferAddLit(&buf, "0x");
@@ -337,7 +342,28 @@ virBitmapToString(virBitmapPtr bitmap,
     }
 
     virBufferCheckError(&buf);
-    return virBufferContentAndReset(&buf);
+    ret = virBufferContentAndReset(&buf);
+    if (!ret)
+        return NULL;
+
+    if (!trim)
+        return ret;
+
+    if (bitmap->max_bit != bitmap->map_len * VIR_BITMAP_BITS_PER_UNIT) {
+        char *tmp = ret;
+
+        if (prefix)
+            tmp += 2;
+
+        len = strlen(tmp);
+        sz = VIR_DIV_UP(bitmap->max_bit, 4);
+        diff = len - sz;
+
+        if (diff)
+            memmove(tmp, tmp + diff, sz + 1);
+    }
+
+    return ret;
 }
 
 /**
index 720b389cfe52515ecaf1d690e4fe4d4430c1d73c..02acb7519d370235ebbf819da37b50365486f825 100644 (file)
@@ -80,7 +80,7 @@ bool virBitmapIsBitSet(virBitmapPtr bitmap, size_t b)
 int virBitmapGetBit(virBitmapPtr bitmap, size_t b, bool *result)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;
 
-char *virBitmapToString(virBitmapPtr bitmap, bool prefix)
+char *virBitmapToString(virBitmapPtr bitmap, bool prefix, bool trim)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
 
 char *virBitmapFormat(virBitmapPtr bitmap);