util: Introduce virReadBufInt16LE and virReadBufInt16BE

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@redhat.com>
This commit is contained in:
John Ferlan 2016-06-21 12:57:30 -04:00
parent 8be83eef60
commit cc1c7af2b3
2 changed files with 42 additions and 0 deletions

View File

@ -90,4 +90,28 @@
((uint32_t)(uint8_t)((buf)[2]) << 16) | \ ((uint32_t)(uint8_t)((buf)[2]) << 16) | \
((uint32_t)(uint8_t)((buf)[3]) << 24)) ((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__ */ #endif /* __VIR_ENDIAN_H__ */

View File

@ -50,6 +50,15 @@ test1(const void *data ATTRIBUTE_UNUSED)
if (virReadBufInt32LE(array + 9) != 0x8d8c8b8aU) if (virReadBufInt32LE(array + 9) != 0x8d8c8b8aU)
goto cleanup; 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; ret = 0;
cleanup: cleanup:
return ret; return ret;
@ -81,6 +90,15 @@ test2(const void *data ATTRIBUTE_UNUSED)
if (virReadBufInt32LE(array + 9) != 0x8d8c8b8aU) if (virReadBufInt32LE(array + 9) != 0x8d8c8b8aU)
goto cleanup; 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; ret = 0;
cleanup: cleanup:
return ret; return ret;