diff options
author | Orit Wasserman <owasserm@redhat.com> | 2012-08-06 21:42:51 +0300 |
---|---|---|
committer | Juan Quintela <quintela@redhat.com> | 2012-08-08 13:51:12 +0200 |
commit | e6546bb938f5326269b6669d6cbb44d72458caa4 (patch) | |
tree | 814808b641a518d7ed721705cc28a99b99ba9ca8 | |
parent | 9fb26641ab497eda9138f9af75cbeb02ed59b5ae (diff) |
Add uleb encoding/decoding functions
Implement Unsigned Little Endian Base 128.
Signed-off-by: Orit Wasserman <owasserm@redhat.com>
Reviewed-by: Luiz Capitulino <lcapitulino@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
-rw-r--r-- | cutils.c | 33 | ||||
-rw-r--r-- | qemu-common.h | 8 |
2 files changed, 41 insertions, 0 deletions
@@ -391,3 +391,36 @@ int64_t pow2floor(int64_t value) } return value; } + +/* + * Implementation of ULEB128 (http://en.wikipedia.org/wiki/LEB128) + * Input is limited to 14-bit numbers + */ +int uleb128_encode_small(uint8_t *out, uint32_t n) +{ + g_assert(n <= 0x3fff); + if (n < 0x80) { + *out++ = n; + return 1; + } else { + *out++ = (n & 0x7f) | 0x80; + *out++ = n >> 7; + return 2; + } +} + +int uleb128_decode_small(const uint8_t *in, uint32_t *n) +{ + if (!(*in & 0x80)) { + *n = *in++; + return 1; + } else { + *n = *in++ & 0x7f; + /* we exceed 14 bit number */ + if (*in & 0x80) { + return -1; + } + *n |= *in++ << 7; + return 2; + } +} diff --git a/qemu-common.h b/qemu-common.h index ff7026e377..9c1b95551b 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -443,4 +443,12 @@ int64_t pow2floor(int64_t value); #include "module.h" +/* + * Implementation of ULEB128 (http://en.wikipedia.org/wiki/LEB128) + * Input is limited to 14-bit numbers + */ + +int uleb128_encode_small(uint8_t *out, uint32_t n); +int uleb128_decode_small(const uint8_t *in, uint32_t *n); + #endif |