bufio.go

1// Copyright 2009 The Go Authors. 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
5// Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer
6// object, creating another object (Reader or Writer) that also implements
7// the interface but provides buffering and some help for textual I/O.
8package bufio
9
10import (
11	"bytes"
12	"errors"
13	"io"
14	"strings"
15	"unicode/utf8"
16)
17
18const (
19	defaultBufSize = 4096
20)
21
22var (
23	ErrInvalidUnreadByte = errors.New("bufio: invalid use of UnreadByte")
24	ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune")
25	ErrBufferFull        = errors.New("bufio: buffer full")
26	ErrNegativeCount     = errors.New("bufio: negative count")
27)
28
29// Buffered input.
30
31// Reader implements buffering for an io.Reader object.
32type Reader struct {
33	buf          []byte
34	rd           io.Reader // reader provided by the client
35	r, w         int       // buf read and write positions
36	err          error
37	lastByte     int // last byte read for UnreadByte; -1 means invalid
38	lastRuneSize int // size of last rune read for UnreadRune; -1 means invalid
39}
40
41const minReadBufferSize = 16
42const maxConsecutiveEmptyReads = 100
43
44// NewReaderSize returns a new Reader whose buffer has at least the specified
45// size. If the argument io.Reader is already a Reader with large enough
46// size, it returns the underlying Reader.
47func NewReaderSize(rd io.Reader, size int) *Reader {
48	// Is it already a Reader?
49	b, ok := rd.(*Reader)
50	if ok && len(b.buf) >= size {
51		return b
52	}
53	if size < minReadBufferSize {
54		size = minReadBufferSize
55	}
56	r := new(Reader)
57	r.reset(make([]byte, size), rd)
58	return r
59}
60
61// NewReader returns a new Reader whose buffer has the default size.
62func NewReader(rd io.Reader) *Reader {
63	return NewReaderSize(rd, defaultBufSize)
64}
65
66// Size returns the size of the underlying buffer in bytes.
67func (b *Reader) Size() int { return len(b.buf) }
68
69// Reset discards any buffered data, resets all state, and switches
70// the buffered reader to read from r.
71// Calling Reset on the zero value of Reader initializes the internal buffer
72// to the default size.
73func (b *Reader) Reset(r io.Reader) {
74	if b.buf == nil {
75		b.buf = make([]byte, defaultBufSize)
76	}
77	b.reset(b.buf, r)
78}
79
80func (b *Reader) reset(buf []byte, r io.Reader) {
81	*b = Reader{
82		buf:          buf,
83		rd:           r,
84		lastByte:     -1,
85		lastRuneSize: -1,
86	}
87}
88
89var errNegativeRead = errors.New("bufio: reader returned negative count from Read")
90
91// fill reads a new chunk into the buffer.
92func (b *Reader) fill() {
93	// Slide existing data to beginning.
94	if b.r > 0 {
95		copy(b.buf, b.buf[b.r:b.w])
96		b.w -= b.r
97		b.r = 0
98	}
99
100	if b.w >= len(b.buf) {
101		panic("bufio: tried to fill full buffer")
102	}
103
104	// Read new data: try a limited number of times.
105	for i := maxConsecutiveEmptyReads; i > 0; i-- {
106		n, err := b.rd.Read(b.buf[b.w:])
107		if n < 0 {
108			panic(errNegativeRead)
109		}
110		b.w += n
111		if err != nil {
112			b.err = err
113			return
114		}
115		if n > 0 {
116			return
117		}
118	}
119	b.err = io.ErrNoProgress
120}
121
122func (b *Reader) readErr() error {
123	err := b.err
124	b.err = nil
125	return err
126}
127
128// Peek returns the next n bytes without advancing the reader. The bytes stop
129// being valid at the next read call. If Peek returns fewer than n bytes, it
130// also returns an error explaining why the read is short. The error is
131// ErrBufferFull if n is larger than b's buffer size.
132//
133// Calling Peek prevents a UnreadByte or UnreadRune call from succeeding
134// until the next read operation.
135func (b *Reader) Peek(n int) ([]byte, error) {
136	if n < 0 {
137		return nil, ErrNegativeCount
138	}
139
140	b.lastByte = -1
141	b.lastRuneSize = -1
142
143	for b.w-b.r < n && b.w-b.r < len(b.buf) && b.err == nil {
144		b.fill() // b.w-b.r < len(b.buf) => buffer is not full
145	}
146
147	if n > len(b.buf) {
148		return b.buf[b.r:b.w], ErrBufferFull
149	}
150
151	// 0 <= n <= len(b.buf)
152	var err error
153	if avail := b.w - b.r; avail < n {
154		// not enough data in buffer
155		n = avail
156		err = b.readErr()
157		if err == nil {
158			err = ErrBufferFull
159		}
160	}
161	return b.buf[b.r : b.r+n], err
162}
163
164// Discard skips the next n bytes, returning the number of bytes discarded.
165//
166// If Discard skips fewer than n bytes, it also returns an error.
167// If 0 <= n <= b.Buffered(), Discard is guaranteed to succeed without
168// reading from the underlying io.Reader.
169func (b *Reader) Discard(n int) (discarded int, err error) {
170	if n < 0 {
171		return 0, ErrNegativeCount
172	}
173	if n == 0 {
174		return
175	}
176
177	b.lastByte = -1
178	b.lastRuneSize = -1
179
180	remain := n
181	for {
182		skip := b.Buffered()
183		if skip == 0 {
184			b.fill()
185			skip = b.Buffered()
186		}
187		if skip > remain {
188			skip = remain
189		}
190		b.r += skip
191		remain -= skip
192		if remain == 0 {
193			return n, nil
194		}
195		if b.err != nil {
196			return n - remain, b.readErr()
197		}
198	}
199}
200
201// Read reads data into p.
202// It returns the number of bytes read into p.
203// The bytes are taken from at most one Read on the underlying Reader,
204// hence n may be less than len(p).
205// To read exactly len(p) bytes, use io.ReadFull(b, p).
206// If the underlying Reader can return a non-zero count with io.EOF,
207// then this Read method can do so as well; see the [io.Reader] docs.
208func (b *Reader) Read(p []byte) (n int, err error) {
209	n = len(p)
210	if n == 0 {
211		if b.Buffered() > 0 {
212			return 0, nil
213		}
214		return 0, b.readErr()
215	}
216	if b.r == b.w {
217		if b.err != nil {
218			return 0, b.readErr()
219		}
220		if len(p) >= len(b.buf) {
221			// Large read, empty buffer.
222			// Read directly into p to avoid copy.
223			n, b.err = b.rd.Read(p)
224			if n < 0 {
225				panic(errNegativeRead)
226			}
227			if n > 0 {
228				b.lastByte = int(p[n-1])
229				b.lastRuneSize = -1
230			}
231			return n, b.readErr()
232		}
233		// One read.
234		// Do not use b.fill, which will loop.
235		b.r = 0
236		b.w = 0
237		n, b.err = b.rd.Read(b.buf)
238		if n < 0 {
239			panic(errNegativeRead)
240		}
241		if n == 0 {
242			return 0, b.readErr()
243		}
244		b.w += n
245	}
246
247	// copy as much as we can
248	// Note: if the slice panics here, it is probably because
249	// the underlying reader returned a bad count. See issue 49795.
250	n = copy(p, b.buf[b.r:b.w])
251	b.r += n
252	b.lastByte = int(b.buf[b.r-1])
253	b.lastRuneSize = -1
254	return n, nil
255}
256
257// ReadByte reads and returns a single byte.
258// If no byte is available, returns an error.
259func (b *Reader) ReadByte() (byte, error) {
260	b.lastRuneSize = -1
261	for b.r == b.w {
262		if b.err != nil {
263			return 0, b.readErr()
264		}
265		b.fill() // buffer is empty
266	}
267	c := b.buf[b.r]
268	b.r++
269	b.lastByte = int(c)
270	return c, nil
271}
272
273// UnreadByte unreads the last byte. Only the most recently read byte can be unread.
274//
275// UnreadByte returns an error if the most recent method called on the
276// Reader was not a read operation. Notably, Peek, Discard, and WriteTo are not
277// considered read operations.
278func (b *Reader) UnreadByte() error {
279	if b.lastByte < 0 || b.r == 0 && b.w > 0 {
280		return ErrInvalidUnreadByte
281	}
282	// b.r > 0 || b.w == 0
283	if b.r > 0 {
284		b.r--
285	} else {
286		// b.r == 0 && b.w == 0
287		b.w = 1
288	}
289	b.buf[b.r] = byte(b.lastByte)
290	b.lastByte = -1
291	b.lastRuneSize = -1
292	return nil
293}
294
295// ReadRune reads a single UTF-8 encoded Unicode character and returns the
296// rune and its size in bytes. If the encoded rune is invalid, it consumes one byte
297// and returns unicode.ReplacementChar (U+FFFD) with a size of 1.
298func (b *Reader) ReadRune() (r rune, size int, err error) {
299	for b.r+utf8.UTFMax > b.w && !utf8.FullRune(b.buf[b.r:b.w]) && b.err == nil && b.w-b.r < len(b.buf) {
300		b.fill() // b.w-b.r < len(buf) => buffer is not full
301	}
302	b.lastRuneSize = -1
303	if b.r == b.w {
304		return 0, 0, b.readErr()
305	}
306	r, size = rune(b.buf[b.r]), 1
307	if r >= utf8.RuneSelf {
308		r, size = utf8.DecodeRune(b.buf[b.r:b.w])
309	}
310	b.r += size
311	b.lastByte = int(b.buf[b.r-1])
312	b.lastRuneSize = size
313	return r, size, nil
314}
315
316// UnreadRune unreads the last rune. If the most recent method called on
317// the Reader was not a ReadRune, UnreadRune returns an error. (In this
318// regard it is stricter than UnreadByte, which will unread the last byte
319// from any read operation.)
320func (b *Reader) UnreadRune() error {
321	if b.lastRuneSize < 0 || b.r < b.lastRuneSize {
322		return ErrInvalidUnreadRune
323	}
324	b.r -= b.lastRuneSize
325	b.lastByte = -1
326	b.lastRuneSize = -1
327	return nil
328}
329
330// Buffered returns the number of bytes that can be read from the current buffer.
331func (b *Reader) Buffered() int { return b.w - b.r }
332
333// ReadSlice reads until the first occurrence of delim in the input,
334// returning a slice pointing at the bytes in the buffer.
335// The bytes stop being valid at the next read.
336// If ReadSlice encounters an error before finding a delimiter,
337// it returns all the data in the buffer and the error itself (often io.EOF).
338// ReadSlice fails with error ErrBufferFull if the buffer fills without a delim.
339// Because the data returned from ReadSlice will be overwritten
340// by the next I/O operation, most clients should use
341// ReadBytes or ReadString instead.
342// ReadSlice returns err != nil if and only if line does not end in delim.
343func (b *Reader) ReadSlice(delim byte) (line []byte, err error) {
344	s := 0 // search start index
345	for {
346		// Search buffer.
347		if i := bytes.IndexByte(b.buf[b.r+s:b.w], delim); i >= 0 {
348			i += s
349			line = b.buf[b.r : b.r+i+1]
350			b.r += i + 1
351			break
352		}
353
354		// Pending error?
355		if b.err != nil {
356			line = b.buf[b.r:b.w]
357			b.r = b.w
358			err = b.readErr()
359			break
360		}
361
362		// Buffer full?
363		if b.Buffered() >= len(b.buf) {
364			b.r = b.w
365			line = b.buf
366			err = ErrBufferFull
367			break
368		}
369
370		s = b.w - b.r // do not rescan area we scanned before
371
372		b.fill() // buffer is not full
373	}
374
375	// Handle last byte, if any.
376	if i := len(line) - 1; i >= 0 {
377		b.lastByte = int(line[i])
378		b.lastRuneSize = -1
379	}
380
381	return
382}
383
384// ReadLine is a low-level line-reading primitive. Most callers should use
385// ReadBytes('\n') or ReadString('\n') instead or use a Scanner.
386//
387// ReadLine tries to return a single line, not including the end-of-line bytes.
388// If the line was too long for the buffer then isPrefix is set and the
389// beginning of the line is returned. The rest of the line will be returned
390// from future calls. isPrefix will be false when returning the last fragment
391// of the line. The returned buffer is only valid until the next call to
392// ReadLine. ReadLine either returns a non-nil line or it returns an error,
393// never both.
394//
395// The text returned from ReadLine does not include the line end ("\r\n" or "\n").
396// No indication or error is given if the input ends without a final line end.
397// Calling UnreadByte after ReadLine will always unread the last byte read
398// (possibly a character belonging to the line end) even if that byte is not
399// part of the line returned by ReadLine.
400func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) {
401	line, err = b.ReadSlice('\n')
402	if err == ErrBufferFull {
403		// Handle the case where "\r\n" straddles the buffer.
404		if len(line) > 0 && line[len(line)-1] == '\r' {
405			// Put the '\r' back on buf and drop it from line.
406			// Let the next call to ReadLine check for "\r\n".
407			if b.r == 0 {
408				// should be unreachable
409				panic("bufio: tried to rewind past start of buffer")
410			}
411			b.r--
412			line = line[:len(line)-1]
413		}
414		return line, true, nil
415	}
416
417	if len(line) == 0 {
418		if err != nil {
419			line = nil
420		}
421		return
422	}
423	err = nil
424
425	if line[len(line)-1] == '\n' {
426		drop := 1
427		if len(line) > 1 && line[len(line)-2] == '\r' {
428			drop = 2
429		}
430		line = line[:len(line)-drop]
431	}
432	return
433}
434
435// collectFragments reads until the first occurrence of delim in the input. It
436// returns (slice of full buffers, remaining bytes before delim, total number
437// of bytes in the combined first two elements, error).
438// The complete result is equal to
439// `bytes.Join(append(fullBuffers, finalFragment), nil)`, which has a
440// length of `totalLen`. The result is structured in this way to allow callers
441// to minimize allocations and copies.
442func (b *Reader) collectFragments(delim byte) (fullBuffers [][]byte, finalFragment []byte, totalLen int, err error) {
443	var frag []byte
444	// Use ReadSlice to look for delim, accumulating full buffers.
445	for {
446		var e error
447		frag, e = b.ReadSlice(delim)
448		if e == nil { // got final fragment
449			break
450		}
451		if e != ErrBufferFull { // unexpected error
452			err = e
453			break
454		}
455
456		// Make a copy of the buffer.
457		buf := make([]byte, len(frag))
458		copy(buf, frag)
459		fullBuffers = append(fullBuffers, buf)
460		totalLen += len(buf)
461	}
462
463	totalLen += len(frag)
464	return fullBuffers, frag, totalLen, err
465}
466
467// ReadBytes reads until the first occurrence of delim in the input,
468// returning a slice containing the data up to and including the delimiter.
469// If ReadBytes encounters an error before finding a delimiter,
470// it returns the data read before the error and the error itself (often io.EOF).
471// ReadBytes returns err != nil if and only if the returned data does not end in
472// delim.
473// For simple uses, a Scanner may be more convenient.
474func (b *Reader) ReadBytes(delim byte) ([]byte, error) {
475	full, frag, n, err := b.collectFragments(delim)
476	// Allocate new buffer to hold the full pieces and the fragment.
477	buf := make([]byte, n)
478	n = 0
479	// Copy full pieces and fragment in.
480	for i := range full {
481		n += copy(buf[n:], full[i])
482	}
483	copy(buf[n:], frag)
484	return buf, err
485}
486
487// ReadString reads until the first occurrence of delim in the input,
488// returning a string containing the data up to and including the delimiter.
489// If ReadString encounters an error before finding a delimiter,
490// it returns the data read before the error and the error itself (often io.EOF).
491// ReadString returns err != nil if and only if the returned data does not end in
492// delim.
493// For simple uses, a Scanner may be more convenient.
494func (b *Reader) ReadString(delim byte) (string, error) {
495	full, frag, n, err := b.collectFragments(delim)
496	// Allocate new buffer to hold the full pieces and the fragment.
497	var buf strings.Builder
498	buf.Grow(n)
499	// Copy full pieces and fragment in.
500	for _, fb := range full {
501		buf.Write(fb)
502	}
503	buf.Write(frag)
504	return buf.String(), err
505}
506
507// WriteTo implements io.WriterTo.
508// This may make multiple calls to the Read method of the underlying Reader.
509// If the underlying reader supports the WriteTo method,
510// this calls the underlying WriteTo without buffering.
511func (b *Reader) WriteTo(w io.Writer) (n int64, err error) {
512	b.lastByte = -1
513	b.lastRuneSize = -1
514
515	n, err = b.writeBuf(w)
516	if err != nil {
517		return
518	}
519
520	if r, ok := b.rd.(io.WriterTo); ok {
521		m, err := r.WriteTo(w)
522		n += m
523		return n, err
524	}
525
526	if w, ok := w.(io.ReaderFrom); ok {
527		m, err := w.ReadFrom(b.rd)
528		n += m
529		return n, err
530	}
531
532	if b.w-b.r < len(b.buf) {
533		b.fill() // buffer not full
534	}
535
536	for b.r < b.w {
537		// b.r < b.w => buffer is not empty
538		m, err := b.writeBuf(w)
539		n += m
540		if err != nil {
541			return n, err
542		}
543		b.fill() // buffer is empty
544	}
545
546	if b.err == io.EOF {
547		b.err = nil
548	}
549
550	return n, b.readErr()
551}
552
553var errNegativeWrite = errors.New("bufio: writer returned negative count from Write")
554
555// writeBuf writes the Reader's buffer to the writer.
556func (b *Reader) writeBuf(w io.Writer) (int64, error) {
557	n, err := w.Write(b.buf[b.r:b.w])
558	if n < 0 {
559		panic(errNegativeWrite)
560	}
561	b.r += n
562	return int64(n), err
563}
564
565// buffered output
566
567// Writer implements buffering for an io.Writer object.
568// If an error occurs writing to a Writer, no more data will be
569// accepted and all subsequent writes, and Flush, will return the error.
570// After all data has been written, the client should call the
571// Flush method to guarantee all data has been forwarded to
572// the underlying io.Writer.
573type Writer struct {
574	err error
575	buf []byte
576	n   int
577	wr  io.Writer
578}
579
580// NewWriterSize returns a new Writer whose buffer has at least the specified
581// size. If the argument io.Writer is already a Writer with large enough
582// size, it returns the underlying Writer.
583func NewWriterSize(w io.Writer, size int) *Writer {
584	// Is it already a Writer?
585	b, ok := w.(*Writer)
586	if ok && len(b.buf) >= size {
587		return b
588	}
589	if size <= 0 {
590		size = defaultBufSize
591	}
592	return &Writer{
593		buf: make([]byte, size),
594		wr:  w,
595	}
596}
597
598// NewWriter returns a new Writer whose buffer has the default size.
599// If the argument io.Writer is already a Writer with large enough buffer size,
600// it returns the underlying Writer.
601func NewWriter(w io.Writer) *Writer {
602	return NewWriterSize(w, defaultBufSize)
603}
604
605// Size returns the size of the underlying buffer in bytes.
606func (b *Writer) Size() int { return len(b.buf) }
607
608// Reset discards any unflushed buffered data, clears any error, and
609// resets b to write its output to w.
610// Calling Reset on the zero value of Writer initializes the internal buffer
611// to the default size.
612func (b *Writer) Reset(w io.Writer) {
613	if b.buf == nil {
614		b.buf = make([]byte, defaultBufSize)
615	}
616	b.err = nil
617	b.n = 0
618	b.wr = w
619}
620
621// Flush writes any buffered data to the underlying io.Writer.
622func (b *Writer) Flush() error {
623	if b.err != nil {
624		return b.err
625	}
626	if b.n == 0 {
627		return nil
628	}
629	n, err := b.wr.Write(b.buf[0:b.n])
630	if n < b.n && err == nil {
631		err = io.ErrShortWrite
632	}
633	if err != nil {
634		if n > 0 && n < b.n {
635			copy(b.buf[0:b.n-n], b.buf[n:b.n])
636		}
637		b.n -= n
638		b.err = err
639		return err
640	}
641	b.n = 0
642	return nil
643}
644
645// Available returns how many bytes are unused in the buffer.
646func (b *Writer) Available() int { return len(b.buf) - b.n }
647
648// AvailableBuffer returns an empty buffer with b.Available() capacity.
649// This buffer is intended to be appended to and
650// passed to an immediately succeeding Write call.
651// The buffer is only valid until the next write operation on b.
652func (b *Writer) AvailableBuffer() []byte {
653	return b.buf[b.n:][:0]
654}
655
656// Buffered returns the number of bytes that have been written into the current buffer.
657func (b *Writer) Buffered() int { return b.n }
658
659// Write writes the contents of p into the buffer.
660// It returns the number of bytes written.
661// If nn < len(p), it also returns an error explaining
662// why the write is short.
663func (b *Writer) Write(p []byte) (nn int, err error) {
664	for len(p) > b.Available() && b.err == nil {
665		var n int
666		if b.Buffered() == 0 {
667			// Large write, empty buffer.
668			// Write directly from p to avoid copy.
669			n, b.err = b.wr.Write(p)
670		} else {
671			n = copy(b.buf[b.n:], p)
672			b.n += n
673			b.Flush()
674		}
675		nn += n
676		p = p[n:]
677	}
678	if b.err != nil {
679		return nn, b.err
680	}
681	n := copy(b.buf[b.n:], p)
682	b.n += n
683	nn += n
684	return nn, nil
685}
686
687// WriteByte writes a single byte.
688func (b *Writer) WriteByte(c byte) error {
689	if b.err != nil {
690		return b.err
691	}
692	if b.Available() <= 0 && b.Flush() != nil {
693		return b.err
694	}
695	b.buf[b.n] = c
696	b.n++
697	return nil
698}
699
700// WriteRune writes a single Unicode code point, returning
701// the number of bytes written and any error.
702func (b *Writer) WriteRune(r rune) (size int, err error) {
703	// Compare as uint32 to correctly handle negative runes.
704	if uint32(r) < utf8.RuneSelf {
705		err = b.WriteByte(byte(r))
706		if err != nil {
707			return 0, err
708		}
709		return 1, nil
710	}
711	if b.err != nil {
712		return 0, b.err
713	}
714	n := b.Available()
715	if n < utf8.UTFMax {
716		if b.Flush(); b.err != nil {
717			return 0, b.err
718		}
719		n = b.Available()
720		if n < utf8.UTFMax {
721			// Can only happen if buffer is silly small.
722			return b.WriteString(string(r))
723		}
724	}
725	size = utf8.EncodeRune(b.buf[b.n:], r)
726	b.n += size
727	return size, nil
728}
729
730// WriteString writes a string.
731// It returns the number of bytes written.
732// If the count is less than len(s), it also returns an error explaining
733// why the write is short.
734func (b *Writer) WriteString(s string) (int, error) {
735	var sw io.StringWriter
736	tryStringWriter := true
737
738	nn := 0
739	for len(s) > b.Available() && b.err == nil {
740		var n int
741		if b.Buffered() == 0 && sw == nil && tryStringWriter {
742			// Check at most once whether b.wr is a StringWriter.
743			sw, tryStringWriter = b.wr.(io.StringWriter)
744		}
745		if b.Buffered() == 0 && tryStringWriter {
746			// Large write, empty buffer, and the underlying writer supports
747			// WriteString: forward the write to the underlying StringWriter.
748			// This avoids an extra copy.
749			n, b.err = sw.WriteString(s)
750		} else {
751			n = copy(b.buf[b.n:], s)
752			b.n += n
753			b.Flush()
754		}
755		nn += n
756		s = s[n:]
757	}
758	if b.err != nil {
759		return nn, b.err
760	}
761	n := copy(b.buf[b.n:], s)
762	b.n += n
763	nn += n
764	return nn, nil
765}
766
767// ReadFrom implements io.ReaderFrom. If the underlying writer
768// supports the ReadFrom method, this calls the underlying ReadFrom.
769// If there is buffered data and an underlying ReadFrom, this fills
770// the buffer and writes it before calling ReadFrom.
771func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) {
772	if b.err != nil {
773		return 0, b.err
774	}
775	readerFrom, readerFromOK := b.wr.(io.ReaderFrom)
776	var m int
777	for {
778		if b.Available() == 0 {
779			if err1 := b.Flush(); err1 != nil {
780				return n, err1
781			}
782		}
783		if readerFromOK && b.Buffered() == 0 {
784			nn, err := readerFrom.ReadFrom(r)
785			b.err = err
786			n += nn
787			return n, err
788		}
789		nr := 0
790		for nr < maxConsecutiveEmptyReads {
791			m, err = r.Read(b.buf[b.n:])
792			if m != 0 || err != nil {
793				break
794			}
795			nr++
796		}
797		if nr == maxConsecutiveEmptyReads {
798			return n, io.ErrNoProgress
799		}
800		b.n += m
801		n += int64(m)
802		if err != nil {
803			break
804		}
805	}
806	if err == io.EOF {
807		// If we filled the buffer exactly, flush preemptively.
808		if b.Available() == 0 {
809			err = b.Flush()
810		} else {
811			err = nil
812		}
813	}
814	return n, err
815}
816
817// buffered input and output
818
819// ReadWriter stores pointers to a Reader and a Writer.
820// It implements io.ReadWriter.
821type ReadWriter struct {
822	*Reader
823	*Writer
824}
825
826// NewReadWriter allocates a new ReadWriter that dispatches to r and w.
827func NewReadWriter(r *Reader, w *Writer) *ReadWriter {
828	return &ReadWriter{r, w}
829}