95 lines
2.4 KiB
C
95 lines
2.4 KiB
C
#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;
|
|
}
|
|
|
|
|