source src/varint.c
Line | Flow | Count | Block(s) | Source |
---|---|---|---|---|
1 | - | /* | ||
2 | - | * Copyright (C) the libgit2 contributors. All rights reserved. | ||
3 | - | * | ||
4 | - | * This file is part of libgit2, distributed under the GNU GPL v2 with | ||
5 | - | * a Linking Exception. For full terms see the included COPYING file. | ||
6 | - | */ | ||
7 | - | |||
8 | - | #include "varint.h" | ||
9 | - | |||
10 | 21 | 2 | uintmax_t git_decode_varint(const unsigned char *bufp, size_t *varint_len) | |
11 | - | { | ||
12 | 21 | 2 | const unsigned char *buf = bufp; | |
13 | 21 | 2 | unsigned char c = *buf++; | |
14 | 21 | 2 | uintmax_t val = c & 127; | |
15 | 37 | 2,7 | while (c & 128) { | |
16 | 17 | 3 | val += 1; | |
17 | 17 | 3,4 | if (!val || MSB(val, 7)) { | |
18 | - | /* This is not a valid varint_len, so it signals | ||
19 | - | the error */ | ||
20 | 1 | 5 | *varint_len = 0; | |
21 | 1 | 5 | return 0; /* overflow */ | |
22 | - | } | ||
23 | 16 | 6 | c = *buf++; | |
24 | 16 | 6 | val = (val << 7) + (c & 127); | |
25 | - | } | ||
26 | 20 | 8 | *varint_len = buf - bufp; | |
27 | 20 | 8 | return val; | |
28 | - | } | ||
29 | - | |||
30 | 1329 | 2 | int git_encode_varint(unsigned char *buf, size_t bufsize, uintmax_t value) | |
31 | - | { | ||
32 | - | unsigned char varint[16]; | ||
33 | 1329 | 2 | unsigned pos = sizeof(varint) - 1; | |
34 | 1329 | 2 | varint[pos] = value & 127; | |
35 | 1344 | 2,4 | while (value >>= 7) | |
36 | 15 | 3 | varint[--pos] = 128 | (--value & 127); | |
37 | 1329 | 5 | if (buf) { | |
38 | 667 | 6 | if (bufsize < (sizeof(varint) - pos)) | |
39 | 1 | 7 | return -1; | |
40 | 666 | 8 | memcpy(buf, varint + pos, sizeof(varint) - pos); | |
41 | - | } | ||
42 | 1328 | 9 | return sizeof(varint) - pos; | |
43 | - | } |