in ubjson/parse.go [683:727]
func (p *Parser) stepLen(b []byte, cont state) ([]byte, error) {
if p.marker == noMarker {
p.marker = b[0]
b = b[1:]
if len(b) == 0 {
return nil, nil
}
}
var tmp []byte
complete := false
L := int64(-1)
switch p.marker {
case int8Marker:
complete, L, b = true, int64(int8(b[0])), b[1:]
case uint8Marker:
complete, L, b = true, int64(b[0]), b[1:]
case int16Marker:
if b, tmp = p.collect(b, 2); tmp != nil {
complete, L = true, int64(readInt16(tmp))
}
case int32Marker:
if b, tmp = p.collect(b, 4); tmp != nil {
complete, L = true, int64(readInt32(tmp))
}
case int64Marker:
if b, tmp = p.collect(b, 8); tmp != nil {
complete, L = true, readInt64(tmp)
}
}
if !complete {
return b, nil
}
if L < 0 {
return nil, errNegativeLen
}
p.marker = noMarker
p.state.current = cont
p.pushLen(L)
return b, nil
}