)
type file struct {
- file *os.File
- data []byte
+ file *os.File
+ data []byte
+ atEOF bool
}
func (f *file) close() { f.file.Close() }
func (f *file) getLineFromData() (s string, ok bool) {
data := f.data
- for i := 0; i < len(data); i++ {
+ i := 0
+ for i = 0; i < len(data); i++ {
if data[i] == '\n' {
s = string(data[0:i])
ok = true
// move data
i++
n := len(data) - i
- for j := 0; j < n; j++ {
- data[j] = data[i+j]
- }
+ copy(data[0:], data[i:])
f.data = data[0:n]
return
}
}
- if len(f.data) > 0 {
+ if f.atEOF && len(f.data) > 0 {
+ // EOF, return all we have
s = string(data)
- f.data = nil
+ f.data = f.data[0:0]
ok = true
}
return
}
if len(f.data) < cap(f.data) {
ln := len(f.data)
- n, _ := io.ReadFull(f.file, f.data[ln:cap(f.data)])
+ n, err := io.ReadFull(f.file, f.data[ln:cap(f.data)])
if n >= 0 {
f.data = f.data[0 : ln+n]
}
+ if err == os.EOF {
+ f.atEOF = true
+ }
}
s, ok = f.getLineFromData()
return
if err != nil {
return nil, err
}
- return &file{fd, make([]byte, 1024)[0:0]}, nil
+ return &file{fd, make([]byte, 1024)[0:0], false}, nil
}
func byteIndex(s string, c byte) int {