[libvirt] [PATCH v2 05/15] util: Introduce virReadBufInt16LE and virReadBufInt16BE

John Ferlan jferlan at redhat.com
Thu Jun 23 17:29:01 UTC 2016


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 at 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




More information about the libvir-list mailing list