43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
# File 'ext/hyperll/varint.c', line 43
static VALUE rb_varint_read_unsigned_var_int(VALUE klass, VALUE rbytes) {
int rlen = RARRAY_LEN(rbytes);
int maxlen = (rlen > 5) ? 5 : rlen;
uint8_t bytes[5];
for (int i = 0; i < maxlen; i++) {
bytes[i] = (uint8_t)NUM2INT(rb_ary_entry(rbytes, i));
}
int len = 0;
uint32_t value = varint_read_unsigned(bytes, maxlen, &len);
if (len == -1) {
rb_raise(rb_eRuntimeError, "Variable length quantity is too long");
return Qnil;
}
// Discard elements that were used to retrieve the value
for (int i = 0; i < len; i++) {
rb_ary_shift(rbytes);
}
return ULONG2NUM(value);
}
|