]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
Add uleb encoding/decoding functions
authorOrit Wasserman <owasserm@redhat.com>
Mon, 6 Aug 2012 18:42:51 +0000 (21:42 +0300)
committerJuan Quintela <quintela@redhat.com>
Wed, 8 Aug 2012 11:51:12 +0000 (13:51 +0200)
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>
cutils.c
qemu-common.h

index 35e2e2bf44889e564d445a4d39810d6f96d7f141..ee4614d3786a604a1a287d8e9f6ad462023d43c8 100644 (file)
--- a/cutils.c
+++ b/cutils.c
@@ -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;
+    }
+}
index ff7026e377806efbde1999a08670754d57204a59..9c1b95551bb9f7651d301ed0cda66ea81b6cd60e 100644 (file)
@@ -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