Source File
bufio.go
Belonging Package
bufio
package bufio
import (
)
const (
defaultBufSize = 4096
)
var (
ErrInvalidUnreadByte = errors.New("bufio: invalid use of UnreadByte")
ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune")
ErrBufferFull = errors.New("bufio: buffer full")
ErrNegativeCount = errors.New("bufio: negative count")
)
type Reader struct {
buf []byte
rd io.Reader // reader provided by the client
r, w int // buf read and write positions
err error
lastByte int // last byte read for UnreadByte; -1 means invalid
lastRuneSize int // size of last rune read for UnreadRune; -1 means invalid
}
const minReadBufferSize = 16
const maxConsecutiveEmptyReads = 100
, := .(*Reader)
if && len(.buf) >= {
return
}
if < minReadBufferSize {
= minReadBufferSize
}
:= new(Reader)
.reset(make([]byte, ), )
return
}
func ( io.Reader) *Reader {
return NewReaderSize(, defaultBufSize)
}
var error
, .err = .rd.Read()
if < 0 {
panic(errNegativeRead)
}
if > 0 {
.lastByte = int([-1])
.lastRuneSize = -1
}
return , .readErr()
func ( *Reader) () ( rune, int, error) {
for .r+utf8.UTFMax > .w && !utf8.FullRune(.buf[.r:.w]) && .err == nil && .w-.r < len(.buf) {
.fill() // b.w-b.r < len(buf) => buffer is not full
}
.lastRuneSize = -1
if .r == .w {
return 0, 0, .readErr()
}
, = rune(.buf[.r]), 1
if >= utf8.RuneSelf {
, = utf8.DecodeRune(.buf[.r:.w])
}
.r +=
.lastByte = int(.buf[.r-1])
.lastRuneSize =
return , , nil
}
func ( *Reader) () error {
if .lastRuneSize < 0 || .r < .lastRuneSize {
return ErrInvalidUnreadRune
}
.r -= .lastRuneSize
.lastByte = -1
.lastRuneSize = -1
return nil
}
if := len() - 1; >= 0 {
.lastByte = int([])
.lastRuneSize = -1
}
return
}
for {
var error
, = .ReadSlice()
if == nil { // got final fragment
break
}
if != ErrBufferFull { // unexpected error
=
break
}
func ( io.Writer) *Writer {
return NewWriterSize(, defaultBufSize)
}
return .WriteString(string())
}
}
= utf8.EncodeRune(.buf[.n:], )
.n +=
return , nil
}
func ( *Writer) ( io.Reader) ( int64, error) {
if .err != nil {
return 0, .err
}
if .Buffered() == 0 {
if , := .wr.(io.ReaderFrom); {
, = .ReadFrom()
.err =
return ,
}
}
var int
for {
if .Available() == 0 {
if := .Flush(); != nil {
return ,
}
}
:= 0
for < maxConsecutiveEmptyReads {
, = .Read(.buf[.n:])
if != 0 || != nil {
break
}
++
}
if == maxConsecutiveEmptyReads {
return , io.ErrNoProgress
}
.n +=
+= int64()
if != nil {
break
}
}
type ReadWriter struct {
*Reader
*Writer
}
func ( *Reader, *Writer) *ReadWriter {
return &ReadWriter{, }
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |