aboutsummaryrefslogtreecommitdiff
path: root/bencode
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-07-25 20:24:32 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-07-25 20:24:32 +0200
commit723c7ae2fb6680a36cd507514c1e90d40d83d334 (patch)
tree8cccf95b9eddcb6f8b3d8da2f5782b5357a98b5b /bencode
parenta916155668a0e5ed117f4bf362d0afff872647d8 (diff)
Paremtrize Tokens
Diffstat (limited to 'bencode')
-rw-r--r--bencode/bdecode.go27
1 files changed, 17 insertions, 10 deletions
diff --git a/bencode/bdecode.go b/bencode/bdecode.go
index bda3dd7..9bd57b9 100644
--- a/bencode/bdecode.go
+++ b/bencode/bdecode.go
@@ -8,6 +8,13 @@ import (
"time"
)
+const (
+ Dict = 'd'
+ List = 'l'
+ Int = 'i'
+ end = 'e'
+)
+
type Unmarshaler interface {
UnmarshalBencode([]byte) (int, error)
}
@@ -31,13 +38,13 @@ func Unmarshal(data []byte, v interface{}) (int, error) {
func (d *decodeState) unmarshalField(v reflect.Value) error {
switch d.data[d.off] {
- case 'd':
+ case Dict:
return d.unmarshalDict(v)
- case 'i':
+ case Int:
return d.unmarshalInt(v)
- case 'l':
+ case List:
return d.unmarshalList(v)
- case 'e':
+ case end:
return ErrValue
default:
return d.unmarshalString(v)
@@ -46,14 +53,14 @@ func (d *decodeState) unmarshalField(v reflect.Value) error {
}
func (d *decodeState) unmarshalDict(v reflect.Value) error {
- if d.data[d.off] != 'd' {
+ if d.data[d.off] != Dict {
return ErrValue
}
rawStart := d.off
d.off++
- for d.data[d.off] != 'e' {
+ for d.data[d.off] != end {
key, n := parseString(d.data[d.off:])
d.off += n
val := findKey(key, v)
@@ -81,12 +88,12 @@ func (d *decodeState) unmarshalDict(v reflect.Value) error {
}
func (d *decodeState) unmarshalList(v reflect.Value) error {
- if d.data[d.off] != 'l' {
+ if d.data[d.off] != List {
return ErrValue
}
d.off++
- for i := 0; d.data[d.off] != 'e'; i++ {
+ for i := 0; d.data[d.off] != end; i++ {
if v.CanSet() {
if i >= v.Cap() {
newcap := v.Cap() + v.Cap()/2
@@ -166,10 +173,10 @@ func parseString(data []byte) (string, int) {
}
func parseInt(data []byte) (int64, int) {
- if data[0] != 'i' {
+ if data[0] != Int {
panic("not an int")
}
- end := bytes.IndexByte(data, 'e')
+ end := bytes.IndexByte(data, end)
i, err := strconv.Atoi(string(data[1:end]))
if err != nil {
panic(err)