123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521 |
- // Copyright 2009 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- // Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer
- // object, creating another object (Reader or Writer) that also implements
- // the interface but provides buffering and some help for textual I/O.
- package bufio
- import (
- "bytes"
- "errors"
- "io"
- )
- const (
- defaultBufSize = 4096
- )
- var (
- // ErrInvalidUnreadByte invalid use of UnreadByete
- ErrInvalidUnreadByte = errors.New("bufio: invalid use of UnreadByte")
- // ErrInvalidUnreadRune invalid use of UnreadRune
- ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune")
- // ErrBufferFull buffer full
- ErrBufferFull = errors.New("bufio: buffer full")
- // ErrNegativeCount negative count
- ErrNegativeCount = errors.New("bufio: negative count")
- )
- // Buffered input.
- // Reader implements buffering for an io.Reader object.
- type Reader struct {
- buf []byte
- rd io.Reader // reader provided by the client
- r, w int // buf read and write positions
- err error
- }
- const minReadBufferSize = 16
- const maxConsecutiveEmptyReads = 100
- // NewReaderSize returns a new Reader whose buffer has at least the specified
- // size. If the argument io.Reader is already a Reader with large enough
- // size, it returns the underlying Reader.
- func NewReaderSize(rd io.Reader, size int) *Reader {
- // Is it already a Reader?
- b, ok := rd.(*Reader)
- if ok && len(b.buf) >= size {
- return b
- }
- if size < minReadBufferSize {
- size = minReadBufferSize
- }
- r := new(Reader)
- r.reset(make([]byte, size), rd)
- return r
- }
- // NewReader returns a new Reader whose buffer has the default size.
- func NewReader(rd io.Reader) *Reader {
- return NewReaderSize(rd, defaultBufSize)
- }
- // Reset discards any buffered data, resets all state, and switches
- // the buffered reader to read from r.
- func (b *Reader) Reset(r io.Reader) {
- b.reset(b.buf, r)
- }
- // ResetBuffer discards any buffered data, resets all state, and switches
- // the buffered reader to read from r.
- func (b *Reader) ResetBuffer(r io.Reader, buf []byte) {
- b.reset(buf, r)
- }
- func (b *Reader) reset(buf []byte, r io.Reader) {
- *b = Reader{
- buf: buf,
- rd: r,
- }
- }
- var errNegativeRead = errors.New("bufio: reader returned negative count from Read")
- // fill reads a new chunk into the buffer.
- func (b *Reader) fill() {
- // Slide existing data to beginning.
- if b.r > 0 {
- copy(b.buf, b.buf[b.r:b.w])
- b.w -= b.r
- b.r = 0
- }
- if b.w >= len(b.buf) {
- panic("bufio: tried to fill full buffer")
- }
- // Read new data: try a limited number of times.
- for i := maxConsecutiveEmptyReads; i > 0; i-- {
- n, err := b.rd.Read(b.buf[b.w:])
- if n < 0 {
- panic(errNegativeRead)
- }
- b.w += n
- if err != nil {
- b.err = err
- return
- }
- if n > 0 {
- return
- }
- }
- b.err = io.ErrNoProgress
- }
- func (b *Reader) readErr() error {
- err := b.err
- b.err = nil
- return err
- }
- // Peek returns the next n bytes without advancing the reader. The bytes stop
- // being valid at the next read call. If Peek returns fewer than n bytes, it
- // also returns an error explaining why the read is short. The error is
- // ErrBufferFull if n is larger than b's buffer size.
- func (b *Reader) Peek(n int) ([]byte, error) {
- if n < 0 {
- return nil, ErrNegativeCount
- }
- if n > len(b.buf) {
- return nil, ErrBufferFull
- }
- // 0 <= n <= len(b.buf)
- for b.w-b.r < n && b.err == nil {
- b.fill() // b.w-b.r < len(b.buf) => buffer is not full
- }
- var err error
- if avail := b.w - b.r; avail < n {
- // not enough data in buffer
- n = avail
- err = b.readErr()
- if err == nil {
- err = ErrBufferFull
- }
- }
- return b.buf[b.r : b.r+n], err
- }
- // Pop returns the next n bytes with advancing the reader. The bytes stop
- // being valid at the next read call. If Pop returns fewer than n bytes, it
- // also returns an error explaining why the read is short. The error is
- // ErrBufferFull if n is larger than b's buffer size.
- func (b *Reader) Pop(n int) ([]byte, error) {
- d, err := b.Peek(n)
- if err == nil {
- b.r += n
- return d, err
- }
- return nil, err
- }
- // Discard skips the next n bytes, returning the number of bytes discarded.
- //
- // If Discard skips fewer than n bytes, it also returns an error.
- // If 0 <= n <= b.Buffered(), Discard is guaranteed to succeed without
- // reading from the underlying io.Reader.
- func (b *Reader) Discard(n int) (discarded int, err error) {
- if n < 0 {
- return 0, ErrNegativeCount
- }
- if n == 0 {
- return
- }
- remain := n
- for {
- skip := b.Buffered()
- if skip == 0 {
- b.fill()
- skip = b.Buffered()
- }
- if skip > remain {
- skip = remain
- }
- b.r += skip
- remain -= skip
- if remain == 0 {
- return n, nil
- }
- if b.err != nil {
- return n - remain, b.readErr()
- }
- }
- }
- // Read reads data into p.
- // It returns the number of bytes read into p.
- // It calls Read at most once on the underlying Reader,
- // hence n may be less than len(p).
- // At EOF, the count will be zero and err will be io.EOF.
- func (b *Reader) Read(p []byte) (n int, err error) {
- n = len(p)
- if n == 0 {
- return 0, b.readErr()
- }
- if b.r == b.w {
- if b.err != nil {
- return 0, b.readErr()
- }
- if len(p) >= len(b.buf) {
- // Large read, empty buffer.
- // Read directly into p to avoid copy.
- n, b.err = b.rd.Read(p)
- if n < 0 {
- panic(errNegativeRead)
- }
- return n, b.readErr()
- }
- b.fill() // buffer is empty
- if b.r == b.w {
- return 0, b.readErr()
- }
- }
- // copy as much as we can
- n = copy(p, b.buf[b.r:b.w])
- b.r += n
- return n, nil
- }
- // ReadByte reads and returns a single byte.
- // If no byte is available, returns an error.
- func (b *Reader) ReadByte() (c byte, err error) {
- //b.lastRuneSize = -1
- for b.r == b.w {
- if b.err != nil {
- return 0, b.readErr()
- }
- b.fill() // buffer is empty
- }
- c = b.buf[b.r]
- b.r++
- //b.lastByte = int(c)
- return c, nil
- }
- // ReadSlice reads until the first occurrence of delim in the input,
- // returning a slice pointing at the bytes in the buffer.
- // The bytes stop being valid at the next read.
- // If ReadSlice encounters an error before finding a delimiter,
- // it returns all the data in the buffer and the error itself (often io.EOF).
- // ReadSlice fails with error ErrBufferFull if the buffer fills without a delim.
- // Because the data returned from ReadSlice will be overwritten
- // by the next I/O operation, most clients should use
- // ReadBytes or ReadString instead.
- // ReadSlice returns err != nil if and only if line does not end in delim.
- func (b *Reader) ReadSlice(delim byte) (line []byte, err error) {
- for {
- // Search buffer.
- if i := bytes.IndexByte(b.buf[b.r:b.w], delim); i >= 0 {
- line = b.buf[b.r : b.r+i+1]
- b.r += i + 1
- break
- }
- // Pending error?
- if b.err != nil {
- line = b.buf[b.r:b.w]
- b.r = b.w
- err = b.readErr()
- break
- }
- // Buffer full?
- if b.Buffered() >= len(b.buf) {
- b.r = b.w
- line = b.buf
- err = ErrBufferFull
- break
- }
- b.fill() // buffer is not full
- }
- return
- }
- // ReadLine is a low-level line-reading primitive. Most callers should use
- // ReadBytes('\n') or ReadString('\n') instead or use a Scanner.
- //
- // ReadLine tries to return a single line, not including the end-of-line bytes.
- // If the line was too long for the buffer then isPrefix is set and the
- // beginning of the line is returned. The rest of the line will be returned
- // from future calls. isPrefix will be false when returning the last fragment
- // of the line. The returned buffer is only valid until the next call to
- // ReadLine. ReadLine either returns a non-nil line or it returns an error,
- // never both.
- //
- // The text returned from ReadLine does not include the line end ("\r\n" or "\n").
- // No indication or error is given if the input ends without a final line end.
- // Calling UnreadByte after ReadLine will always unread the last byte read
- // (possibly a character belonging to the line end) even if that byte is not
- // part of the line returned by ReadLine.
- func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) {
- line, err = b.ReadSlice('\n')
- if err == ErrBufferFull {
- // Handle the case where "\r\n" straddles the buffer.
- if len(line) > 0 && line[len(line)-1] == '\r' {
- // Put the '\r' back on buf and drop it from line.
- // Let the next call to ReadLine check for "\r\n".
- if b.r == 0 {
- // should be unreachable
- panic("bufio: tried to rewind past start of buffer")
- }
- b.r--
- line = line[:len(line)-1]
- }
- return line, true, nil
- }
- if len(line) == 0 {
- if err != nil {
- line = nil
- }
- return
- }
- err = nil
- if line[len(line)-1] == '\n' {
- drop := 1
- if len(line) > 1 && line[len(line)-2] == '\r' {
- drop = 2
- }
- line = line[:len(line)-drop]
- }
- return
- }
- // Buffered returns the number of bytes that can be read from the current buffer.
- func (b *Reader) Buffered() int { return b.w - b.r }
- // buffered output
- // Writer implements buffering for an io.Writer object.
- // If an error occurs writing to a Writer, no more data will be
- // accepted and all subsequent writes will return the error.
- // After all data has been written, the client should call the
- // Flush method to guarantee all data has been forwarded to
- // the underlying io.Writer.
- type Writer struct {
- err error
- buf []byte
- n int
- wr io.Writer
- }
- // NewWriterSize returns a new Writer whose buffer has at least the specified
- // size. If the argument io.Writer is already a Writer with large enough
- // size, it returns the underlying Writer.
- func NewWriterSize(w io.Writer, size int) *Writer {
- // Is it already a Writer?
- b, ok := w.(*Writer)
- if ok && len(b.buf) >= size {
- return b
- }
- if size <= 0 {
- size = defaultBufSize
- }
- return &Writer{
- buf: make([]byte, size),
- wr: w,
- }
- }
- // NewWriter returns a new Writer whose buffer has the default size.
- func NewWriter(w io.Writer) *Writer {
- return NewWriterSize(w, defaultBufSize)
- }
- // Reset discards any unflushed buffered data, clears any error, and
- // resets b to write its output to w.
- func (b *Writer) Reset(w io.Writer) {
- b.err = nil
- b.n = 0
- b.wr = w
- }
- // ResetBuffer discards any unflushed buffered data, clears any error, and
- // resets b to write its output to w.
- func (b *Writer) ResetBuffer(w io.Writer, buf []byte) {
- b.buf = buf
- b.err = nil
- b.n = 0
- b.wr = w
- }
- // Flush writes any buffered data to the underlying io.Writer.
- func (b *Writer) Flush() error {
- err := b.flush()
- return err
- }
- func (b *Writer) flush() error {
- if b.err != nil {
- return b.err
- }
- if b.n == 0 {
- return nil
- }
- n, err := b.wr.Write(b.buf[0:b.n])
- if n < b.n && err == nil {
- err = io.ErrShortWrite
- }
- if err != nil {
- if n > 0 && n < b.n {
- copy(b.buf[0:b.n-n], b.buf[n:b.n])
- }
- b.n -= n
- b.err = err
- return err
- }
- b.n = 0
- return nil
- }
- // Available returns how many bytes are unused in the buffer.
- func (b *Writer) Available() int { return len(b.buf) - b.n }
- // Buffered returns the number of bytes that have been written into the current buffer.
- func (b *Writer) Buffered() int { return b.n }
- // Write writes the contents of p into the buffer.
- // It returns the number of bytes written.
- // If nn < len(p), it also returns an error explaining
- // why the write is short.
- func (b *Writer) Write(p []byte) (nn int, err error) {
- for len(p) > b.Available() && b.err == nil {
- var n int
- if b.Buffered() == 0 {
- // Large write, empty buffer.
- // Write directly from p to avoid copy.
- n, b.err = b.wr.Write(p)
- } else {
- n = copy(b.buf[b.n:], p)
- b.n += n
- b.flush()
- }
- nn += n
- p = p[n:]
- }
- if b.err != nil {
- return nn, b.err
- }
- n := copy(b.buf[b.n:], p)
- b.n += n
- nn += n
- return nn, nil
- }
- // WriteRaw writes the contents of p into the raw io.Writer without buffer.
- // It returns the number of bytes written.
- // If nn < len(p), it also returns an error explaining
- // why the write is short.
- func (b *Writer) WriteRaw(p []byte) (nn int, err error) {
- if b.err != nil {
- return 0, b.err
- }
- if b.Buffered() == 0 {
- // if no buffer data, write raw writer
- nn, err = b.wr.Write(p)
- b.err = err
- } else {
- nn, err = b.Write(p)
- }
- return
- }
- // Peek returns the next n bytes with advancing the writer. The bytes stop
- // being used at the next write call. If Peek returns fewer than n bytes, it
- // also returns an error explaining why the read is short. The error is
- // ErrBufferFull if n is larger than b's buffer size.
- func (b *Writer) Peek(n int) ([]byte, error) {
- if n < 0 {
- return nil, ErrNegativeCount
- }
- if n > len(b.buf) {
- return nil, ErrBufferFull
- }
- for b.Available() < n && b.err == nil {
- b.flush()
- }
- if b.err != nil {
- return nil, b.err
- }
- d := b.buf[b.n : b.n+n]
- b.n += n
- return d, nil
- }
- // WriteString writes a string.
- // It returns the number of bytes written.
- // If the count is less than len(s), it also returns an error explaining
- // why the write is short.
- func (b *Writer) WriteString(s string) (int, error) {
- nn := 0
- for len(s) > b.Available() && b.err == nil {
- n := copy(b.buf[b.n:], s)
- b.n += n
- nn += n
- s = s[n:]
- b.flush()
- }
- if b.err != nil {
- return nn, b.err
- }
- n := copy(b.buf[b.n:], s)
- b.n += n
- nn += n
- return nn, nil
- }
|