// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// This package implements buffered I/O. It wraps an io.Read or io.Write
-// object, creating another object (BufRead or BufWrite) that also implements
+// This package 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
// TODO:
// - maybe define an interface
-// - BufRead: ReadRune, UnreadRune ?
+// - Reader: ReadRune, UnreadRune ?
// could make ReadRune generic if we dropped UnreadRune
// - buffered output
-// - would like to rename to Read, Write, but breaks
-// embedding of these: would lose the Read, Write methods.
const (
defaultBufSize = 4096
// Buffered input.
-// BufRead implements buffering for an io.Read object.
-type BufRead struct {
+// Reader implements buffering for an io.Reader object.
+type Reader struct {
buf []byte;
rd io.Reader;
r, w int;
lastbyte int;
}
-// NewBufReadSize creates a new BufRead whose buffer has the specified size,
+// NewReaderSize creates a new Reader whose buffer has the specified size,
// which must be greater than zero. If the argument io.Reader is already a
-// BufRead with large enough size, it returns the underlying BufRead.
-// It returns the BufRead and any error.
-func NewBufReadSize(rd io.Reader, size int) (*BufRead, os.Error) {
+// Reader with large enough size, it returns the underlying Reader.
+// It returns the Reader and any error.
+func NewReaderSize(rd io.Reader, size int) (*Reader, os.Error) {
if size <= 0 {
return nil, BadBufSize
}
- // Is it already a BufRead?
- b, ok := rd.(*BufRead);
+ // Is it already a Reader?
+ b, ok := rd.(*Reader);
if ok && len(b.buf) >= size {
return b, nil
}
- b = new(BufRead);
+ b = new(Reader);
b.buf = make([]byte, size);
b.rd = rd;
b.lastbyte = -1;
return b, nil
}
-// NewBufRead returns a new BufRead whose buffer has the default size.
-func NewBufRead(rd io.Reader) *BufRead {
- b, err := NewBufReadSize(rd, defaultBufSize);
+// NewReader returns a new Reader whose buffer has the default size.
+func NewReader(rd io.Reader) *Reader {
+ b, err := NewReaderSize(rd, defaultBufSize);
if err != nil {
// cannot happen - defaultBufSize is a valid size
- panic("bufio: NewBufRead: ", err.String());
+ panic("bufio: NewReader: ", err.String());
}
return b;
}
//.fill reads a new chunk into the buffer.
-func (b *BufRead) fill() os.Error {
+func (b *Reader) fill() os.Error {
if b.err != nil {
return b.err
}
// If nn < len(p), also returns an error explaining
// why the read is short. At EOF, the count will be
// zero and err will be io.ErrEOF.
-func (b *BufRead) Read(p []byte) (nn int, err os.Error) {
+func (b *Reader) Read(p []byte) (nn int, err os.Error) {
nn = 0;
for len(p) > 0 {
n := len(p);
// ReadByte reads and returns a single byte.
// If no byte is available, returns an error.
-func (b *BufRead) ReadByte() (c byte, err os.Error) {
+func (b *Reader) ReadByte() (c byte, err os.Error) {
if b.w == b.r {
b.fill();
if b.err != nil {
}
// UnreadByte unreads the last byte. Only one byte may be unread at a given time.
-func (b *BufRead) UnreadByte() os.Error {
+func (b *Reader) UnreadByte() os.Error {
if b.err != nil {
return b.err
}
// ReadRune reads a single UTF-8 encoded Unicode character and returns the
// rune and its size in bytes.
-func (b *BufRead) ReadRune() (rune int, size int, err os.Error) {
+func (b *Reader) ReadRune() (rune int, size int, err os.Error) {
for b.r + utf8.UTFMax > b.w && !utf8.FullRune(b.buf[b.r:b.w]) {
n := b.w - b.r;
b.fill();
}
// Buffered returns the number of bytes that can be read from the current buffer.
-func (b *BufRead) Buffered() int {
+func (b *Reader) Buffered() int {
return b.w - b.r;
}
// Fails if the line doesn't fit in the buffer.
// For internal or advanced use only; most uses should
// call ReadLineString or ReadLineBytes instead.
-func (b *BufRead) ReadLineSlice(delim byte) (line []byte, err os.Error) {
+func (b *Reader) ReadLineSlice(delim byte) (line []byte, err os.Error) {
if b.err != nil {
return nil, b.err
}
// If an error happens, returns the data (without a delimiter)
// and the error. (It can't leave the data in the buffer because
// it might have read more than the buffer size.)
-func (b *BufRead) ReadLineBytes(delim byte) (line []byte, err os.Error) {
+func (b *Reader) ReadLineBytes(delim byte) (line []byte, err os.Error) {
if b.err != nil {
return nil, b.err
}
// ReadLineString reads until the first occurrence of delim in the input,
// returning a new string containing the line.
// If savedelim, keep delim in the result; otherwise drop it.
-func (b *BufRead) ReadLineString(delim byte, savedelim bool) (line string, err os.Error) {
+func (b *Reader) ReadLineString(delim byte, savedelim bool) (line string, err os.Error) {
bytes, e := b.ReadLineBytes(delim);
if e != nil {
return string(bytes), e
// buffered output
-// BufWrite implements buffering for an io.Writer object.
-type BufWrite struct {
+// Writer implements buffering for an io.Writer object.
+type Writer struct {
err os.Error;
buf []byte;
n int;
wr io.Writer;
}
-// NewBufWriteSize creates a new BufWrite whose buffer has the specified size,
+// NewWriterSize creates a new Writer whose buffer has the specified size,
// which must be greater than zero. If the argument io.Writer is already a
-// BufWrite with large enough size, it returns the underlying BufWrite.
-// It returns the BufWrite and any error.
-func NewBufWriteSize(wr io.Writer, size int) (*BufWrite, os.Error) {
+// Writer with large enough size, it returns the underlying Writer.
+// It returns the Writer and any error.
+func NewWriterSize(wr io.Writer, size int) (*Writer, os.Error) {
if size <= 0 {
return nil, BadBufSize
}
- // Is it already a BufWrite?
- b, ok := wr.(*BufWrite);
+ // Is it already a Writer?
+ b, ok := wr.(*Writer);
if ok && len(b.buf) >= size {
return b, nil
}
- b = new(BufWrite);
+ b = new(Writer);
b.buf = make([]byte, size);
b.wr = wr;
return b, nil
}
-// NewBufWrite returns a new BufWrite whose buffer has the default size.
-func NewBufWrite(wr io.Writer) *BufWrite {
- b, err := NewBufWriteSize(wr, defaultBufSize);
+// NewWriter returns a new Writer whose buffer has the default size.
+func NewWriter(wr io.Writer) *Writer {
+ b, err := NewWriterSize(wr, defaultBufSize);
if err != nil {
// cannot happen - defaultBufSize is valid size
- panic("bufio: NewBufWrite: ", err.String());
+ panic("bufio: NewWriter: ", err.String());
}
return b;
}
// Flush writes any buffered data to the underlying io.Writer.
-func (b *BufWrite) Flush() os.Error {
+func (b *Writer) Flush() os.Error {
if b.err != nil {
return b.err
}
}
// Available returns how many bytes are unused in the buffer.
-func (b *BufWrite) Available() int {
+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 *BufWrite) Buffered() int {
+func (b *Writer) Buffered() int {
return b.n
}
// It returns the number of bytes written.
// If nn < len(p), also returns an error explaining
// why the write is short.
-func (b *BufWrite) Write(p []byte) (nn int, err os.Error) {
+func (b *Writer) Write(p []byte) (nn int, err os.Error) {
if b.err != nil {
return 0, b.err
}
}
// WriteByte writes a single byte.
-func (b *BufWrite) WriteByte(c byte) os.Error {
+func (b *Writer) WriteByte(c byte) os.Error {
if b.err != nil {
return b.err
}
// buffered input and output
-// BufReadWrite stores (a pointer to) a BufRead and a BufWrite.
+// ReadWriter stores (a pointer to) a Reader and a Writer.
// It implements io.ReadWriter.
-type BufReadWrite struct {
- *BufRead;
- *BufWrite;
+type ReadWriter struct {
+ *Reader;
+ *Writer;
}
-// NewBufReadWrite allocates a new BufReadWrite holding r and w.
-func NewBufReadWrite(r *BufRead, w *BufWrite) *BufReadWrite {
- return &BufReadWrite{r, w}
+// NewReadWriter allocates a new ReadWriter holding r and w.
+func NewReadWriter(r *Reader, w *Writer) *ReadWriter {
+ return &ReadWriter{r, w}
}
// Call ReadLineString (which ends up calling everything else)
// to accumulate the text of a file.
-func readLines(b *BufRead) string {
+func readLines(b *Reader) string {
s := "";
for {
s1, e := b.ReadLineString('\n', true);
}
// Call ReadByte to accumulate the text of a file
-func readBytes(buf *BufRead) string {
+func readBytes(buf *Reader) string {
var b [1000]byte;
nb := 0;
for {
}
// Call Read to accumulate the text of a file
-func reads(buf *BufRead, m int) string {
+func reads(buf *Reader, m int) string {
var b [1000]byte;
nb := 0;
for {
type bufReader struct {
name string;
- fn func(*BufRead) string;
+ fn func(*Reader) string;
}
var bufreaders = []bufReader {
- bufReader{ "1", func(b *BufRead) string { return reads(b, 1) } },
- bufReader{ "2", func(b *BufRead) string { return reads(b, 2) } },
- bufReader{ "3", func(b *BufRead) string { return reads(b, 3) } },
- bufReader{ "4", func(b *BufRead) string { return reads(b, 4) } },
- bufReader{ "5", func(b *BufRead) string { return reads(b, 5) } },
- bufReader{ "7", func(b *BufRead) string { return reads(b, 7) } },
+ bufReader{ "1", func(b *Reader) string { return reads(b, 1) } },
+ bufReader{ "2", func(b *Reader) string { return reads(b, 2) } },
+ bufReader{ "3", func(b *Reader) string { return reads(b, 3) } },
+ bufReader{ "4", func(b *Reader) string { return reads(b, 4) } },
+ bufReader{ "5", func(b *Reader) string { return reads(b, 5) } },
+ bufReader{ "7", func(b *Reader) string { return reads(b, 7) } },
bufReader{ "bytes", readBytes },
bufReader{ "lines", readLines },
}
23, 32, 46, 64, 93, 128, 1024, 4096
}
-func TestBufReadSimple(t *testing.T) {
- b := NewBufRead(newByteReader(io.StringBytes("hello world")));
+func TestReaderSimple(t *testing.T) {
+ b := NewReader(newByteReader(io.StringBytes("hello world")));
if s := readBytes(b); s != "hello world" {
t.Errorf("simple hello world test failed: got %q", s);
}
- b = NewBufRead(newRot13Reader(newByteReader(io.StringBytes("hello world"))));
+ b = NewReader(newRot13Reader(newByteReader(io.StringBytes("hello world"))));
if s := readBytes(b); s != "uryyb jbeyq" {
t.Error("rot13 hello world test failed: got %q", s);
}
}
-func TestBufRead(t *testing.T) {
+func TestReader(t *testing.T) {
var texts [31]string;
str := "";
all := "";
bufreader := bufreaders[j];
bufsize := bufsizes[k];
read := readmaker.fn(textbytes);
- buf, e := NewBufReadSize(read, bufsize);
+ buf, e := NewReaderSize(read, bufsize);
s := bufreader.fn(buf);
if s != text {
t.Errorf("reader=%s fn=%s bufsize=%d want=%q got=%q",
name string;
fn func()writeBuffer;
}
-func TestBufWrite(t *testing.T) {
+func TestWriter(t *testing.T) {
var data [8192]byte;
var writers = []writeMaker {
// and that the data is correct.
write := writers[k].fn();
- buf, e := NewBufWriteSize(write, bs);
+ buf, e := NewWriterSize(write, bs);
context := fmt.Sprintf("write=%s nwrite=%d bufsize=%d", writers[k].name, nwrite, bs);
if e != nil {
- t.Errorf("%s: NewBufWriteSize %d: %v", context, bs, e);
+ t.Errorf("%s: NewWriterSize %d: %v", context, bs, e);
continue;
}
n, e1 := buf.Write(data[0:nwrite]);
}
}
-func TestNewBufReadSizeIdempotent(t *testing.T) {
+func TestNewReaderSizeIdempotent(t *testing.T) {
const BufSize = 1000;
- b, err := NewBufReadSize(newByteReader(io.StringBytes("hello world")), BufSize);
+ b, err := NewReaderSize(newByteReader(io.StringBytes("hello world")), BufSize);
if err != nil {
- t.Error("NewBufReadSize create fail", err);
+ t.Error("NewReaderSize create fail", err);
}
// Does it recognize itself?
- b1, err2 := NewBufReadSize(b, BufSize);
+ b1, err2 := NewReaderSize(b, BufSize);
if err2 != nil {
- t.Error("NewBufReadSize #2 create fail", err2);
+ t.Error("NewReaderSize #2 create fail", err2);
}
if b1 != b {
- t.Error("NewBufReadSize did not detect underlying BufRead");
+ t.Error("NewReaderSize did not detect underlying Reader");
}
// Does it wrap if existing buffer is too small?
- b2, err3 := NewBufReadSize(b, 2*BufSize);
+ b2, err3 := NewReaderSize(b, 2*BufSize);
if err3 != nil {
- t.Error("NewBufReadSize #3 create fail", err3);
+ t.Error("NewReaderSize #3 create fail", err3);
}
if b2 == b {
- t.Error("NewBufReadSize did not enlarge buffer");
+ t.Error("NewReaderSize did not enlarge buffer");
}
}
-func TestNewBufWriteSizeIdempotent(t *testing.T) {
+func TestNewWriterSizeIdempotent(t *testing.T) {
const BufSize = 1000;
- b, err := NewBufWriteSize(newByteWriter(), BufSize);
+ b, err := NewWriterSize(newByteWriter(), BufSize);
if err != nil {
- t.Error("NewBufWriteSize create fail", err);
+ t.Error("NewWriterSize create fail", err);
}
// Does it recognize itself?
- b1, err2 := NewBufWriteSize(b, BufSize);
+ b1, err2 := NewWriterSize(b, BufSize);
if err2 != nil {
- t.Error("NewBufWriteSize #2 create fail", err2);
+ t.Error("NewWriterSize #2 create fail", err2);
}
if b1 != b {
- t.Error("NewBufWriteSize did not detect underlying BufWrite");
+ t.Error("NewWriterSize did not detect underlying Writer");
}
// Does it wrap if existing buffer is too small?
- b2, err3 := NewBufWriteSize(b, 2*BufSize);
+ b2, err3 := NewWriterSize(b, 2*BufSize);
if err3 != nil {
- t.Error("NewBufWriteSize #3 create fail", err3);
+ t.Error("NewWriterSize #3 create fail", err3);
}
if b2 == b {
- t.Error("NewBufWriteSize did not enlarge buffer");
+ t.Error("NewWriterSize did not enlarge buffer");
}
}
// Give up if the line exceeds maxLineLength.
// The returned bytes are a pointer into storage in
// the bufio, so they are only valid until the next bufio read.
-func readLineBytes(b *bufio.BufRead) (p []byte, err os.Error) {
+func readLineBytes(b *bufio.Reader) (p []byte, err os.Error) {
if p, err = b.ReadLineSlice('\n'); err != nil {
return nil, err
}
}
// readLineBytes, but convert the bytes into a string.
-func readLine(b *bufio.BufRead) (s string, err os.Error) {
+func readLine(b *bufio.Reader) (s string, err os.Error) {
p, e := readLineBytes(b);
if e != nil {
return "", e
// A key/value has the form Key: Value\r\n
// and the Value can continue on multiple lines if each continuation line
// starts with a space.
-func readKeyValue(b *bufio.BufRead) (key, value string, err os.Error) {
+func readKeyValue(b *bufio.Reader) (key, value string, err os.Error) {
line, e := readLineBytes(b);
if e != nil {
return "", "", e
}
// ReadRequest reads and parses a request from b.
-func ReadRequest(b *bufio.BufRead) (req *Request, err os.Error) {
+func ReadRequest(b *bufio.Reader) (req *Request, err os.Error) {
req = new(Request);
// First line: GET /index.html HTTP/1.0
Req *Request; // current HTTP request
rwc io.ReadWriteCloser; // i/o connection
- buf *bufio.BufReadWrite; // buffered rwc
+ buf *bufio.ReadWriter; // buffered rwc
handler Handler; // request handler
hijacked bool; // connection has been hijacked by handler
c.RemoteAddr = raddr;
c.handler = handler;
c.rwc = rwc;
- br := bufio.NewBufRead(rwc);
- bw := bufio.NewBufWrite(rwc);
- c.buf = bufio.NewBufReadWrite(br, bw);
+ br := bufio.NewReader(rwc);
+ bw := bufio.NewWriter(rwc);
+ c.buf = bufio.NewReadWriter(br, bw);
return c, nil
}
if c.hijacked {
return nil, ErrHijacked
}
- if req, err = ReadRequest(c.buf.BufRead); err != nil {
+ if req, err = ReadRequest(c.buf.Reader); err != nil {
return nil, err
}
// will not do anything else with the connection.
// It becomes the caller's responsibility to manage
// and close the connection.
-func (c *Conn) Hijack() (rwc io.ReadWriteCloser, buf *bufio.BufReadWrite, err os.Error) {
+func (c *Conn) Hijack() (rwc io.ReadWriteCloser, buf *bufio.ReadWriter, err os.Error) {
if c.hijacked {
return nil, nil, ErrHijacked;
}
}
defer r.Close();
defer w.Close();
- buf := bufio.NewBufRead(r);
+ buf := bufio.NewReader(r);
l := NewLogger(w, nil, prefix, flag);
if useLogf {
l.Logf("hello %d world", 23);
if err != nil {
t.Fatalf("open %s: %v", filename, err);
}
- br := bufio.NewBufRead(fd);
+ br := bufio.NewReader(fd);
var file *file;
file, err = open(filename);
}
defer f.Close();
- b := bufio.NewBufRead(f);
+ b := bufio.NewReader(f);
lineno := 0;
for {
package main
import (
- "bufio";
"container/vector";
"flag";
"fmt";