#include "varint.h" uintmax_t decode_varint(const unsigned char **bufp) { const unsigned char *buf = *bufp; unsigned char c = *buf++; uintmax_t val = c & 127; while (c & 128) { val += 1; if (!val || MSB(val, 7)) return 0; /* overflow */ c = *buf++; val = (val << 7) + (c & 127); } *bufp = buf; return val; } int encode_varint(uintmax_t value, unsigned char *buf) { unsigned char varint[16]; unsigned pos = sizeof(varint) - 1; varint[pos] = value & 127; while (value >>= 7) varint[--pos] = 128 | (--value & 127); if (buf) memcpy(buf, varint + pos, sizeof(varint) - pos); return sizeof(varint) - pos; }