func()

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
}