buffer.go 10.7 KB
Newer Older
1 2 3 4 5 6 7 8 9
// 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 bytes

// Simple byte buffer for marshaling data.

import (
10
	"errors"
11
	"io"
12
	"unicode/utf8"
13 14 15 16 17 18 19 20 21
)

// A Buffer is a variable-sized buffer of bytes with Read and Write methods.
// The zero value for Buffer is an empty buffer ready to use.
type Buffer struct {
	buf       []byte            // contents are the bytes buf[off : len(buf)]
	off       int               // read at &buf[off], write at &buf[len(buf)]
	runeBytes [utf8.UTFMax]byte // avoid allocation of slice on each WriteByte or Rune
	bootstrap [64]byte          // memory to hold first slice; helps small buffers (Printf) avoid allocation.
22
	lastRead  readOp            // last read operation, so that Unread* can work correctly.
23 24
}

25 26 27 28 29 30 31 32 33 34 35
// The readOp constants describe the last action performed on
// the buffer, so that UnreadRune and UnreadByte can
// check for invalid usage.
type readOp int

const (
	opInvalid  readOp = iota // Non-read operation.
	opReadRune               // Read rune.
	opRead                   // Any other read operation.
)

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
// Bytes returns a slice of the contents of the unread portion of the buffer;
// len(b.Bytes()) == b.Len().  If the caller changes the contents of the
// returned slice, the contents of the buffer will change provided there
// are no intervening method calls on the Buffer.
func (b *Buffer) Bytes() []byte { return b.buf[b.off:] }

// String returns the contents of the unread portion of the buffer
// as a string.  If the Buffer is a nil pointer, it returns "<nil>".
func (b *Buffer) String() string {
	if b == nil {
		// Special case, useful in debugging.
		return "<nil>"
	}
	return string(b.buf[b.off:])
}

// Len returns the number of bytes of the unread portion of the buffer;
// b.Len() == len(b.Bytes()).
func (b *Buffer) Len() int { return len(b.buf) - b.off }

// Truncate discards all but the first n unread bytes from the buffer.
// It is an error to call b.Truncate(n) with n > b.Len().
func (b *Buffer) Truncate(n int) {
59
	b.lastRead = opInvalid
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
	if n == 0 {
		// Reuse buffer space.
		b.off = 0
	}
	b.buf = b.buf[0 : b.off+n]
}

// Reset resets the buffer so it has no content.
// b.Reset() is the same as b.Truncate(0).
func (b *Buffer) Reset() { b.Truncate(0) }

// Grow buffer to guarantee space for n more bytes.
// Return index where bytes should be written.
func (b *Buffer) grow(n int) int {
	m := b.Len()
	// If buffer is empty, reset to recover space.
	if m == 0 && b.off != 0 {
		b.Truncate(0)
	}
	if len(b.buf)+n > cap(b.buf) {
		var buf []byte
		if b.buf == nil && n <= len(b.bootstrap) {
			buf = b.bootstrap[0:]
		} else {
			// not enough space anywhere
			buf = make([]byte, 2*cap(b.buf)+n)
			copy(buf, b.buf[b.off:])
		}
		b.buf = buf
		b.off = 0
	}
	b.buf = b.buf[0 : b.off+m+n]
	return b.off + m
}

// Write appends the contents of p to the buffer.  The return
// value n is the length of p; err is always nil.
97
func (b *Buffer) Write(p []byte) (n int, err error) {
98
	b.lastRead = opInvalid
99 100 101 102 103 104 105
	m := b.grow(len(p))
	copy(b.buf[m:], p)
	return len(p), nil
}

// WriteString appends the contents of s to the buffer.  The return
// value n is the length of s; err is always nil.
106
func (b *Buffer) WriteString(s string) (n int, err error) {
107
	b.lastRead = opInvalid
108 109 110 111 112 113 114 115 116 117 118 119
	m := b.grow(len(s))
	return copy(b.buf[m:], s), nil
}

// MinRead is the minimum slice size passed to a Read call by
// Buffer.ReadFrom.  As long as the Buffer has at least MinRead bytes beyond
// what is required to hold the contents of r, ReadFrom will not grow the
// underlying buffer.
const MinRead = 512

