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
, os
.O_RDONLY
, 0)
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 // Returns the prefix of s up to but not including the character c
196 func prefixBefore(s
string, c
byte) string {
197 for i
, v
:= range s
{
205 // Index of rightmost occurrence of b in s.
206 func last(s
string, b
byte) int {
208 for i
--; i
>= 0; i
-- {