1
2
3
4
5 package strings
6
7 import (
8 "os"
9 "utf8"
10 )
11
12
13
14 type Reader struct {
15 s string
16 i int
17 prevRune int
18 }
19
20
21
22 func (r *Reader) Len() int {
23 return len(r.s) - r.i
24 }
25
26 func (r *Reader) Read(b []byte) (n int, err os.Error) {
27 if r.i >= len(r.s) {
28 return 0, os.EOF
29 }
30 n = copy(b, r.s[r.i:])
31 r.i += n
32 r.prevRune = -1
33 return
34 }
35
36 func (r *Reader) ReadByte() (b byte, err os.Error) {
37 if r.i >= len(r.s) {
38 return 0, os.EOF
39 }
40 b = r.s[r.i]
41 r.i++
42 r.prevRune = -1
43 return
44 }
45
46
47
48
49 func (r *Reader) UnreadByte() os.Error {
50 if r.i <= 0 {
51 return os.NewError("strings.Reader: at beginning of string")
52 }
53 r.i--
54 r.prevRune = -1
55 return nil
56 }
57
58
59
60
61
62
63 func (r *Reader) ReadRune() (rune int, size int, err os.Error) {
64 if r.i >= len(r.s) {
65 return 0, 0, os.EOF
66 }
67 r.prevRune = r.i
68 if c := r.s[r.i]; c < utf8.RuneSelf {
69 r.i++
70 return int(c), 1, nil
71 }
72 rune, size = utf8.DecodeRuneInString(r.s[r.i:])
73 r.i += size
74 return
75 }
76
77
78
79
80 func (r *Reader) UnreadRune() os.Error {
81 if r.prevRune < 0 {
82 return os.NewError("strings.Reader: previous operation was not ReadRune")
83 }
84 r.i = r.prevRune
85 r.prevRune = -1
86 return nil
87 }
88
89
90
91 func NewReader(s string) *Reader { return &Reader{s, 0, -1} }