1// Copyright 2014-2017 Ulrich Kunitz. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package lzma 6 7import ( 8 "errors" 9 "io" 10) 11 12// breader provides the ReadByte function for a Reader. It doesn't read 13// more data from the reader than absolutely necessary. 14type breader struct { 15 io.Reader 16 // helper slice to save allocations 17 p []byte 18} 19 20// ByteReader converts an io.Reader into an io.ByteReader. 21func ByteReader(r io.Reader) io.ByteReader { 22 br, ok := r.(io.ByteReader) 23 if !ok { 24 return &breader{r, make([]byte, 1)} 25 } 26 return br 27} 28 29// ReadByte read byte function. 30func (r *breader) ReadByte() (c byte, err error) { 31 n, err := r.Reader.Read(r.p) 32 if n < 1 { 33 if err == nil { 34 err = errors.New("breader.ReadByte: no data") 35 } 36 return 0, err 37 } 38 return r.p[0], nil 39} 40