diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index e318eac557..554c8dffee 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -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); } diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c index f5700a6424..b1c1236fd3 100644 --- a/src/util/virbitmap.c +++ b/src/util/virbitmap.c @@ -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; } /** diff --git a/src/util/virbitmap.h b/src/util/virbitmap.h index 720b389cfe..02acb7519d 100644 --- a/src/util/virbitmap.h +++ b/src/util/virbitmap.h @@ -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);