// ReadFrom reads data from r until EOF and appends it to the buffer.
// The return value n is the number of bytes read.
120
// Any error except io.EOF encountered during the read
121
// is also returned.
122
func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) {
123
	b.lastRead = opInvalid
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
	// If buffer is empty, reset to recover space.
	if b.off >= len(b.buf) {
		b.Truncate(0)
	}
	for {
		if cap(b.buf)-len(b.buf) < MinRead {
			var newBuf []byte
			// can we get space without allocation?
			if b.off+cap(b.buf)-len(b.buf) >= MinRead {
				// reuse beginning of buffer
				newBuf = b.buf[0 : len(b.buf)-b.off]
			} else {
				// not enough space at end; put space on end
				newBuf = make([]byte, len(b.buf)-b.off, 2*(cap(b.buf)-b.off)+MinRead)
			}
			copy(newBuf, b.buf[b.off:])
			b.buf = newBuf
			b.off = 0
		}
		m, e := r.Read(b.buf[len(b.buf):cap(b.buf)])
		b.buf = b.buf[0 : len(b.buf)+m]
		n += int64(m)
146
		if e == io.EOF {
147 148 149 150 151 152 153 154 155 156
			break
		}
		if e != nil {
			return n, e
		}
	}
	return n, nil // err is EOF, so return nil explicitly
}

// WriteTo writes data to w until the buffer is drained or an error
157 158
// occurs. The return value n is the number of bytes written; it always
// fits into an int, but it is int64 to match the io.WriterTo interface.
159
// Any error encountered during the write is also returned.
160
func (b *Buffer) WriteTo(w io.Writer) (n int64, err error) {
161
	b.lastRead = opInvalid
162
	if b.off < len(b.buf) {
163 164
		m, e := w.Write(b.buf[b.off:])
		b.off += m
165
		n = int64(m)
166 167 168
		if e != nil {
			return n, e
		}
169 170
		// otherwise all bytes were written, by definition of
		// Write method in io.Writer
171 172 173 174 175 176 177 178 179
	}
	// Buffer is now empty; reset.
	b.Truncate(0)
	return
}

// WriteByte appends the byte c to the buffer.
// The returned error is always nil, but is included
// to match bufio.Writer's WriteByte.
180
func (b *Buffer) WriteByte(c byte) error {
181
	b.lastRead = opInvalid
182 183 184 185 186 187 188 189 190
	m := b.grow(1)
	b.buf[m] = c
	return nil
}

// WriteRune appends the UTF-8 encoding of Unicode
// code point r to the buffer, returning its length and
// an error, which is always nil but is included
// to match bufio.Writer's WriteRune.
191
func (b *Buffer) WriteRune(r rune) (n int, err error) {
192 193 194 195
	if r < utf8.RuneSelf {
		b.WriteByte(byte(r))
		return 1, nil
	}
196
	n = utf8.EncodeRune(b.runeBytes[0:], r)
197 198 199 200 201 202
	b.Write(b.runeBytes[0:n])
	return n, nil
}

// Read reads the next len(p) bytes from the buffer or until the buffer
// is drained.  The return value n is the number of bytes read.  If the
203
// buffer has no data to return, err is io.EOF even if len(p) is zero;
204
// otherwise it is nil.
205
func (b *Buffer) Read(p []byte) (n int, err error) {
206
	b.lastRead = opInvalid
207 208 209
	if b.off >= len(b.buf) {
		// Buffer is empty, reset to recover space.
		b.Truncate(0)
210
		return 0, io.EOF
211 212 213
	}
	n = copy(p, b.buf[b.off:])
	b.off += n
214 215 216
	if n > 0 {
		b.lastRead = opRead
	}
217 218 219 220 221 222 223 224
	return
}

// Next returns a slice containing the next n bytes from the buffer,
// advancing the buffer as if the bytes had been returned by Read.
// If there are fewer than n bytes in the buffer, Next returns the entire buffer.
// The slice is only valid until the next call to a read or write method.
func (b *Buffer) Next(n int) []byte {
225
	b.lastRead = opInvalid
226 227 228 229 230 231
	m := b.Len()
	if n > m {
		n = m
	}
	data := b.buf[b.off : b.off+n]
	b.off += n
232 233 234
	if n > 0 {
		b.lastRead = opRead
	}
235 236 237 238
	return data
}

// ReadByte reads and returns the next byte from the buffer.
239
// If no byte is available, it returns error io.EOF.
240
func (b *Buffer) ReadByte() (c byte, err error) {
241
	b.lastRead = opInvalid
242 243 244
	if b.off >= len(b.buf) {
		// Buffer is empty, reset to recover space.
		b.Truncate(0)
245
		return 0, io.EOF
246 247 248
	}
	c = b.buf[b.off]
	b.off++
249
	b.lastRead = opRead
250 251 252 253 254
	return c, nil
}

