URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [strings/] [reader.go] - Rev 762
Go to most recent revision | Compare with Previous | Blame | View Log
// 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 stringsimport ("errors""io""unicode/utf8")// A Reader implements the io.Reader, io.ByteScanner, and// io.RuneScanner interfaces by reading from a string.type Reader struct {s stringi int // current reading indexprevRune int // index of previous rune; or < 0}// Len returns the number of bytes of the unread portion of the// string.func (r *Reader) Len() int {return len(r.s) - r.i}func (r *Reader) Read(b []byte) (n int, err error) {if r.i >= len(r.s) {return 0, io.EOF}n = copy(b, r.s[r.i:])r.i += nr.prevRune = -1return}func (r *Reader) ReadByte() (b byte, err error) {if r.i >= len(r.s) {return 0, io.EOF}b = r.s[r.i]r.i++r.prevRune = -1return}// UnreadByte moves the reading position back by one byte.// It is an error to call UnreadByte if nothing has been// read yet.func (r *Reader) UnreadByte() error {if r.i <= 0 {return errors.New("strings.Reader: at beginning of string")}r.i--r.prevRune = -1return nil}// ReadRune reads and returns the next UTF-8-encoded// Unicode code point from the buffer.// If no bytes are available, the error returned is io.EOF.// If the bytes are an erroneous UTF-8 encoding, it// consumes one byte and returns U+FFFD, 1.func (r *Reader) ReadRune() (ch rune, size int, err error) {if r.i >= len(r.s) {return 0, 0, io.EOF}r.prevRune = r.iif c := r.s[r.i]; c < utf8.RuneSelf {r.i++return rune(c), 1, nil}ch, size = utf8.DecodeRuneInString(r.s[r.i:])r.i += sizereturn}// UnreadRune causes the next call to ReadRune to return the same rune// as the previous call to ReadRune.// The last method called on r must have been ReadRune.func (r *Reader) UnreadRune() error {if r.prevRune < 0 {return errors.New("strings.Reader: previous operation was not ReadRune")}r.i = r.prevRuner.prevRune = -1return nil}// 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, 0, -1} }
Go to most recent revision | Compare with Previous | Blame | View Log
