blob: c13456a6326b78ec9c3200d932cba7808d551578 [file] [log] [blame]
Russ Cox7c9e2c22008-09-12 16:42:53 -07001// 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
Rob Pike01712ae2009-05-08 11:52:39 -07005// This package implements buffered I/O. It wraps an io.Reader or io.Writer
6// object, creating another object (Reader or Writer) that also implements
Rob Pike5dd4ef52009-03-07 16:57:01 -08007// the interface but provides buffering and some help for textual I/O.
Russ Cox7c9e2c22008-09-12 16:42:53 -07008package bufio
Russ Cox387df5e2008-11-24 14:51:33 -08009
10import (
Robert Griesemer5a1d3322009-12-15 15:33:31 -080011 "bytes"
12 "io"
13 "os"
14 "strconv"
15 "utf8"
Russ Cox387df5e2008-11-24 14:51:33 -080016)
Russ Cox7c9e2c22008-09-12 16:42:53 -070017
18
Russ Cox7c9e2c22008-09-12 16:42:53 -070019const (
Robert Griesemer5a1d3322009-12-15 15:33:31 -080020 defaultBufSize = 4096
Russ Cox7c9e2c22008-09-12 16:42:53 -070021)
22
Rob Pike5dd4ef52009-03-07 16:57:01 -080023// Errors introduced by this package.
Russ Cox1b301ba2009-05-08 14:40:20 -070024type Error struct {
Robert Griesemer5a1d3322009-12-15 15:33:31 -080025 os.ErrorString
Russ Cox1b301ba2009-05-08 14:40:20 -070026}
27
Russ Cox839a6842009-01-20 14:40:40 -080028var (
Robert Griesemer5a1d3322009-12-15 15:33:31 -080029 ErrInvalidUnreadByte os.Error = &Error{"bufio: invalid use of UnreadByte"}
Rob Pikeacb695f2010-09-12 17:40:27 +100030 ErrInvalidUnreadRune os.Error = &Error{"bufio: invalid use of UnreadRune"}
Robert Griesemer5a1d3322009-12-15 15:33:31 -080031 ErrBufferFull os.Error = &Error{"bufio: buffer full"}
Nigel Tao27e24902010-08-04 09:44:02 +100032 ErrNegativeCount os.Error = &Error{"bufio: negative count"}
Robert Griesemer5a1d3322009-12-15 15:33:31 -080033 errInternal os.Error = &Error{"bufio: internal error"}
Russ Cox7c9e2c22008-09-12 16:42:53 -070034)
35
Russ Coxa0bcaf42009-06-25 20:24:55 -070036// BufSizeError is the error representing an invalid buffer size.
37type BufSizeError int
Russ Cox094f1d52009-10-08 15:14:54 -070038
Russ Coxa0bcaf42009-06-25 20:24:55 -070039func (b BufSizeError) String() string {
Robert Griesemer40621d52009-11-09 12:07:39 -080040 return "bufio: bad buffer size " + strconv.Itoa(int(b))
Russ Coxa0bcaf42009-06-25 20:24:55 -070041}
42
Russ Cox7c9e2c22008-09-12 16:42:53 -070043
44// Buffered input.
45
Rob Pike01712ae2009-05-08 11:52:39 -070046// Reader implements buffering for an io.Reader object.
47type Reader struct {
Rob Pikeacb695f2010-09-12 17:40:27 +100048 buf []byte
49 rd io.Reader
50 r, w int
51 err os.Error
52 lastByte int
53 lastRuneSize int
Russ Cox7c9e2c22008-09-12 16:42:53 -070054}
55
Rob Pike01712ae2009-05-08 11:52:39 -070056// NewReaderSize creates a new Reader whose buffer has the specified size,
Rob Pikec8b47c62009-05-08 11:22:57 -070057// which must be greater than zero. If the argument io.Reader is already a
Rob Pike01712ae2009-05-08 11:52:39 -070058// Reader with large enough size, it returns the underlying Reader.
59// It returns the Reader and any error.
60func NewReaderSize(rd io.Reader, size int) (*Reader, os.Error) {
Russ Cox7c9e2c22008-09-12 16:42:53 -070061 if size <= 0 {
Robert Griesemer40621d52009-11-09 12:07:39 -080062 return nil, BufSizeError(size)
Russ Cox7c9e2c22008-09-12 16:42:53 -070063 }
Rob Pike01712ae2009-05-08 11:52:39 -070064 // Is it already a Reader?
Robert Griesemer5a1d3322009-12-15 15:33:31 -080065 b, ok := rd.(*Reader)
Rob Pikeee196952009-04-06 21:42:14 -070066 if ok && len(b.buf) >= size {
Robert Griesemer40621d52009-11-09 12:07:39 -080067 return b, nil
Rob Pikeee196952009-04-06 21:42:14 -070068 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -080069 b = new(Reader)
70 b.buf = make([]byte, size)
71 b.rd = rd
Rob Pikeacb695f2010-09-12 17:40:27 +100072 b.lastByte = -1
73 b.lastRuneSize = -1
Robert Griesemer5a1d3322009-12-15 15:33:31 -080074 return b, nil
Russ Cox7c9e2c22008-09-12 16:42:53 -070075}
76
Rob Pike01712ae2009-05-08 11:52:39 -070077// NewReader returns a new Reader whose buffer has the default size.
78func NewReader(rd io.Reader) *Reader {
Robert Griesemer5a1d3322009-12-15 15:33:31 -080079 b, err := NewReaderSize(rd, defaultBufSize)
Russ Cox9aa28f92009-02-03 14:16:22 -080080 if err != nil {
81 // cannot happen - defaultBufSize is a valid size
Russ Cox00f9f0c2010-03-30 10:34:57 -070082 panic(err)
Russ Cox9aa28f92009-02-03 14:16:22 -080083 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -080084 return b
Russ Cox7c9e2c22008-09-12 16:42:53 -070085}
86
Russ Cox29415d02009-08-26 16:23:34 -070087// fill reads a new chunk into the buffer.
88func (b *Reader) fill() {
Russ Cox7c9e2c22008-09-12 16:42:53 -070089 // Slide existing data to beginning.
Nigel Tao27e24902010-08-04 09:44:02 +100090 if b.r > 0 {
91 copy(b.buf, b.buf[b.r:b.w])
Robert Griesemer5a1d3322009-12-15 15:33:31 -080092 b.w -= b.r
Nigel Tao27e24902010-08-04 09:44:02 +100093 b.r = 0
Russ Cox7c9e2c22008-09-12 16:42:53 -070094 }
Russ Cox7c9e2c22008-09-12 16:42:53 -070095
96 // Read new data.
Robert Griesemer5a1d3322009-12-15 15:33:31 -080097 n, e := b.rd.Read(b.buf[b.w:])
98 b.w += n
Russ Cox7c9e2c22008-09-12 16:42:53 -070099 if e != nil {
Robert Griesemer40621d52009-11-09 12:07:39 -0800100 b.err = e
Russ Cox7c9e2c22008-09-12 16:42:53 -0700101 }
Russ Cox7c9e2c22008-09-12 16:42:53 -0700102}
103
Nigel Tao27e24902010-08-04 09:44:02 +1000104// Peek returns the next n bytes without advancing the reader. The bytes stop
105// being valid at the next read call. If Peek returns fewer than n bytes, it
106// also returns an error explaining why the read is short. The error is
107// ErrBufferFull if n is larger than b's buffer size.
108func (b *Reader) Peek(n int) ([]byte, os.Error) {
109 if n < 0 {
110 return nil, ErrNegativeCount
111 }
112 if n > len(b.buf) {
113 return nil, ErrBufferFull
114 }
115 for b.w-b.r < n && b.err == nil {
116 b.fill()
117 }
118 m := b.w - b.r
119 if m > n {
120 m = n
121 }
122 err := b.err
123 if m < n && err == nil {
124 err = ErrBufferFull
125 }
126 return b.buf[b.r : b.r+m], err
127}
128
Russ Coxca2fe5d2009-05-22 22:43:57 -0700129// Read reads data into p.
130// It returns the number of bytes read into p.
Roger Peppe24a78a02010-12-07 14:54:15 -0500131// It calls Read at most once on the underlying Reader,
132// hence n may be less than len(p).
133// At EOF, the count will be zero and err will be os.EOF.
134func (b *Reader) Read(p []byte) (n int, err os.Error) {
135 n = len(p)
136 if n == 0 {
137 return 0, b.err
Russ Cox7c9e2c22008-09-12 16:42:53 -0700138 }
Roger Peppe24a78a02010-12-07 14:54:15 -0500139 if b.w == b.r {
140 if b.err != nil {
141 return 0, b.err
142 }
143 if len(p) >= len(b.buf) {
144 // Large read, empty buffer.
145 // Read directly into p to avoid copy.
146 n, b.err = b.rd.Read(p)
147 if n > 0 {
148 b.lastByte = int(p[n-1])
149 b.lastRuneSize = -1
150 }
Roger Peppe24a78a02010-12-07 14:54:15 -0500151 return n, b.err
152 }
153 b.fill()
154 if b.w == b.r {
155 return 0, b.err
156 }
157 }
158
159 if n > b.w-b.r {
160 n = b.w - b.r
161 }
162 copy(p[0:n], b.buf[b.r:])
Roger Peppe24a78a02010-12-07 14:54:15 -0500163 b.r += n
164 b.lastByte = int(b.buf[b.r-1])
165 b.lastRuneSize = -1
166 return n, nil
Russ Cox7c9e2c22008-09-12 16:42:53 -0700167}
168
Rob Pike5dd4ef52009-03-07 16:57:01 -0800169// ReadByte reads and returns a single byte.
170// If no byte is available, returns an error.
Rob Pike01712ae2009-05-08 11:52:39 -0700171func (b *Reader) ReadByte() (c byte, err os.Error) {
Rob Pikeacb695f2010-09-12 17:40:27 +1000172 b.lastRuneSize = -1
Russ Cox29415d02009-08-26 16:23:34 -0700173 for b.w == b.r {
Russ Cox7c9e2c22008-09-12 16:42:53 -0700174 if b.err != nil {
Robert Griesemer40621d52009-11-09 12:07:39 -0800175 return 0, b.err
Russ Cox7c9e2c22008-09-12 16:42:53 -0700176 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800177 b.fill()
Russ Cox7c9e2c22008-09-12 16:42:53 -0700178 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800179 c = b.buf[b.r]
180 b.r++
Rob Pikeacb695f2010-09-12 17:40:27 +1000181 b.lastByte = int(c)
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800182 return c, nil
Russ Cox7c9e2c22008-09-12 16:42:53 -0700183}
184
Russ Coxa0bcaf42009-06-25 20:24:55 -0700185// UnreadByte unreads the last byte. Only the most recently read byte can be unread.
Rob Pike01712ae2009-05-08 11:52:39 -0700186func (b *Reader) UnreadByte() os.Error {
Rob Pikeacb695f2010-09-12 17:40:27 +1000187 b.lastRuneSize = -1
188 if b.r == b.w && b.lastByte >= 0 {
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800189 b.w = 1
190 b.r = 0
Rob Pikeacb695f2010-09-12 17:40:27 +1000191 b.buf[0] = byte(b.lastByte)
192 b.lastByte = -1
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800193 return nil
Russ Cox9aa28f92009-02-03 14:16:22 -0800194 }
Russ Cox7c9e2c22008-09-12 16:42:53 -0700195 if b.r <= 0 {
Robert Griesemer40621d52009-11-09 12:07:39 -0800196 return ErrInvalidUnreadByte
Russ Cox7c9e2c22008-09-12 16:42:53 -0700197 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800198 b.r--
Rob Pikeacb695f2010-09-12 17:40:27 +1000199 b.lastByte = -1
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800200 return nil
Russ Cox7c9e2c22008-09-12 16:42:53 -0700201}
202
Rob Pike5dd4ef52009-03-07 16:57:01 -0800203// ReadRune reads a single UTF-8 encoded Unicode character and returns the
204// rune and its size in bytes.
Rob Pike01712ae2009-05-08 11:52:39 -0700205func (b *Reader) ReadRune() (rune int, size int, err os.Error) {
Robert Griesemer16989342009-11-09 21:09:34 -0800206 for b.r+utf8.UTFMax > b.w && !utf8.FullRune(b.buf[b.r:b.w]) && b.err == nil {
Robert Griesemer40621d52009-11-09 12:07:39 -0800207 b.fill()
Russ Cox29415d02009-08-26 16:23:34 -0700208 }
Rob Pikee4393452010-09-24 12:28:14 +1000209 b.lastRuneSize = -1
Russ Cox29415d02009-08-26 16:23:34 -0700210 if b.r == b.w {
Robert Griesemer40621d52009-11-09 12:07:39 -0800211 return 0, 0, b.err
Russ Cox387df5e2008-11-24 14:51:33 -0800212 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800213 rune, size = int(b.buf[b.r]), 1
Russ Cox387df5e2008-11-24 14:51:33 -0800214 if rune >= 0x80 {
Robert Griesemer16989342009-11-09 21:09:34 -0800215 rune, size = utf8.DecodeRune(b.buf[b.r:b.w])
Russ Cox387df5e2008-11-24 14:51:33 -0800216 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800217 b.r += size
Rob Pikeacb695f2010-09-12 17:40:27 +1000218 b.lastByte = int(b.buf[b.r-1])
219 b.lastRuneSize = size
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800220 return rune, size, nil
Russ Cox387df5e2008-11-24 14:51:33 -0800221}
222
Rob Pikeacb695f2010-09-12 17:40:27 +1000223// UnreadRune unreads the last rune. If the most recent read operation on
224// the buffer was not a ReadRune, UnreadRune returns an error. (In this
225// regard it is stricter than UnreadByte, which will unread the last byte
226// from any read operation.)
227func (b *Reader) UnreadRune() os.Error {
Rob Pike52e3c992010-10-13 17:12:43 -0700228 if b.lastRuneSize < 0 || b.r == 0 {
Rob Pikeacb695f2010-09-12 17:40:27 +1000229 return ErrInvalidUnreadRune
230 }
231 b.r -= b.lastRuneSize
232 b.lastByte = -1
233 b.lastRuneSize = -1
234 return nil
235}
236
Rob Pike5dd4ef52009-03-07 16:57:01 -0800237// Buffered returns the number of bytes that can be read from the current buffer.
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800238func (b *Reader) Buffered() int { return b.w - b.r }
Russ Cox7c9e2c22008-09-12 16:42:53 -0700239
Russ Cox4b409282009-08-27 11:20:15 -0700240// ReadSlice reads until the first occurrence of delim in the input,
Russ Cox7c9e2c22008-09-12 16:42:53 -0700241// returning a slice pointing at the bytes in the buffer.
242// The bytes stop being valid at the next read call.
Russ Cox4b409282009-08-27 11:20:15 -0700243// If ReadSlice encounters an error before finding a delimiter,
244// it returns all the data in the buffer and the error itself (often os.EOF).
245// ReadSlice fails with error ErrBufferFull if the buffer fills without a delim.
246// Because the data returned from ReadSlice will be overwritten
247// by the next I/O operation, most clients should use
248// ReadBytes or ReadString instead.
249// ReadSlice returns err != nil if and only if line does not end in delim.
250func (b *Reader) ReadSlice(delim byte) (line []byte, err os.Error) {
Russ Cox7c9e2c22008-09-12 16:42:53 -0700251 // Look in buffer.
Rob Pike02df7db2009-11-18 19:58:32 -0800252 if i := bytes.IndexByte(b.buf[b.r:b.w], delim); i >= 0 {
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800253 line1 := b.buf[b.r : b.r+i+1]
254 b.r += i + 1
255 return line1, nil
Russ Cox7c9e2c22008-09-12 16:42:53 -0700256 }
Russ Cox983f06b2008-10-07 12:31:31 -0700257
Russ Cox7c9e2c22008-09-12 16:42:53 -0700258 // Read more into buffer, until buffer fills or we find delim.
259 for {
Russ Cox7c9e2c22008-09-12 16:42:53 -0700260 if b.err != nil {
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800261 line := b.buf[b.r:b.w]
262 b.r = b.w
263 return line, b.err
Russ Cox7c9e2c22008-09-12 16:42:53 -0700264 }
Russ Cox983f06b2008-10-07 12:31:31 -0700265
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800266 n := b.Buffered()
267 b.fill()
Russ Cox29415d02009-08-26 16:23:34 -0700268
Russ Cox7c9e2c22008-09-12 16:42:53 -0700269 // Search new part of buffer
Rob Pike02df7db2009-11-18 19:58:32 -0800270 if i := bytes.IndexByte(b.buf[n:b.w], delim); i >= 0 {
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800271 line := b.buf[0 : n+i+1]
272 b.r = n + i + 1
273 return line, nil
Russ Cox7c9e2c22008-09-12 16:42:53 -0700274 }
Russ Cox983f06b2008-10-07 12:31:31 -0700275
Russ Cox7c9e2c22008-09-12 16:42:53 -0700276 // Buffer is full?
277 if b.Buffered() >= len(b.buf) {
Russ Cox041d9782010-06-02 16:17:18 -0700278 b.r = b.w
279 return b.buf, ErrBufferFull
Russ Cox7c9e2c22008-09-12 16:42:53 -0700280 }
281 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800282 panic("not reached")
Russ Cox7c9e2c22008-09-12 16:42:53 -0700283}
284
Russ Cox4b409282009-08-27 11:20:15 -0700285// ReadBytes reads until the first occurrence of delim in the input,
Stephen Ma5043f0a2010-10-06 19:39:30 +1100286// returning a slice containing the data up to and including the delimiter.
Russ Cox4b409282009-08-27 11:20:15 -0700287// If ReadBytes encounters an error before finding a delimiter,
288// it returns the data read before the error and the error itself (often os.EOF).
289// ReadBytes returns err != nil if and only if line does not end in delim.
290func (b *Reader) ReadBytes(delim byte) (line []byte, err os.Error) {
291 // Use ReadSlice to look for array,
Russ Cox7c9e2c22008-09-12 16:42:53 -0700292 // accumulating full buffers.
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800293 var frag []byte
294 var full [][]byte
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800295 err = nil
Russ Cox7c9e2c22008-09-12 16:42:53 -0700296
297 for {
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800298 var e os.Error
299 frag, e = b.ReadSlice(delim)
300 if e == nil { // got final fragment
Robert Griesemer40621d52009-11-09 12:07:39 -0800301 break
Russ Cox7c9e2c22008-09-12 16:42:53 -0700302 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800303 if e != ErrBufferFull { // unexpected error
304 err = e
305 break
Russ Cox7c9e2c22008-09-12 16:42:53 -0700306 }
Russ Cox983f06b2008-10-07 12:31:31 -0700307
Russ Cox041d9782010-06-02 16:17:18 -0700308 // Make a copy of the buffer.
309 buf := make([]byte, len(frag))
310 copy(buf, frag)
Russ Cox69c4e932010-10-27 19:47:23 -0700311 full = append(full, buf)
Russ Cox7c9e2c22008-09-12 16:42:53 -0700312 }
Russ Cox983f06b2008-10-07 12:31:31 -0700313
Russ Cox7c9e2c22008-09-12 16:42:53 -0700314 // Allocate new buffer to hold the full pieces and the fragment.
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800315 n := 0
Russ Cox69c4e932010-10-27 19:47:23 -0700316 for i := range full {
Robert Griesemer40621d52009-11-09 12:07:39 -0800317 n += len(full[i])
Russ Cox7c9e2c22008-09-12 16:42:53 -0700318 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800319 n += len(frag)
Russ Cox7c9e2c22008-09-12 16:42:53 -0700320
321 // Copy full pieces and fragment in.
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800322 buf := make([]byte, n)
323 n = 0
Russ Cox69c4e932010-10-27 19:47:23 -0700324 for i := range full {
325 n += copy(buf[n:], full[i])
Russ Cox7c9e2c22008-09-12 16:42:53 -0700326 }
Nigel Tao27e24902010-08-04 09:44:02 +1000327 copy(buf[n:], frag)
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800328 return buf, err
Russ Cox7c9e2c22008-09-12 16:42:53 -0700329}
330
Russ Cox4b409282009-08-27 11:20:15 -0700331// ReadString reads until the first occurrence of delim in the input,
332// returning a string containing the data up to and including the delimiter.
333// If ReadString encounters an error before finding a delimiter,
334// it returns the data read before the error and the error itself (often os.EOF).
335// ReadString returns err != nil if and only if line does not end in delim.
336func (b *Reader) ReadString(delim byte) (line string, err os.Error) {
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800337 bytes, e := b.ReadBytes(delim)
338 return string(bytes), e
Russ Cox7c9e2c22008-09-12 16:42:53 -0700339}
340
341
342// buffered output
343
Rob Pike01712ae2009-05-08 11:52:39 -0700344// Writer implements buffering for an io.Writer object.
345type Writer struct {
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800346 err os.Error
347 buf []byte
348 n int
349 wr io.Writer
Russ Cox7c9e2c22008-09-12 16:42:53 -0700350}
351
Rob Pike01712ae2009-05-08 11:52:39 -0700352// NewWriterSize creates a new Writer whose buffer has the specified size,
Rob Pikec8b47c62009-05-08 11:22:57 -0700353// which must be greater than zero. If the argument io.Writer is already a
Rob Pike01712ae2009-05-08 11:52:39 -0700354// Writer with large enough size, it returns the underlying Writer.
355// It returns the Writer and any error.
356func NewWriterSize(wr io.Writer, size int) (*Writer, os.Error) {
Russ Cox7c9e2c22008-09-12 16:42:53 -0700357 if size <= 0 {
Robert Griesemer40621d52009-11-09 12:07:39 -0800358 return nil, BufSizeError(size)
Russ Cox7c9e2c22008-09-12 16:42:53 -0700359 }
Rob Pike01712ae2009-05-08 11:52:39 -0700360 // Is it already a Writer?
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800361 b, ok := wr.(*Writer)
Rob Pikeee196952009-04-06 21:42:14 -0700362 if ok && len(b.buf) >= size {
Robert Griesemer40621d52009-11-09 12:07:39 -0800363 return b, nil
Rob Pikeee196952009-04-06 21:42:14 -0700364 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800365 b = new(Writer)
366 b.buf = make([]byte, size)
367 b.wr = wr
368 return b, nil
Russ Cox7c9e2c22008-09-12 16:42:53 -0700369}
370
Rob Pike01712ae2009-05-08 11:52:39 -0700371// NewWriter returns a new Writer whose buffer has the default size.
372func NewWriter(wr io.Writer) *Writer {
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800373 b, err := NewWriterSize(wr, defaultBufSize)
Russ Cox9aa28f92009-02-03 14:16:22 -0800374 if err != nil {
375 // cannot happen - defaultBufSize is valid size
Russ Cox00f9f0c2010-03-30 10:34:57 -0700376 panic(err)
Russ Cox9aa28f92009-02-03 14:16:22 -0800377 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800378 return b
Russ Cox7c9e2c22008-09-12 16:42:53 -0700379}
380
Rob Pikec8b47c62009-05-08 11:22:57 -0700381// Flush writes any buffered data to the underlying io.Writer.
Rob Pike01712ae2009-05-08 11:52:39 -0700382func (b *Writer) Flush() os.Error {
Russ Cox7c9e2c22008-09-12 16:42:53 -0700383 if b.err != nil {
Robert Griesemer40621d52009-11-09 12:07:39 -0800384 return b.err
Russ Cox7c9e2c22008-09-12 16:42:53 -0700385 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800386 n, e := b.wr.Write(b.buf[0:b.n])
Russ Coxbe869ba2009-05-18 13:31:56 -0700387 if n < b.n && e == nil {
Robert Griesemer40621d52009-11-09 12:07:39 -0800388 e = io.ErrShortWrite
Russ Coxbe869ba2009-05-18 13:31:56 -0700389 }
390 if e != nil {
391 if n > 0 && n < b.n {
Russ Cox132c42f2009-12-08 18:19:48 -0800392 copy(b.buf[0:b.n-n], b.buf[n:b.n])
Russ Cox7c9e2c22008-09-12 16:42:53 -0700393 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800394 b.n -= n
395 b.err = e
396 return e
Russ Cox7c9e2c22008-09-12 16:42:53 -0700397 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800398 b.n = 0
399 return nil
Russ Cox7c9e2c22008-09-12 16:42:53 -0700400}
401
Rob Pike5dd4ef52009-03-07 16:57:01 -0800402// Available returns how many bytes are unused in the buffer.
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800403func (b *Writer) Available() int { return len(b.buf) - b.n }
Russ Cox7c9e2c22008-09-12 16:42:53 -0700404
Rob Pike5dd4ef52009-03-07 16:57:01 -0800405// Buffered returns the number of bytes that have been written into the current buffer.
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800406func (b *Writer) Buffered() int { return b.n }
Russ Cox7c9e2c22008-09-12 16:42:53 -0700407
Rob Pike5dd4ef52009-03-07 16:57:01 -0800408// Write writes the contents of p into the buffer.
409// It returns the number of bytes written.
Rob Pike11b459c2010-01-16 13:06:50 +1100410// If nn < len(p), it also returns an error explaining
Rob Pike5dd4ef52009-03-07 16:57:01 -0800411// why the write is short.
Rob Pike01712ae2009-05-08 11:52:39 -0700412func (b *Writer) Write(p []byte) (nn int, err os.Error) {
Russ Cox7c9e2c22008-09-12 16:42:53 -0700413 if b.err != nil {
Robert Griesemer40621d52009-11-09 12:07:39 -0800414 return 0, b.err
Russ Cox7c9e2c22008-09-12 16:42:53 -0700415 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800416 nn = 0
Russ Cox7c9e2c22008-09-12 16:42:53 -0700417 for len(p) > 0 {
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800418 n := b.Available()
Russ Cox7c9e2c22008-09-12 16:42:53 -0700419 if n <= 0 {
420 if b.Flush(); b.err != nil {
Robert Griesemer40621d52009-11-09 12:07:39 -0800421 break
Russ Cox7c9e2c22008-09-12 16:42:53 -0700422 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800423 n = b.Available()
Russ Cox7c9e2c22008-09-12 16:42:53 -0700424 }
Andrew Gerrand4501e182010-07-27 17:22:45 +1000425 if b.Buffered() == 0 && len(p) >= len(b.buf) {
Russ Cox9aa28f92009-02-03 14:16:22 -0800426 // Large write, empty buffer.
427 // Write directly from p to avoid copy.
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800428 n, b.err = b.wr.Write(p)
429 nn += n
430 p = p[n:]
Russ Cox9aa28f92009-02-03 14:16:22 -0800431 if b.err != nil {
Robert Griesemer40621d52009-11-09 12:07:39 -0800432 break
Russ Cox9aa28f92009-02-03 14:16:22 -0800433 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800434 continue
Russ Cox9aa28f92009-02-03 14:16:22 -0800435 }
Russ Cox7c9e2c22008-09-12 16:42:53 -0700436 if n > len(p) {
Robert Griesemer40621d52009-11-09 12:07:39 -0800437 n = len(p)
Russ Cox7c9e2c22008-09-12 16:42:53 -0700438 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800439 copy(b.buf[b.n:b.n+n], p[0:n])
440 b.n += n
441 nn += n
442 p = p[n:]
Russ Cox7c9e2c22008-09-12 16:42:53 -0700443 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800444 return nn, b.err
Russ Cox7c9e2c22008-09-12 16:42:53 -0700445}
446
Rob Pike5dd4ef52009-03-07 16:57:01 -0800447// WriteByte writes a single byte.
Rob Pike01712ae2009-05-08 11:52:39 -0700448func (b *Writer) WriteByte(c byte) os.Error {
Russ Cox7c9e2c22008-09-12 16:42:53 -0700449 if b.err != nil {
Robert Griesemer40621d52009-11-09 12:07:39 -0800450 return b.err
Russ Cox7c9e2c22008-09-12 16:42:53 -0700451 }
452 if b.Available() <= 0 && b.Flush() != nil {
Robert Griesemer40621d52009-11-09 12:07:39 -0800453 return b.err
Russ Cox7c9e2c22008-09-12 16:42:53 -0700454 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800455 b.buf[b.n] = c
456 b.n++
457 return nil
Russ Cox7c9e2c22008-09-12 16:42:53 -0700458}
459
Rob Pike8c9944d2010-03-05 14:03:17 -0800460// WriteRune writes a single Unicode code point, returning
461// the number of bytes written and any error.
462func (b *Writer) WriteRune(rune int) (size int, err os.Error) {
463 if rune < utf8.RuneSelf {
464 err = b.WriteByte(byte(rune))
465 if err != nil {
466 return 0, err
467 }
468 return 1, nil
469 }
470 if b.err != nil {
471 return 0, b.err
472 }
473 n := b.Available()
474 if n < utf8.UTFMax {
475 if b.Flush(); b.err != nil {
476 return 0, b.err
477 }
478 n = b.Available()
479 if n < utf8.UTFMax {
480 // Can only happen if buffer is silly small.
481 return b.WriteString(string(rune))
482 }
483 }
Adam Langley3cb4bdb2010-11-30 16:59:43 -0500484 size = utf8.EncodeRune(b.buf[b.n:], rune)
Rob Pike8c9944d2010-03-05 14:03:17 -0800485 b.n += size
486 return size, nil
487}
488
Rob Pike2495c142009-08-03 18:28:05 -0700489// WriteString writes a string.
Rob Pike11b459c2010-01-16 13:06:50 +1100490// It returns the number of bytes written.
491// If the count is less than len(s), it also returns an error explaining
492// why the write is short.
493func (b *Writer) WriteString(s string) (int, os.Error) {
Rob Pike2495c142009-08-03 18:28:05 -0700494 if b.err != nil {
Rob Pike11b459c2010-01-16 13:06:50 +1100495 return 0, b.err
Rob Pike2495c142009-08-03 18:28:05 -0700496 }
497 // Common case, worth making fast.
498 if b.Available() >= len(s) || len(b.buf) >= len(s) && b.Flush() == nil {
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800499 for i := 0; i < len(s); i++ { // loop over bytes, not runes.
500 b.buf[b.n] = s[i]
501 b.n++
Rob Pike2495c142009-08-03 18:28:05 -0700502 }
Rob Pike11b459c2010-01-16 13:06:50 +1100503 return len(s), nil
Rob Pike2495c142009-08-03 18:28:05 -0700504 }
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800505 for i := 0; i < len(s); i++ { // loop over bytes, not runes.
Robert Griesemer40621d52009-11-09 12:07:39 -0800506 b.WriteByte(s[i])
Rob Pike11b459c2010-01-16 13:06:50 +1100507 if b.err != nil {
508 return i, b.err
509 }
Rob Pike2495c142009-08-03 18:28:05 -0700510 }
Rob Pike11b459c2010-01-16 13:06:50 +1100511 return len(s), nil
Rob Pike2495c142009-08-03 18:28:05 -0700512}
513
Russ Cox9aa28f92009-02-03 14:16:22 -0800514// buffered input and output
515
Russ Coxbe869ba2009-05-18 13:31:56 -0700516// ReadWriter stores pointers to a Reader and a Writer.
Rob Pikec8b47c62009-05-08 11:22:57 -0700517// It implements io.ReadWriter.
Rob Pike01712ae2009-05-08 11:52:39 -0700518type ReadWriter struct {
Robert Griesemer5a1d3322009-12-15 15:33:31 -0800519 *Reader
520 *Writer
Russ Cox9aa28f92009-02-03 14:16:22 -0800521}
522
Russ Coxbe869ba2009-05-18 13:31:56 -0700523// NewReadWriter allocates a new ReadWriter that dispatches to r and w.
Rob Pike01712ae2009-05-08 11:52:39 -0700524func NewReadWriter(r *Reader, w *Writer) *ReadWriter {
Robert Griesemer40621d52009-11-09 12:07:39 -0800525 return &ReadWriter{r, w}
Russ Cox9aa28f92009-02-03 14:16:22 -0800526}