git
/
varint.c
30 строк · 660.0 Байт
1#include "git-compat-util.h"2#include "varint.h"3
4uintmax_t decode_varint(const unsigned char **bufp)5{
6const unsigned char *buf = *bufp;7unsigned char c = *buf++;8uintmax_t val = c & 127;9while (c & 128) {10val += 1;11if (!val || MSB(val, 7))12return 0; /* overflow */13c = *buf++;14val = (val << 7) + (c & 127);15}16*bufp = buf;17return val;18}
19
20int encode_varint(uintmax_t value, unsigned char *buf)21{
22unsigned char varint[16];23unsigned pos = sizeof(varint) - 1;24varint[pos] = value & 127;25while (value >>= 7)26varint[--pos] = 128 | (--value & 127);27if (buf)28memcpy(buf, varint + pos, sizeof(varint) - pos);29return sizeof(varint) - pos;30}
31