1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // Simple file i/o and string manipulation, to avoid
6 // depending on strconv and bufio and strings.
21 func (f *file) close() { f.file.Close() }
23 func (f *file) getLineFromData() (s string, ok bool) {
26 for i = 0; i < len(data); i++ {
33 copy(data[0:], data[i:])
38 if f.atEOF && len(f.data) > 0 {
39 // EOF, return all we have
47 func (f *file) readLine() (s string, ok bool) {
48 if s, ok = f.getLineFromData(); ok {
51 if len(f.data) < cap(f.data) {
53 n, err := io.ReadFull(f.file, f.data[ln:cap(f.data)])
55 f.data = f.data[0 : ln+n]
61 s, ok = f.getLineFromData()
65 func open(name string) (*file, os.Error) {
66 fd, err := os.Open(name)
70 return &file{fd, make([]byte, 1024)[0:0], false}, nil
73 func byteIndex(s string, c byte) int {
74 for i := 0; i < len(s); i++ {
82 // Count occurrences in s of any bytes in t.
83 func countAnyByte(s string, t string) int {
85 for i := 0; i < len(s); i++ {
86 if byteIndex(t, s[i]) >= 0 {
93 // Split s at any bytes in t.
94 func splitAtBytes(s string, t string) []string {
95 a := make([]string, 1+countAnyByte(s, t))
98 for i := 0; i < len(s); i++ {
99 if byteIndex(t, s[i]) >= 0 {
101 a[n] = string(s[last:i])
108 a[n] = string(s[last:])
114 func getFields(s string) []string { return splitAtBytes(s, " \r\t\n") }
116 // Bigger than we need, not too big to worry about overflow
119 // Decimal to integer starting at &s[i0].
120 // Returns number, new offset, success.
121 func dtoi(s string, i0 int) (n int, i int, ok bool) {
123 for i = i0; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
124 n = n*10 + int(s[i]-'0')
135 // Hexadecimal to integer starting at &s[i0].
136 // Returns number, new offset, success.
137 func xtoi(s string, i0 int) (n int, i int, ok bool) {
139 for i = i0; i < len(s); i++ {
140 if '0' <= s[i] && s[i] <= '9' {
143 } else if 'a' <= s[i] && s[i] <= 'f' {
145 n += int(s[i]-'a') + 10
146 } else if 'A' <= s[i] && s[i] <= 'F' {
148 n += int(s[i]-'A') + 10
162 // Integer to decimal.
163 func itoa(i int) string {
172 for ui > 0 || n == len(buf) {
174 buf[n] = byte('0' + ui%10)
181 return string(buf[n:])
184 // Number of occurrences of b in s.
185 func count(s string, b byte) int {
187 for i := 0; i < len(s); i++ {
195 // Index of rightmost occurrence of b in s.
196 func last(s string, b byte) int {
198 for i--; i >= 0; i-- {