// 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)
}
}
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 {
package bencode
import (
- "bufio"
"bytes"
"errors"
"fmt"
)
type decoder struct {
- *bufio.Reader
+ r interface {
+ io.ByteScanner
+ io.Reader
+ }
offset int64
buf bytes.Buffer
key string
}
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)
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)
}
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++
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)
return true
}
- b, err := d.ReadByte()
+ b, err := d.r.ReadByte()
if err != nil {
panic(err)
}
}
func (d *decoder) parse_value_interface() (interface{}, bool) {
- b, err := d.ReadByte()
+ b, err := d.r.ReadByte()
if err != nil {
panic(err)
}
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)