package pool
import (
)
type BufReader struct {
rd io.Reader
buf []byte
r, w int
lastByte int
bytesRead int64
err error
available int
brd BytesReader
}
func ( int) *BufReader {
return &BufReader{
buf: make([]byte, ),
available: -1,
}
}
func ( *BufReader) ( int) *BytesReader {
if == -1 {
= 0
}
:= .buf[.r : .r+]
.r +=
.brd.Reset()
return &.brd
}
func ( *BufReader) ( int) {
.available =
}
func ( *BufReader) () int {
return .available
}
func ( *BufReader) ( int) {
if .available != -1 {
.available +=
}
}
func ( *BufReader) ( io.Reader) {
.rd =
.r, .w = 0, 0
.err = nil
}
func ( *BufReader) () int {
:= .w - .r
if .available == -1 || <= .available {
return
}
return .available
}
func ( *BufReader) () []byte {
if .available == -1 {
return .buf[.r:.w]
}
:= .r + .available
if > .w {
= .w
}
return .buf[.r:]
}
func ( *BufReader) () []byte {
if .available == -1 {
:= .buf[.r:.w]
.r = .w
return
}
:= .r + .available
if > .w {
= .w
}
:= .buf[.r:]
.r =
.changeAvailable(-len())
return
}
func ( *BufReader) () {
if .r > 0 {
copy(.buf, .buf[.r:.w])
.w -= .r
.r = 0
}
if .w >= len(.buf) {
panic("bufio: tried to fill full buffer")
}
if .available == 0 {
.err = io.EOF
return
}
const = 100
for := ; > 0; -- {
, := .read(.buf[.w:])
.w +=
if != nil {
.err =
return
}
if > 0 {
return
}
}
.err = io.ErrNoProgress
}
func ( *BufReader) () error {
:= .err
.err = nil
return
}
func ( *BufReader) ( []byte) ( int, error) {
if len() == 0 {
return 0, .readErr()
}
if .available != -1 {
if .available == 0 {
return 0, io.EOF
}
if len() > .available {
= [:.available]
}
}
if .r == .w {
if .err != nil {
return 0, .readErr()
}
if len() >= len(.buf) {
, = .read()
if > 0 {
.changeAvailable(-)
.lastByte = int([-1])
}
return ,
}
.r = 0
.w = 0
, .err = .read(.buf)
if == 0 {
return 0, .readErr()
}
.w +=
}
= copy(, .Bytes())
.r +=
.changeAvailable(-)
.lastByte = int(.buf[.r-1])
return , nil
}
func ( *BufReader) ( byte) ( []byte, error) {
for {
if := bytes.IndexByte(.Bytes(), ); >= 0 {
++
= .buf[.r : .r+]
.r +=
.changeAvailable(-)
break
}
if .err != nil {
= .flush()
= .readErr()
break
}
:= .Buffered()
if .available != -1 && >= .available {
= .flush()
= io.EOF
break
}
if >= len(.buf) {
= .flush()
= bufio.ErrBufferFull
break
}
.fill()
}
if := len() - 1; >= 0 {
.lastByte = int([])
}
return ,
}
func ( *BufReader) ( func(byte) bool) ( []byte, error) {
for {
for , := range .Bytes() {
if !() {
--
= .buf[.r : .r+]
.r +=
.changeAvailable(-)
break
}
}
if .err != nil {
= .flush()
= .readErr()
break
}
:= .Buffered()
if .available != -1 && >= .available {
= .flush()
= io.EOF
break
}
if >= len(.buf) {
= .flush()
= bufio.ErrBufferFull
break
}
.fill()
}
if := len() - 1; >= 0 {
.lastByte = int([])
}
return ,
}
func ( *BufReader) () (byte, error) {
if .available == 0 {
return 0, io.EOF
}
for .r == .w {
if .err != nil {
return 0, .readErr()
}
.fill()
}
:= .buf[.r]
.r++
.lastByte = int()
.changeAvailable(-1)
return , nil
}
func ( *BufReader) () error {
if .lastByte < 0 || .r == 0 && .w > 0 {
return bufio.ErrInvalidUnreadByte
}
if .r > 0 {
.r--
} else {
.w = 1
}
.buf[.r] = byte(.lastByte)
.lastByte = -1
.changeAvailable(+1)
return nil
}
func ( *BufReader) ( int) ( int, error) {
if < 0 {
return 0, bufio.ErrNegativeCount
}
if == 0 {
return
}
:=
for {
:= .Buffered()
if == 0 {
.fill()
= .Buffered()
}
if > {
=
}
.r +=
.changeAvailable(-)
-=
if == 0 {
return , nil
}
if .err != nil {
return - , .readErr()
}
}
}
func ( *BufReader) ( int) ( []byte, error) {
if < 0 {
return nil, bufio.ErrNegativeCount
}
if == 0 {
return
}
:=
if .available != -1 && > .available {
= .available
}
for {
:= .Buffered()
if >= {
= .buf[.r : .r+]
.r +=
.changeAvailable(-)
if > {
= io.EOF
}
break
}
if .err != nil {
= .flush()
= .readErr()
break
}
if >= len(.buf) {
= .flush()
= bufio.ErrBufferFull
break
}
.fill()
}
if := len() - 1; >= 0 {
.lastByte = int([])
}
return ,
}
func ( *BufReader) () ([]byte, error) {
if .available == -1 {
panic("not reached")
}
:= make([]byte, .available)
, := io.ReadFull(, )
return ,
}
func ( *BufReader) () ([]byte, error) {
if .available == -1 {
panic("not reached")
}
if .available <= len(.buf) {
return .ReadN(.available)
}
return .ReadFull()
}
func ( *BufReader) ( []byte) (int, error) {
, := .rd.Read()
.bytesRead += int64()
return ,
}