1
// Copyright 2019+ Klaus Post. All rights reserved.
2
// License information can be found in the LICENSE file.
3
// Based on work by Yann Collet, released under BSD License.
13
type byteBuffer interface {
14
// Read up to 8 bytes.
15
// Returns io.ErrUnexpectedEOF if this cannot be satisfied.
16
readSmall(n int) ([]byte, error)
19
// MAY use the destination slice.
20
readBig(n int, dst []byte) ([]byte, error)
22
// Read a single byte.
23
readByte() (byte, error)
32
func (b *byteBuf) readSmall(n int) ([]byte, error) {
33
if debugAsserts && n > 8 {
34
panic(fmt.Errorf("small read > 8 (%d). use readBig", n))
38
return nil, io.ErrUnexpectedEOF
45
func (b *byteBuf) readBig(n int, dst []byte) ([]byte, error) {
48
return nil, io.ErrUnexpectedEOF
55
func (b *byteBuf) remain() []byte {
59
func (b *byteBuf) readByte() (byte, error) {
69
func (b *byteBuf) skipN(n int) error {
72
return io.ErrUnexpectedEOF
78
// wrapper around a reader.
79
type readerWrapper struct {
84
func (r *readerWrapper) readSmall(n int) ([]byte, error) {
85
if debugAsserts && n > 8 {
86
panic(fmt.Errorf("small read > 8 (%d). use readBig", n))
88
n2, err := io.ReadFull(r.r, r.tmp[:n])
89
// We only really care about the actual bytes read.
92
return nil, io.ErrUnexpectedEOF
95
println("readSmall: got", n2, "want", n, "err", err)
102
func (r *readerWrapper) readBig(n int, dst []byte) ([]byte, error) {
104
dst = make([]byte, n)
106
n2, err := io.ReadFull(r.r, dst[:n])
107
if err == io.EOF && n > 0 {
108
err = io.ErrUnexpectedEOF
113
func (r *readerWrapper) readByte() (byte, error) {
114
n2, err := r.r.Read(r.tmp[:1])
117
err = io.ErrUnexpectedEOF
122
return 0, io.ErrUnexpectedEOF
127
func (r *readerWrapper) skipN(n int) error {
128
n2, err := io.CopyN(ioutil.Discard, r.r, int64(n))
130
err = io.ErrUnexpectedEOF