Previously bytes were ordered from MSB to LSB, but the right order is the
reverse.
value -= thresh;
- for (n = 10; n > 1; n--) {
- if (value >> (7 * (n - 1))) {
- break;
+ if (p == NULL) {
+ for (n = 2; value >= 128; n++) {
+ value >>= 7;
}
- }
- if (p == NULL) {
- return n + 1;
+ return n;
}
*p++ |= thresh;
- for ( /* void */ ; n > 1; n--) {
- *p++ = 0x80 | (value >> 7 * (n - 1));
+ while (value >= 128) {
+ *p++ = 0x80 | value;
+ value >>= 7;
}
- *p++ = value & 0x7f;
+ *p++ = value;
return (uintptr_t) p;
}
ngx_http_v3_parse_prefix_int(ngx_connection_t *c,
ngx_http_v3_parse_prefix_int_t *st, ngx_uint_t prefix, u_char ch)
{
+ ngx_uint_t mask;
enum {
sw_start = 0,
sw_value
case sw_start:
- st->mask = (1 << prefix) - 1;
- st->value = (ch & st->mask);
+ mask = (1 << prefix) - 1;
+ st->value = ch & mask;
- if (st->value != st->mask) {
+ if (st->value != mask) {
goto done;
}
- st->value = 0;
+ st->shift = 0;
st->state = sw_value;
break;
case sw_value:
- st->value = (st->value << 7) + (ch & 0x7f);
+ st->value += (ch & 0x7f) << st->shift;
if (ch & 0x80) {
+ st->shift += 7;
break;
}
- st->value += st->mask;
goto done;
}
typedef struct {
ngx_uint_t state;
- ngx_uint_t mask;
+ ngx_uint_t shift;
uint64_t value;
} ngx_http_v3_parse_prefix_int_t;