diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 797a6709f5..66917ca70a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -16,6 +16,7 @@ virBitmapClearBit; virBitmapFree; virBitmapGetBit; virBitmapSetBit; +virBitmapString; # buf.h diff --git a/src/util/bitmap.c b/src/util/bitmap.c index 978ec9b649..2edb2dba97 100644 --- a/src/util/bitmap.c +++ b/src/util/bitmap.c @@ -32,6 +32,7 @@ #include "bitmap.h" #include "memory.h" +#include "buf.h" struct _virBitmap { @@ -147,3 +148,35 @@ int virBitmapGetBit(virBitmapPtr bitmap, size_t b, bool *result) *result = !!(bitmap->map[VIR_BITMAP_UNIT_OFFSET(b)] & VIR_BITMAP_BIT(b)); return 0; } + +/** + * virBitmapString: + * @bitmap: Pointer to bitmap + * + * Convert @bitmap to printable string. + * + * Returns pointer to the string or NULL on error. + */ +char *virBitmapString(virBitmapPtr bitmap) +{ + virBuffer buf = VIR_BUFFER_INITIALIZER; + size_t sz; + + virBufferAddLit(&buf, "0x"); + + sz = (bitmap->size + VIR_BITMAP_BITS_PER_UNIT - 1) / + VIR_BITMAP_BITS_PER_UNIT; + + while (sz--) { + virBufferVSprintf(&buf, "%0*lx", + VIR_BITMAP_BITS_PER_UNIT / 4, + bitmap->map[sz]); + } + + if (virBufferError(&buf)) { + virBufferFreeAndReset(&buf); + return NULL; + } + + return virBufferContentAndReset(&buf); +} diff --git a/src/util/bitmap.h b/src/util/bitmap.h index 08515d10ae..db297b6dd0 100644 --- a/src/util/bitmap.h +++ b/src/util/bitmap.h @@ -60,4 +60,7 @@ int virBitmapClearBit(virBitmapPtr bitmap, size_t b) int virBitmapGetBit(virBitmapPtr bitmap, size_t b, bool *result) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK; +char *virBitmapString(virBitmapPtr bitmap) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; + #endif