#include "git-compat-util.h" | |
#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; | |
} |