From d2c1898571a6a2324593e92163e8754880e0c1fb Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 3 Apr 2012 15:53:08 -0700 Subject: varint: make it available outside the context of pack Signed-off-by: Junio C Hamano --- varint.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 varint.c (limited to 'varint.c') diff --git a/varint.c b/varint.c new file mode 100644 index 000000000..4ed772949 --- /dev/null +++ b/varint.c @@ -0,0 +1,29 @@ +#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; +} -- cgit v1.2.1