]> Cypherpunks repositories - gostls13.git/commitdiff
net: parser should handle EOF without newline properly.
authorChristopher Wedgwood <cw@f00f.org>
Thu, 29 Apr 2010 18:01:21 +0000 (11:01 -0700)
committerRuss Cox <rsc@golang.org>
Thu, 29 Apr 2010 18:01:21 +0000 (11:01 -0700)
Fixes #686.

R=rsc
CC=adg, golang-dev
https://golang.org/cl/979044

src/pkg/net/parse.go

index ff980f412eabf62b3393c9d87d824280a47342d2..2bc0db4655a2fe3f4cd0d44264bd4e7c173858cf 100644 (file)
@@ -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 {