| 185 | // --- Varint encoding --- |
| 186 | |
| 187 | static int put_varint(uint8_t *buf, int64_t value) { |
| 188 | uint64_t v = (uint64_t)value; |
| 189 | if (v <= VARINT_MASK) { |
| 190 | buf[0] = (uint8_t)v; |
| 191 | return SERIAL_SIZE_INT8; |
| 192 | } |
| 193 | // Encode in big-endian with MSB continuation bits |
| 194 | uint8_t tmp[VARINT_BUF_SIZE]; |
| 195 | int n = 0; |
| 196 | while (v > VARINT_MASK) { |
| 197 | tmp[n++] = (uint8_t)(v & VARINT_MASK); |
| 198 | v >>= VARINT_SHIFT; |
| 199 | } |
| 200 | tmp[n++] = (uint8_t)v; |
| 201 | // Reverse into output with continuation bits |
| 202 | for (int i = 0; i < n; i++) { |
| 203 | buf[i] = tmp[n - SKIP_ONE - i]; |
| 204 | if (i < n - SKIP_ONE) { |
| 205 | buf[i] |= VARINT_CONTINUE; |
| 206 | } |
| 207 | } |
| 208 | return n; |
| 209 | } |
| 210 | |
| 211 | static int varint_len(int64_t value) { |
| 212 | uint64_t v = (uint64_t)value; |
no outgoing calls
no test coverage detected