Fix Writers returning n-1 bytes written.

ByteWriter and StringWriter were returning n-1 bytes written which was
causing io.Copy to error out with a ShortWrite. This would cause files
that were larger than the io.Copy internal buffer (32 * 1024) to stop
after the first chunk.
This commit is contained in:
Joseph Hager 2012-07-13 14:57:50 -04:00
parent 98c1704190
commit 93063b64a3
2 changed files with 74 additions and 70 deletions

View File

@ -1,35 +1,37 @@
// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication // This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
// license. Its contents can be found at: // license. Its contents can be found at:
// http://creativecommons.org/publicdomain/zero/1.0/ // http://creativecommons.org/publicdomain/zero/1.0/
package main package main
import ( import (
"fmt" "fmt"
"io" "io"
) )
var newline = []byte{'\n'} var newline = []byte{'\n'}
type ByteWriter struct { type ByteWriter struct {
io.Writer io.Writer
c int c int
} }
func (w *ByteWriter) Write(p []byte) (n int, err error) { func (w *ByteWriter) Write(p []byte) (n int, err error) {
if len(p) == 0 { if len(p) == 0 {
return return
} }
for n = range p { for n = range p {
if w.c%12 == 0 { if w.c%12 == 0 {
w.Writer.Write(newline) w.Writer.Write(newline)
w.c = 0 w.c = 0
} }
fmt.Fprintf(w.Writer, "0x%02x,", p[n]) fmt.Fprintf(w.Writer, "0x%02x,", p[n])
w.c++ w.c++
} }
return n++
}
return
}

View File

@ -1,35 +1,37 @@
// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication // This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
// license. Its contents can be found at: // license. Its contents can be found at:
// http://creativecommons.org/publicdomain/zero/1.0/ // http://creativecommons.org/publicdomain/zero/1.0/
package main package main
import ( import (
"fmt" "fmt"
"io" "io"
) )
var line = []byte("\"+\n\"") var line = []byte("\"+\n\"")
type StringWriter struct { type StringWriter struct {
io.Writer io.Writer
c int c int
} }
func (w *StringWriter) Write(p []byte) (n int, err error) { func (w *StringWriter) Write(p []byte) (n int, err error) {
if len(p) == 0 { if len(p) == 0 {
return return
} }
for n = range p { for n = range p {
if w.c%16 == 0 { if w.c%16 == 0 {
w.Writer.Write(line) w.Writer.Write(line)
w.c = 0 w.c = 0
} }
fmt.Fprintf(w.Writer, "\\x%02x", p[n]) fmt.Fprintf(w.Writer, "\\x%02x", p[n])
w.c++ w.c++
} }
return n++
}
return
}