| #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; | 
 | } |