// ReadRune reads and returns the next UTF-8-encoded
// Unicode code point from the buffer.
255
// If no bytes are available, the error returned is io.EOF.
256 257
// If the bytes are an erroneous UTF-8 encoding, it
// consumes one byte and returns U+FFFD, 1.
258
func (b *Buffer) ReadRune() (r rune, size int, err error) {
259
	b.lastRead = opInvalid
260 261 262
	if b.off >= len(b.buf) {
		// Buffer is empty, reset to recover space.
		b.Truncate(0)
263
		return 0, 0, io.EOF
264
	}
265
	b.lastRead = opReadRune
266 267 268
	c := b.buf[b.off]
	if c < utf8.RuneSelf {
		b.off++
269
		return rune(c), 1, nil
270 271 272 273 274 275
	}
	r, n := utf8.DecodeRune(b.buf[b.off:])
	b.off += n
	return r, n, nil
}

276 277 278 279 280
// UnreadRune unreads the last rune returned by ReadRune.
// If the most recent read or write operation on the buffer was
// not a ReadRune, UnreadRune returns an error.  (In this regard
// it is stricter than UnreadByte, which will unread the last byte
// from any read operation.)
281
func (b *Buffer) UnreadRune() error {
282
	if b.lastRead != opReadRune {
283
		return errors.New("bytes.Buffer: UnreadRune: previous operation was not ReadRune")
284 285 286 287 288 289 290 291 292 293 294 295
	}
	b.lastRead = opInvalid
	if b.off > 0 {
		_, n := utf8.DecodeLastRune(b.buf[0:b.off])
		b.off -= n
	}
	return nil
}

// UnreadByte unreads the last byte returned by the most recent
// read operation.  If write has happened since the last read, UnreadByte
// returns an error.
296
func (b *Buffer) UnreadByte() error {
297
	if b.lastRead != opReadRune && b.lastRead != opRead {
298
		return errors.New("bytes.Buffer: UnreadByte: previous operation was not a read")
299 300 301 302 303 304 305 306
	}
	b.lastRead = opInvalid
	if b.off > 0 {
		b.off--
	}
	return nil
}

307 308 309
// ReadBytes reads until the first occurrence of delim in the input,
// returning a slice containing the data up to and including the delimiter.
// If ReadBytes encounters an error before finding a delimiter,
310
// it returns the data read before the error and the error itself (often io.EOF).
311 312
// ReadBytes returns err != nil if and only if the returned data does not end in
// delim.
313
func (b *Buffer) ReadBytes(delim byte) (line []byte, err error) {
314 315 316 317
	i := IndexByte(b.buf[b.off:], delim)
	size := i + 1
	if i < 0 {
		size = len(b.buf) - b.off
318
		err = io.EOF
319 320 321 322 323 324 325 326 327 328
	}
	line = make([]byte, size)
	copy(line, b.buf[b.off:])
	b.off += size
	return
}

// ReadString reads until the first occurrence of delim in the input,
// returning a string containing the data up to and including the delimiter.
// If ReadString encounters an error before finding a delimiter,
329
// it returns the data read before the error and the error itself (often io.EOF).
330 331
// ReadString returns err != nil if and only if the returned data does not end
// in delim.
332
func (b *Buffer) ReadString(delim byte) (line string, err error) {
333 334 335 336
	bytes, err := b.ReadBytes(delim)
	return string(bytes), err
}

337 338
// NewBuffer creates and initializes a new Buffer using buf as its initial
// contents.  It is intended to prepare a Buffer to read existing data.  It
339
// can also be used to size the internal buffer for writing. To do that,
340
// buf should have the desired capacity but a length of zero.
341 342 343 344 345
//
// In most cases, new(Buffer) (or just declaring a Buffer variable) is
// preferable to NewBuffer.  In particular, passing a non-empty buf to
// NewBuffer and then writing to the Buffer will overwrite buf, not append to
// it.
346 347 348 349
func NewBuffer(buf []byte) *Buffer { return &Buffer{buf: buf} }

// NewBufferString creates and initializes a new Buffer using string s as its
// initial contents.  It is intended to prepare a buffer to read an existing
350
// string.  See the warnings about NewBuffer; similar issues apply here.
351 352 353
func NewBufferString(s string) *Buffer {
	return &Buffer{buf: []byte(s)}
}