Commit d7b48515 authored by Kyle Consalus's avatar Kyle Consalus Committed by Russ Cox

strings: add ReadRune to Reader

R=rsc
CC=golang-dev
https://golang.org/cl/940041
parent e4136fe9
......@@ -4,9 +4,12 @@
package strings
import "os"
import (
"os"
"utf8"
)
// A Reader satisfies calls to Read and ReadByte by
// A Reader satisfies calls to Read, ReadByte, and ReadRune by
// reading from a string.
type Reader string
......@@ -33,6 +36,26 @@ func (r *Reader) ReadByte() (b byte, err os.Error) {
return
}
// ReadRune reads and returns the next UTF-8-encoded
// Unicode code point from the buffer.
// If no bytes are available, the error returned is os.EOF.
// If the bytes are an erroneous UTF-8 encoding, it
// consumes one byte and returns U+FFFD, 1.
func (r *Reader) ReadRune() (rune int, size int, err os.Error) {
s := *r
if len(s) == 0 {
return 0, 0, os.EOF
}
c := s[0]
if c < utf8.RuneSelf {
*r = s[1:]
return int(c), 1, nil
}
rune, size = utf8.DecodeRuneInString(string(s))
*r = s[size:]
return
}
// NewReader returns a new Reader reading from s.
// It is similar to bytes.NewBufferString but more efficient and read-only.
func NewReader(s string) *Reader { return (*Reader)(&s) }
......@@ -5,6 +5,7 @@
package strings_test
import (
"os"
. "strings"
"testing"
"unicode"
......@@ -576,3 +577,25 @@ func TestRunes(t *testing.T) {
}
}
}
func TestReadRune(t *testing.T) {
testStrings := []string{"", abcd, faces, commas}
for _, s := range testStrings {
reader := NewReader(s)
res := ""
for {
r, _, e := reader.ReadRune()
if e == os.EOF {
break
}
if e != nil {
t.Errorf("Reading %q: %s", s, e)
break
}
res += string(r)
}
if res != s {
t.Errorf("Reader(%q).ReadRune() produced %q", s, res)
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment