buf_reader.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package main
  2. import (
  3. "bufio"
  4. "bytes"
  5. "io"
  6. )
  7. type bufReader struct {
  8. r io.Reader
  9. buf *bytes.Buffer
  10. cur int
  11. }
  12. func newBufReader(r io.Reader, buf *bytes.Buffer) *bufReader {
  13. br := bufReader{
  14. r: r,
  15. buf: buf,
  16. }
  17. return &br
  18. }
  19. func (br *bufReader) Read(p []byte) (int, error) {
  20. if err := br.fill(br.cur + len(p)); err != nil {
  21. return 0, err
  22. }
  23. n := copy(p, br.buf.Bytes()[br.cur:])
  24. br.cur += n
  25. return n, nil
  26. }
  27. func (br *bufReader) ReadByte() (byte, error) {
  28. if err := br.fill(br.cur + 1); err != nil {
  29. return 0, err
  30. }
  31. b := br.buf.Bytes()[br.cur]
  32. br.cur++
  33. return b, nil
  34. }
  35. func (br *bufReader) Discard(n int) (int, error) {
  36. if n < 0 {
  37. return 0, bufio.ErrNegativeCount
  38. }
  39. if n == 0 {
  40. return 0, nil
  41. }
  42. if err := br.fill(br.cur + n); err != nil {
  43. return 0, err
  44. }
  45. n = minInt(n, br.buf.Len()-br.cur)
  46. br.cur += n
  47. return n, nil
  48. }
  49. func (br *bufReader) Peek(n int) ([]byte, error) {
  50. if n < 0 {
  51. return []byte{}, bufio.ErrNegativeCount
  52. }
  53. if n == 0 {
  54. return []byte{}, nil
  55. }
  56. if err := br.fill(br.cur + n); err != nil {
  57. return []byte{}, err
  58. }
  59. if n > br.buf.Len()-br.cur {
  60. return br.buf.Bytes()[br.cur:], io.EOF
  61. }
  62. return br.buf.Bytes()[br.cur : br.cur+n], nil
  63. }
  64. func (br *bufReader) Flush() error {
  65. _, err := br.buf.ReadFrom(br.r)
  66. return err
  67. }
  68. func (br *bufReader) fill(need int) error {
  69. n := need - br.buf.Len()
  70. if n <= 0 {
  71. return nil
  72. }
  73. n = maxInt(4096, n)
  74. if _, err := br.buf.ReadFrom(io.LimitReader(br.r, int64(n))); err != nil {
  75. return err
  76. }
  77. // Nothing was read, it's EOF
  78. if br.cur == br.buf.Len() {
  79. return io.EOF
  80. }
  81. return nil
  82. }