In order to read 16 bits of data in the native format and convert add
the 16 bit macros to match existing 32 and 64 bit code.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/util/virendian.h | 24 ++++++++++++++++++++++++
tests/virendiantest.c | 18 ++++++++++++++++++
2 files changed, 42 insertions(+)
diff --git a/src/util/virendian.h b/src/util/virendian.h
index eefe48c..97940bd 100644
--- a/src/util/virendian.h
+++ b/src/util/virendian.h
@@ -90,4 +90,28 @@
((uint32_t)(uint8_t)((buf)[2]) << 16) | \
((uint32_t)(uint8_t)((buf)[3]) << 24))
+/**
+ * virReadBufInt16BE:
+ * @buf: byte to start reading at (can be 'char*' or 'unsigned char*');
+ * evaluating buf must not have any side effects
+ *
+ * Read 2 bytes at BUF as a big-endian 16-bit number. Caller is
+ * responsible to avoid reading beyond array bounds.
+ */
+# define virReadBufInt16BE(buf) \
+ (((uint16_t)(uint8_t)((buf)[0]) << 8) | \
+ (uint16_t)(uint8_t)((buf)[1]))
+
+/**
+ * virReadBufInt16LE:
+ * @buf: byte to start reading at (can be 'char*' or 'unsigned char*');
+ * evaluating buf must not have any side effects
+ *
+ * Read 2 bytes at BUF as a little-endian 16-bit number. Caller is
+ * responsible to avoid reading beyond array bounds.
+ */
+# define virReadBufInt16LE(buf) \
+ ((uint16_t)(uint8_t)((buf)[0]) | \
+ ((uint16_t)(uint8_t)((buf)[1]) << 8))
+
#endif /* __VIR_ENDIAN_H__ */
diff --git a/tests/virendiantest.c b/tests/virendiantest.c
index 4072507..f858e5c 100644
--- a/tests/virendiantest.c
+++ b/tests/virendiantest.c
@@ -50,6 +50,15 @@ test1(const void *data ATTRIBUTE_UNUSED)
if (virReadBufInt32LE(array + 9) != 0x8d8c8b8aU)
goto cleanup;
+ if (virReadBufInt16BE(array) != 0x0102U)
+ goto cleanup;
+ if (virReadBufInt16BE(array + 11) != 0x8c8dU)
+ goto cleanup;
+ if (virReadBufInt16LE(array) != 0x0201U)
+ goto cleanup;
+ if (virReadBufInt16LE(array + 11) != 0x8d8cU)
+ goto cleanup;
+
ret = 0;
cleanup:
return ret;
@@ -81,6 +90,15 @@ test2(const void *data ATTRIBUTE_UNUSED)
if (virReadBufInt32LE(array + 9) != 0x8d8c8b8aU)
goto cleanup;
+ if (virReadBufInt16BE(array) != 0x0102U)
+ goto cleanup;
+ if (virReadBufInt16BE(array + 11) != 0x8c8dU)
+ goto cleanup;
+ if (virReadBufInt16LE(array) != 0x0201U)
+ goto cleanup;
+ if (virReadBufInt16LE(array + 11) != 0x8d8cU)
+ goto cleanup;
+
ret = 0;
cleanup:
return ret;
--
2.5.5