bencode/api.go | 4 ++-- bencode/decode.go | 22 ++++++++++++---------- diff --git a/bencode/api.go b/bencode/api.go index bf368cf9f4014b8f4e36159996ae3926021dbfe8..9a77583e84b98175dabac10496815dd0bae8e9f4 100644 --- a/bencode/api.go +++ b/bencode/api.go @@ -128,7 +128,7 @@ // Unmarshal the bencode value in the 'data' to a value pointed by the 'v' // pointer, return a non-nil error if any. func Unmarshal(data []byte, v interface{}) error { - e := decoder{Reader: bufio.NewReader(bytes.NewBuffer(data))} + e := decoder{r: bufio.NewReader(bytes.NewBuffer(data))} return e.decode(v) } @@ -141,7 +141,7 @@ d decoder } func NewDecoder(r io.Reader) *Decoder { - return &Decoder{decoder{Reader: bufio.NewReader(r)}} + return &Decoder{decoder{r: bufio.NewReader(r)}} } func (d *Decoder) Decode(v interface{}) error { diff --git a/bencode/decode.go b/bencode/decode.go index 9cb2a0d65e453c51e610352a414dbd0f97302731..ebd4684e2c956f140571d5526ecc9842de4b8e80 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -1,7 +1,6 @@ package bencode import ( - "bufio" "bytes" "errors" "fmt" @@ -14,7 +13,10 @@ "strings" ) type decoder struct { - *bufio.Reader + r interface { + io.ByteScanner + io.Reader + } offset int64 buf bytes.Buffer key string @@ -51,7 +53,7 @@ } } func (d *decoder) read_byte() byte { - b, err := d.ReadByte() + b, err := d.r.ReadByte() if err != nil { check_for_unexpected_eof(err, d.offset) panic(err) @@ -145,7 +147,7 @@ length, err := strconv.ParseInt(d.buf.String(), 10, 64) check_for_int_parse_error(err, start) d.buf.Reset() - n, err := io.CopyN(&d.buf, d, length) + n, err := io.CopyN(&d.buf, d.r, length) d.offset += n if err != nil { check_for_unexpected_eof(err, d.offset) @@ -329,12 +331,12 @@ } } func (d *decoder) read_one_value() bool { - b, err := d.ReadByte() + b, err := d.r.ReadByte() if err != nil { panic(err) } if b == 'e' { - d.UnreadByte() + d.r.UnreadByte() return false } else { d.offset++ @@ -360,7 +362,7 @@ length, err := strconv.ParseInt(d.buf.String()[start:], 10, 64) check_for_int_parse_error(err, d.offset-1) d.buf.WriteString(":") - n, err := io.CopyN(&d.buf, d, length) + n, err := io.CopyN(&d.buf, d.r, length) d.offset += n if err != nil { check_for_unexpected_eof(err, d.offset) @@ -429,7 +431,7 @@ v.Set(reflect.ValueOf(iface)) return true } - b, err := d.ReadByte() + b, err := d.r.ReadByte() if err != nil { panic(err) } @@ -468,7 +470,7 @@ }) } func (d *decoder) parse_value_interface() (interface{}, bool) { - b, err := d.ReadByte() + b, err := d.r.ReadByte() if err != nil { panic(err) } @@ -535,7 +537,7 @@ length, err := strconv.ParseInt(d.buf.String(), 10, 64) check_for_int_parse_error(err, start) d.buf.Reset() - n, err := io.CopyN(&d.buf, d, length) + n, err := io.CopyN(&d.buf, d.r, length) d.offset += n if err != nil { check_for_unexpected_eof(err, d.offset)