From: Rob Pike Date: Tue, 24 May 2011 01:02:44 +0000 (+1000) Subject: image/gif: simplify blockReader.Read. X-Git-Tag: weekly.2011-06-02~134 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=4c945c2cfc29ccc607f2f606053953813cd0c4b6;p=gostls13.git image/gif: simplify blockReader.Read. Inverting the tests avoids recursion and simplifies the flow. R=nigeltao CC=golang-dev https://golang.org/cl/4551057 --- diff --git a/src/pkg/image/gif/reader.go b/src/pkg/image/gif/reader.go index 5dd404036c..4de18c323b 100644 --- a/src/pkg/image/gif/reader.go +++ b/src/pkg/image/gif/reader.go @@ -94,28 +94,26 @@ type blockReader struct { tmp [256]byte } -func (b *blockReader) Read(p []byte) (n int, err os.Error) { +func (b *blockReader) Read(p []byte) (int, os.Error) { if len(p) == 0 { - return - } - if len(b.slice) > 0 { - n = copy(p, b.slice) - b.slice = b.slice[n:] - return - } - var blockLen uint8 - blockLen, err = b.r.ReadByte() - if err != nil { - return + return 0, nil } - if blockLen == 0 { - return 0, os.EOF - } - b.slice = b.tmp[0:blockLen] - if _, err = io.ReadFull(b.r, b.slice); err != nil { - return + if len(b.slice) == 0 { + blockLen, err := b.r.ReadByte() + if err != nil { + return 0, err + } + if blockLen == 0 { + return 0, os.EOF + } + b.slice = b.tmp[0:blockLen] + if _, err = io.ReadFull(b.r, b.slice); err != nil { + return 0, err + } } - return b.Read(p) + n := copy(p, b.slice) + b.slice = b.slice[n:] + return n, nil } // decode reads a GIF image from r and stores the result in d.