virBitmapNewData;
virBitmapNewEmpty;
virBitmapNewQuiet;
+virBitmapNewString;
virBitmapNextClearBit;
virBitmapNextSetBit;
virBitmapOverlaps;
#include "c-ctype.h"
#include "count-one-bits.h"
#include "virstring.h"
+#include "virutil.h"
#include "virerror.h"
#define VIR_FROM_THIS VIR_FROM_NONE
return ret;
}
+
+/**
+ * virBitmapNewString:
+ * @string: the string to be converted to a bitmap
+ *
+ * Allocate a bitmap from a string of hexadecimal data.
+ *
+ * Returns a pointer to the allocated bitmap or NULL if
+ * memory cannot be allocated.
+ */
+virBitmapPtr
+virBitmapNewString(const char *string)
+{
+ virBitmapPtr bitmap;
+ size_t i = 0;
+ size_t len = strlen(string);
+
+ if (strspn(string, "0123456789abcdefABCDEF") != len) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("Invalid hexadecimal string '%s'"), string);
+ return NULL;
+ }
+
+ bitmap = virBitmapNew(len * 4);
+ if (!bitmap)
+ return NULL;
+
+ for (i = 0; i < len; i++) {
+ unsigned long nibble = virHexToBin(string[len - i - 1]);
+ nibble <<= VIR_BITMAP_BIT_OFFSET(i * 4);
+ bitmap->map[VIR_BITMAP_UNIT_OFFSET(i * 4)] |= nibble;
+ }
+
+ return bitmap;
+}
+
+
/**
* virBitmapDataFormat:
* @data: the data
int virBitmapGetBit(virBitmapPtr bitmap, size_t b, bool *result)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;
+virBitmapPtr
+virBitmapNewString(const char *string)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
+
char *virBitmapToString(virBitmapPtr bitmap, bool prefix, bool trim)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
return ret;
}
+
+/* virBitmap(New/To)String */
+static int
+test13(const void *opaque ATTRIBUTE_UNUSED)
+{
+ virBitmapPtr map = NULL;
+ const char *strings[] = { "1234feebee", "000c0fefe" };
+ char *str = NULL;
+ size_t i = 0;
+ int ret = -1;
+
+ for (i = 0; i < ARRAY_CARDINALITY(strings); i++) {
+ map = virBitmapNewString(strings[i]);
+ str = virBitmapToString(map, false, true);
+
+ if (!map || !str)
+ goto cleanup;
+
+ if (STRNEQ(strings[i], str)) {
+ fprintf(stderr, "\n expected bitmap string '%s' actual string "
+ "'%s'\n", strings[i], str);
+ goto cleanup;
+ }
+
+ VIR_FREE(str);
+ virBitmapFree(map);
+ map = NULL;
+ }
+
+ ret = 0;
+ cleanup:
+ VIR_FREE(str);
+ virBitmapFree(map);
+ return ret;
+}
+
#undef TEST_MAP
if (virTestRun("test12", test12, NULL) < 0)
ret = -1;
+ if (virTestRun("test13", test13, NULL) < 0)
+ ret = -1;
return ret;
}