breader.go 852 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. // Copyright 2014-2022 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. package lzma
  5. import (
  6. "errors"
  7. "io"
  8. )
  9. // breader provides the ReadByte function for a Reader. It doesn't read
  10. // more data from the reader than absolutely necessary.
  11. type breader struct {
  12. io.Reader
  13. // helper slice to save allocations
  14. p []byte
  15. }
  16. // ByteReader converts an io.Reader into an io.ByteReader.
  17. func ByteReader(r io.Reader) io.ByteReader {
  18. br, ok := r.(io.ByteReader)
  19. if !ok {
  20. return &breader{r, make([]byte, 1)}
  21. }
  22. return br
  23. }
  24. // ReadByte read byte function.
  25. func (r *breader) ReadByte() (c byte, err error) {
  26. n, err := r.Reader.Read(r.p)
  27. if n < 1 {
  28. if err == nil {
  29. err = errors.New("breader.ReadByte: no data")
  30. }
  31. return 0, err
  32. }
  33. return r.p[0], nil
  34. }