diff options
author | Junio C Hamano <gitster@pobox.com> | 2012-04-03 15:53:08 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-04-03 16:24:44 -0700 |
commit | d2c1898571a6a2324593e92163e8754880e0c1fb (patch) | |
tree | cef92f7dfe20953916ae3e965bf5cae26b9c51dd | |
parent | e5056c05ecd2bdaceaa95e12e9e94b1584ec59c8 (diff) | |
download | git-d2c1898571a6a2324593e92163e8754880e0c1fb.tar.gz |
varint: make it available outside the context of pack
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | varint.c | 29 | ||||
-rw-r--r-- | varint.h | 9 |
3 files changed, 40 insertions, 0 deletions
@@ -627,6 +627,7 @@ LIB_H += tree-walk.h LIB_H += unpack-trees.h LIB_H += userdiff.h LIB_H += utf8.h +LIB_H += varint.h LIB_H += xdiff-interface.h LIB_H += xdiff/xdiff.h @@ -752,6 +753,7 @@ LIB_OBJS += url.o LIB_OBJS += usage.o LIB_OBJS += userdiff.o LIB_OBJS += utf8.o +LIB_OBJS += varint.o LIB_OBJS += walker.o LIB_OBJS += wrapper.o LIB_OBJS += write_or_die.o diff --git a/varint.c b/varint.c new file mode 100644 index 0000000000..4ed7729496 --- /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; +} diff --git a/varint.h b/varint.h new file mode 100644 index 0000000000..0321195796 --- /dev/null +++ b/varint.h @@ -0,0 +1,9 @@ +#ifndef VARINT_H +#define VARINT_H + +#include "git-compat-util.h" + +extern int encode_varint(uintmax_t, unsigned char *); +extern uintmax_t decode_varint(const unsigned char **); + +#endif /* VARINT_H */ |