varint: make it available outside the context of pack

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Apr 3, 2012 at 15:53 UTC d2c1898571a6a2324593e92163e8754880e0c1fb
3 files changed +40
Makefile
+2
@@ -627,6 +627,7 @@ LIB_H += tree-walk.h
627 LIB_H += unpack-trees.h
628 LIB_H += userdiff.h
629 LIB_H += utf8.h
630 +LIB_H += varint.h
631 LIB_H += xdiff-interface.h
632 LIB_H += xdiff/xdiff.h
633
@@ -752,6 +753,7 @@ LIB_OBJS += url.o
753 LIB_OBJS += usage.o
754 LIB_OBJS += userdiff.o
755 LIB_OBJS += utf8.o
756 +LIB_OBJS += varint.o
757 LIB_OBJS += walker.o
758 LIB_OBJS += wrapper.o
759 LIB_OBJS += write_or_die.o
varint.c new
+29
@@ -0,0 +1,29 @@
1 +#include "varint.h"
2 +
3 +uintmax_t decode_varint(const unsigned char **bufp)
4 +{
5 + const unsigned char *buf = *bufp;
6 + unsigned char c = *buf++;
7 + uintmax_t val = c & 127;
8 + while (c & 128) {
9 + val += 1;
10 + if (!val || MSB(val, 7))
11 + return 0; /* overflow */
12 + c = *buf++;
13 + val = (val << 7) + (c & 127);
14 + }
15 + *bufp = buf;
16 + return val;
17 +}
18 +
19 +int encode_varint(uintmax_t value, unsigned char *buf)
20 +{
21 + unsigned char varint[16];
22 + unsigned pos = sizeof(varint) - 1;
23 + varint[pos] = value & 127;
24 + while (value >>= 7)
25 + varint[--pos] = 128 | (--value & 127);
26 + if (buf)
27 + memcpy(buf, varint + pos, sizeof(varint) - pos);
28 + return sizeof(varint) - pos;
29 +}
varint.h new
+9
@@ -0,0 +1,9 @@
1 +#ifndef VARINT_H
2 +#define VARINT_H
3 +
4 +#include "git-compat-util.h"
5 +
6 +extern int encode_varint(uintmax_t, unsigned char *);
7 +extern uintmax_t decode_varint(const unsigned char **);
8 +
9 +#endif /* VARINT_H */