From 17da1dd142c26d680ec24f699d98b2f456d51cd5 Mon Sep 17 00:00:00 2001 From: powturbo Date: Thu, 28 May 2015 17:11:34 +0200 Subject: [PATCH] . --- ext/MaskedVByte/src/varintencode.c | 94 ++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 ext/MaskedVByte/src/varintencode.c diff --git a/ext/MaskedVByte/src/varintencode.c b/ext/MaskedVByte/src/varintencode.c new file mode 100644 index 0000000..dc86969 --- /dev/null +++ b/ext/MaskedVByte/src/varintencode.c @@ -0,0 +1,94 @@ +#include "../include/varintencode.h" + + +size_t vbyte_encode_delta(uint32_t *in, size_t length, uint8_t *bout, uint32_t prev) { + uint8_t *initbout = bout; size_t k; + for (k = 0; k < length; ++k) { + const uint32_t val = in[k] - prev; + prev = in[k]; + if (val < (1U << 7)) { + *bout = val & 0x7F; + ++bout; + } else if (val < (1U << 14)) { + *bout = (uint8_t)((val & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(val >> 7); + ++bout; + } else if (val < (1U << 21)) { + *bout = (uint8_t)((val & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(((val >> 7) & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(val >> 14); + ++bout; + } else if (val < (1U << 28)) { + *bout = (uint8_t)((val & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(((val >> 7) & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(((val >> 14) & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(val >> 21); + ++bout; + } else { + *bout = (uint8_t)((val & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(((val >> 7) & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(((val >> 14) & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(((val >> 21) & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(val >> 28); + ++bout; + } + } + return bout - initbout; +} + +size_t vbyte_encode(uint32_t *in, size_t length, uint8_t *bout) { + uint8_t *initbout = bout; size_t k; + for (k = 0; k < length; ++k) { + const uint32_t val = in[k]; + + if (val < (1U << 7)) { + *bout = val & 0x7F; + ++bout; + } else if (val < (1U << 14)) { + *bout = (uint8_t)((val & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(val >> 7); + ++bout; + } else if (val < (1U << 21)) { + *bout = (uint8_t)((val & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(((val >> 7) & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(val >> 14); + ++bout; + } else if (val < (1U << 28)) { + *bout = (uint8_t)((val & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(((val >> 7) & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(((val >> 14) & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(val >> 21); + ++bout; + } else { + *bout = (uint8_t)((val & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(((val >> 7) & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(((val >> 14) & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(((val >> 21) & 0x7F) | (1U << 7)); + ++bout; + *bout = (uint8_t)(val >> 28); + ++bout; + } + } + return bout - initbout; +} + +