1
0
mirror of https://github.com/golang/go synced 2024-11-22 07:24:47 -07:00

strings: add ReadRune to Reader

R=rsc
CC=golang-dev
https://golang.org/cl/940041
This commit is contained in:
Kyle Consalus 2010-04-20 22:18:26 -07:00 committed by Russ Cox
parent e4136fe91c
commit d7b4851586
2 changed files with 48 additions and 2 deletions

View File

@ -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) }

View File

@ -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)
}
}
}