aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Wedgwood <cw@f00f.org>2010-04-29 11:01:21 -0700
committerRuss Cox <rsc@golang.org>2010-04-29 11:01:21 -0700
commitbe9f6344a774e2edc2bb931194273cf1adcd587f (patch)
tree2d48d65a04623dd30de29287ef48b557b8f52e67
parent39f009cb8eaf261d4ecbe706e55b9bf0c0efe6dd (diff)
downloadgo-be9f6344a774e2edc2bb931194273cf1adcd587f.tar.gz
go-be9f6344a774e2edc2bb931194273cf1adcd587f.zip
net: parser should handle EOF without newline properly.
Fixes #686. R=rsc CC=adg, golang-dev https://golang.org/cl/979044
-rw-r--r--src/pkg/net/parse.go24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/pkg/net/parse.go b/src/pkg/net/parse.go
index ff980f412e..2bc0db4655 100644
--- a/src/pkg/net/parse.go
+++ b/src/pkg/net/parse.go
@@ -13,31 +13,32 @@ import (
)
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
@@ -49,10 +50,13 @@ func (f *file) readLine() (s string, ok bool) {
}
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
@@ -63,7 +67,7 @@ func open(name string) (*file, os.Error) {
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 {