fixed author and updated to r58 or higher

This commit is contained in:
Brian Ketelsen 2011-07-21 12:33:44 -04:00
parent bcad8d4c4c
commit 682d25b551
3 changed files with 1227 additions and 868 deletions

View File

@ -6,203 +6,299 @@ import (
"bytes" "bytes"
"reflect" "reflect"
"math" "math"
); )
func equal(lhs reflect.Value, rhs reflect.Value) bool { func equal(lhs reflect.Value, rhs reflect.Value) bool {
{ {
_rhs, ok := rhs.(*reflect.InterfaceValue) _rhs := rhs
if ok { return equal(lhs, _rhs.Elem()) } if _rhs.Kind() == reflect.Interface {
return equal(lhs, _rhs.Elem())
} }
switch _lhs := lhs.(type) { }
case *reflect.InterfaceValue: switch _lhs := lhs; _lhs.Kind() {
case reflect.Interface:
return equal(_lhs.Elem(), rhs) return equal(_lhs.Elem(), rhs)
case *reflect.BoolValue: case reflect.Bool:
_rhs, ok := rhs.(*reflect.BoolValue) _rhs := rhs
return ok && _lhs.Get() == _rhs.Get() return _rhs.Kind() == reflect.Bool &&
case *reflect.UintValue: _lhs.Bool() == _rhs.Bool()
_rhs, ok := rhs.(*reflect.UintValue) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return ok && _lhs.Get() == _rhs.Get() _rhs := rhs
case *reflect.IntValue: return (_rhs.Kind() == reflect.Uint || _rhs.Kind() == reflect.Uint8 || _rhs.Kind() == reflect.Uint16 || _rhs.Kind() == reflect.Uint32 || _rhs.Kind() == reflect.Uint64 || _rhs.Kind() == reflect.Uintptr) &&
_rhs, ok := rhs.(*reflect.IntValue) _lhs.Uint() == _rhs.Uint()
return ok && _lhs.Get() == _rhs.Get() case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
case *reflect.FloatValue: _rhs := rhs
_rhs, ok := rhs.(*reflect.FloatValue) return (_rhs.Kind() == reflect.Int || _rhs.Kind() == reflect.Int8 || _rhs.Kind() == reflect.Int16 || _rhs.Kind() == reflect.Int32 || _rhs.Kind() == reflect.Int64) &&
return ok && _lhs.Get() == _rhs.Get() _lhs.Int() == _rhs.Int()
case reflect.ArrayOrSliceValue: case reflect.Float32, reflect.Float64:
_rhs := rhs.(reflect.ArrayOrSliceValue) _rhs := rhs
if _lhs.Len() != _rhs.Len() { return false; } return (_rhs.Kind() == reflect.Float32 || _rhs.Kind() == reflect.Float64) &&
_lhs.Float() == _rhs.Float()
case reflect.Array, reflect.Slice:
_rhs := rhs
if _lhs.Len() != _rhs.Len() {
return false
}
for i := 0; i < _lhs.Len(); i++ { for i := 0; i < _lhs.Len(); i++ {
if !equal(_lhs.Elem(i), _rhs.Elem(i)) { return false; } if !equal(_lhs.Index(i), _rhs.Index(i)) {
return false
} }
return true;
case *reflect.MapValue:
_rhs := rhs.(*reflect.MapValue)
if _lhs.Len() != _rhs.Len() { return false; }
for _, k := range _lhs.Keys() {
lv, rv := _lhs.Elem(k), _rhs.Elem(k)
if lv == nil || rv == nil || !equal(lv, rv) { return false; }
} }
return true; return true
case reflect.Map:
_rhs := rhs
if _lhs.Len() != _rhs.Len() {
return false
} }
return false; for _, k := range _lhs.MapKeys() {
lv, rv := _lhs.MapIndex(k), _rhs.MapIndex(k)
if !lv.IsValid() || !rv.IsValid() || !equal(lv, rv) {
return false
}
}
return true
}
return false
} }
func TestPackUint8(t *testing.T) { func TestPackUint8(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
for _, i := range []uint8 { 0, 1, 2, 125, 126, 127, 128, 253, 254, 255 } { for _, i := range []uint8{0, 1, 2, 125, 126, 127, 128, 253, 254, 255} {
_, err := PackUint8(b, i) _, err := PackUint8(b, i)
if err != nil { t.Error("err != nil") } if err != nil {
t.Error("err != nil")
}
}
if bytes.Compare(b.Bytes(), []byte{0x00, 0x01, 0x02, 0x7d, 0x7e, 0x7f, 0xcc, 0x80, 0xcc, 0xfd, 0xcc, 0xfe, 0xcc, 0xff}) != 0 {
t.Error("wrong output", b.Bytes())
} }
if bytes.Compare(b.Bytes(), []byte { 0x00, 0x01, 0x02, 0x7d, 0x7e, 0x7f, 0xcc, 0x80, 0xcc, 0xfd, 0xcc, 0xfe, 0xcc, 0xff }) != 0 { t.Error("wrong output", b.Bytes()) }
} }
func TestPackUint16(t *testing.T) { func TestPackUint16(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
for _, i := range []uint16 { 0, 1, 2, 125, 126, 127, 128, 253, 254, 255, 256, 65533, 65534, 65535 } { for _, i := range []uint16{0, 1, 2, 125, 126, 127, 128, 253, 254, 255, 256, 65533, 65534, 65535} {
_, err := PackUint16(b, i) _, err := PackUint16(b, i)
if err != nil { t.Error("err != nil") } if err != nil {
t.Error("err != nil")
}
}
if bytes.Compare(b.Bytes(), []byte{0x00, 0x01, 0x02, 0x7d, 0x7e, 0x7f, 0xcc, 0x80, 0xcc, 0xfd, 0xcc, 0xfe, 0xcc, 0xff, 0xcd, 0x01, 0x00, 0xcd, 0xff, 0xfd, 0xcd, 0xff, 0xfe, 0xcd, 0xff, 0xff}) != 0 {
t.Error("wrong output", b.Bytes())
} }
if bytes.Compare(b.Bytes(), []byte { 0x00, 0x01, 0x02, 0x7d, 0x7e, 0x7f, 0xcc, 0x80, 0xcc, 0xfd, 0xcc, 0xfe, 0xcc, 0xff, 0xcd, 0x01, 0x00, 0xcd, 0xff, 0xfd, 0xcd, 0xff, 0xfe, 0xcd, 0xff, 0xff }) != 0 { t.Error("wrong output", b.Bytes()) }
} }
func TestPackUint32(t *testing.T) { func TestPackUint32(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
for _, i := range []uint32 { 0, 1, 2, 125, 126, 127, 128, 253, 254, 255, 256, 65533, 65534, 65535, 65536, 4294967293, 4294967294, 4294967295 } { for _, i := range []uint32{0, 1, 2, 125, 126, 127, 128, 253, 254, 255, 256, 65533, 65534, 65535, 65536, 4294967293, 4294967294, 4294967295} {
_, err := PackUint32(b, i) _, err := PackUint32(b, i)
if err != nil { t.Error("err != nil") } if err != nil {
t.Error("err != nil")
}
}
if bytes.Compare(b.Bytes(), []byte{0x00, 0x01, 0x02, 0x7d, 0x7e, 0x7f, 0xcc, 0x80, 0xcc, 0xfd, 0xcc, 0xfe, 0xcc, 0xff, 0xcd, 0x01, 0x00, 0xcd, 0xff, 0xfd, 0xcd, 0xff, 0xfe, 0xcd, 0xff, 0xff, 0xce, 0x00, 0x01, 0x00, 0x00, 0xce, 0xff, 0xff, 0xff, 0xfd, 0xce, 0xff, 0xff, 0xff, 0xfe, 0xce, 0xff, 0xff, 0xff, 0xff}) != 0 {
t.Error("wrong output", b.Bytes())
} }
if bytes.Compare(b.Bytes(), []byte { 0x00, 0x01, 0x02, 0x7d, 0x7e, 0x7f, 0xcc, 0x80, 0xcc, 0xfd, 0xcc, 0xfe, 0xcc, 0xff, 0xcd, 0x01, 0x00, 0xcd, 0xff, 0xfd, 0xcd, 0xff, 0xfe, 0xcd, 0xff, 0xff, 0xce, 0x00, 0x01, 0x00, 0x00, 0xce, 0xff, 0xff, 0xff, 0xfd, 0xce, 0xff, 0xff, 0xff, 0xfe, 0xce, 0xff, 0xff, 0xff, 0xff }) != 0 { t.Error("wrong output", b.Bytes()) }
} }
func TestPackUint64(t *testing.T) { func TestPackUint64(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
for _, i := range []uint64 { 0, 1, 2, 125, 126, 127, 128, 253, 254, 255, 256, 65533, 65534, 65535, 65536, 4294967293, 4294967294, 4294967295, 4294967296, 18446744073709551613, 18446744073709551614, 18446744073709551615 } { for _, i := range []uint64{0, 1, 2, 125, 126, 127, 128, 253, 254, 255, 256, 65533, 65534, 65535, 65536, 4294967293, 4294967294, 4294967295, 4294967296, 18446744073709551613, 18446744073709551614, 18446744073709551615} {
_, err := PackUint64(b, i) _, err := PackUint64(b, i)
if err != nil { t.Error("err != nil") } if err != nil {
t.Error("err != nil")
}
}
if bytes.Compare(b.Bytes(), []byte{0x00, 0x01, 0x02, 0x7d, 0x7e, 0x7f, 0xcc, 0x80, 0xcc, 0xfd, 0xcc, 0xfe, 0xcc, 0xff, 0xcd, 0x01, 0x00, 0xcd, 0xff, 0xfd, 0xcd, 0xff, 0xfe, 0xcd, 0xff, 0xff, 0xce, 0x00, 0x01, 0x00, 0x00, 0xce, 0xff, 0xff, 0xff, 0xfd, 0xce, 0xff, 0xff, 0xff, 0xfe, 0xce, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}) != 0 {
t.Error("wrong output", b.Bytes())
} }
if bytes.Compare(b.Bytes(), []byte { 0x00, 0x01, 0x02, 0x7d, 0x7e, 0x7f, 0xcc, 0x80, 0xcc, 0xfd, 0xcc, 0xfe, 0xcc, 0xff, 0xcd, 0x01, 0x00, 0xcd, 0xff, 0xfd, 0xcd, 0xff, 0xfe, 0xcd, 0xff, 0xff, 0xce, 0x00, 0x01, 0x00, 0x00, 0xce, 0xff, 0xff, 0xff, 0xfd, 0xce, 0xff, 0xff, 0xff, 0xfe, 0xce, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }) != 0 { t.Error("wrong output", b.Bytes()) }
} }
func TestPackInt8(t *testing.T) { func TestPackInt8(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
for _, i := range []int8 { -128, -127, -34, -33, -32, -31, 0, 1, 126, 127 } { for _, i := range []int8{-128, -127, -34, -33, -32, -31, 0, 1, 126, 127} {
_, err := PackInt8(b, i) _, err := PackInt8(b, i)
if err != nil { t.Error("err != nil") } if err != nil {
t.Error("err != nil")
}
}
if bytes.Compare(b.Bytes(), []byte{0xd0, 0x80, 0xd0, 0x81, 0xd0, 0xde, 0xd0, 0xdf, 0xe0, 0xe1, 0x00, 0x01, 0x7e, 0x7f}) != 0 {
t.Error("wrong output", b.Bytes())
} }
if bytes.Compare(b.Bytes(), []byte { 0xd0, 0x80, 0xd0, 0x81, 0xd0, 0xde, 0xd0, 0xdf, 0xe0, 0xe1, 0x00, 0x01, 0x7e, 0x7f }) != 0 { t.Error("wrong output", b.Bytes()) }
} }
func TestPackInt16(t *testing.T) { func TestPackInt16(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
for _, i := range []int16 { -32768, -32767, -131, -130, -129, -128, -127, -34, -33, -32, -31, 0, 1, 126, 127, 128, 129, 130, 32765, 32766, 32767 } { for _, i := range []int16{-32768, -32767, -131, -130, -129, -128, -127, -34, -33, -32, -31, 0, 1, 126, 127, 128, 129, 130, 32765, 32766, 32767} {
_, err := PackInt16(b, i) _, err := PackInt16(b, i)
if err != nil { t.Error("err != nil") } if err != nil {
t.Error("err != nil")
}
}
if bytes.Compare(b.Bytes(), []byte{0xd1, 0x80, 0x00, 0xd1, 0x80, 0x01, 0xd1, 0xff, 0x7d, 0xd1, 0xff, 0x7e, 0xd1, 0xff, 0x7f, 0xd0, 0x80, 0xd0, 0x81, 0xd0, 0xde, 0xd0, 0xdf, 0xe0, 0xe1, 0x00, 0x01, 0x7e, 0x7f, 0xd1, 0x00, 0x80, 0xd1, 0x00, 0x81, 0xd1, 0x00, 0x82, 0xd1, 0x7f, 0xfd, 0xd1, 0x7f, 0xfe, 0xd1, 0x7f, 0xff}) != 0 {
t.Error("wrong output", b.Bytes())
} }
if bytes.Compare(b.Bytes(), []byte { 0xd1, 0x80, 0x00, 0xd1, 0x80, 0x01, 0xd1, 0xff, 0x7d, 0xd1, 0xff, 0x7e, 0xd1, 0xff, 0x7f, 0xd0, 0x80, 0xd0, 0x81, 0xd0, 0xde, 0xd0, 0xdf, 0xe0, 0xe1, 0x00, 0x01, 0x7e, 0x7f, 0xd1, 0x00, 0x80, 0xd1, 0x00, 0x81, 0xd1, 0x00, 0x82, 0xd1, 0x7f, 0xfd, 0xd1, 0x7f, 0xfe, 0xd1, 0x7f, 0xff }) != 0 { t.Error("wrong output", b.Bytes()) }
} }
func TestPackInt32(t *testing.T) { func TestPackInt32(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
for _, i := range []int32 { -2147483648, -2147483647, -2147483646, -32771, -32770, -32769, -32768, -32767, -131, -130, -129, -128, -127, -34, -33, -32, -31, 0, 1, 126, 127, 128, 129, 130, 32765, 32766, 32767, 32768, 32769, 32770, 2147483645, 2147483646, 2147483647 } { for _, i := range []int32{-2147483648, -2147483647, -2147483646, -32771, -32770, -32769, -32768, -32767, -131, -130, -129, -128, -127, -34, -33, -32, -31, 0, 1, 126, 127, 128, 129, 130, 32765, 32766, 32767, 32768, 32769, 32770, 2147483645, 2147483646, 2147483647} {
_, err := PackInt32(b, i) _, err := PackInt32(b, i)
if err != nil { t.Error("err != nil") } if err != nil {
t.Error("err != nil")
}
}
if bytes.Compare(b.Bytes(), []byte{0xd2, 0x80, 0x00, 0x00, 0x00, 0xd2, 0x80, 0x00, 0x00, 0x01, 0xd2, 0x80, 0x00, 0x00, 0x02, 0xd2, 0xff, 0xff, 0x7f, 0xfd, 0xd2, 0xff, 0xff, 0x7f, 0xfe, 0xd2, 0xff, 0xff, 0x7f, 0xff, 0xd1, 0x80, 0x00, 0xd1, 0x80, 0x01, 0xd1, 0xff, 0x7d, 0xd1, 0xff, 0x7e, 0xd1, 0xff, 0x7f, 0xd0, 0x80, 0xd0, 0x81, 0xd0, 0xde, 0xd0, 0xdf, 0xe0, 0xe1, 0x00, 0x01, 0x7e, 0x7f, 0xd1, 0x00, 0x80, 0xd1, 0x00, 0x81, 0xd1, 0x00, 0x82, 0xd1, 0x7f, 0xfd, 0xd1, 0x7f, 0xfe, 0xd1, 0x7f, 0xff, 0xd2, 0x00, 0x00, 0x80, 0x00, 0xd2, 0x00, 0x00, 0x80, 0x01, 0xd2, 0x00, 0x00, 0x80, 0x02, 0xd2, 0x7f, 0xff, 0xff, 0xfd, 0xd2, 0x7f, 0xff, 0xff, 0xfe, 0xd2, 0x7f, 0xff, 0xff, 0xff}) != 0 {
t.Error("wrong output", b.Bytes())
} }
if bytes.Compare(b.Bytes(), []byte { 0xd2, 0x80, 0x00, 0x00, 0x00, 0xd2, 0x80, 0x00, 0x00, 0x01, 0xd2, 0x80, 0x00, 0x00, 0x02, 0xd2, 0xff, 0xff, 0x7f, 0xfd, 0xd2, 0xff, 0xff, 0x7f, 0xfe, 0xd2, 0xff, 0xff, 0x7f, 0xff, 0xd1, 0x80, 0x00, 0xd1, 0x80, 0x01, 0xd1, 0xff, 0x7d, 0xd1, 0xff, 0x7e, 0xd1, 0xff, 0x7f, 0xd0, 0x80, 0xd0, 0x81, 0xd0, 0xde, 0xd0, 0xdf, 0xe0, 0xe1, 0x00, 0x01, 0x7e, 0x7f, 0xd1, 0x00, 0x80, 0xd1, 0x00, 0x81, 0xd1, 0x00, 0x82, 0xd1, 0x7f, 0xfd, 0xd1, 0x7f, 0xfe, 0xd1, 0x7f, 0xff, 0xd2, 0x00, 0x00, 0x80, 0x00, 0xd2, 0x00, 0x00, 0x80, 0x01, 0xd2, 0x00, 0x00, 0x80, 0x02, 0xd2, 0x7f, 0xff, 0xff, 0xfd, 0xd2, 0x7f, 0xff, 0xff, 0xfe, 0xd2, 0x7f, 0xff, 0xff, 0xff }) != 0 { t.Error("wrong output", b.Bytes()) }
} }
func TestPackInt64(t *testing.T) { func TestPackInt64(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
for _, i := range []int64 { -9223372036854775808, -9223372036854775807, -9223372036854775806, -2147483651, -2147483650, -2147483649, -2147483648, -2147483647, -2147483646, -32771, -32770, -32769, -32768, -32767, -131, -130, -129, -128, -127, -34, -33, -32, -31, 0, 1, 126, 127, 128, 129, 130, 32765, 32766, 32767, 32768, 32769, 32770, 2147483645, 2147483646, 2147483647, 2147483648, 2147483649, 2147483650, 4294967296, 4294967297, 4294967298 } { for _, i := range []int64{-9223372036854775808, -9223372036854775807, -9223372036854775806, -2147483651, -2147483650, -2147483649, -2147483648, -2147483647, -2147483646, -32771, -32770, -32769, -32768, -32767, -131, -130, -129, -128, -127, -34, -33, -32, -31, 0, 1, 126, 127, 128, 129, 130, 32765, 32766, 32767, 32768, 32769, 32770, 2147483645, 2147483646, 2147483647, 2147483648, 2147483649, 2147483650, 4294967296, 4294967297, 4294967298} {
_, err := PackInt64(b, i) _, err := PackInt64(b, i)
if err != nil { t.Error("err != nil") } if err != nil {
t.Error("err != nil")
}
}
if bytes.Compare(b.Bytes(), []byte{0xd3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xd3, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xd3, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfe, 0xd3, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xd2, 0x80, 0x00, 0x00, 0x00, 0xd2, 0x80, 0x00, 0x00, 0x01, 0xd2, 0x80, 0x00, 0x00, 0x02, 0xd2, 0xff, 0xff, 0x7f, 0xfd, 0xd2, 0xff, 0xff, 0x7f, 0xfe, 0xd2, 0xff, 0xff, 0x7f, 0xff, 0xd1, 0x80, 0x00, 0xd1, 0x80, 0x01, 0xd1, 0xff, 0x7d, 0xd1, 0xff, 0x7e, 0xd1, 0xff, 0x7f, 0xd0, 0x80, 0xd0, 0x81, 0xd0, 0xde, 0xd0, 0xdf, 0xe0, 0xe1, 0x00, 0x01, 0x7e, 0x7f, 0xd1, 0x00, 0x80, 0xd1, 0x00, 0x81, 0xd1, 0x00, 0x82, 0xd1, 0x7f, 0xfd, 0xd1, 0x7f, 0xfe, 0xd1, 0x7f, 0xff, 0xd2, 0x00, 0x00, 0x80, 0x00, 0xd2, 0x00, 0x00, 0x80, 0x01, 0xd2, 0x00, 0x00, 0x80, 0x02, 0xd2, 0x7f, 0xff, 0xff, 0xfd, 0xd2, 0x7f, 0xff, 0xff, 0xfe, 0xd2, 0x7f, 0xff, 0xff, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0xd3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02}) != 0 {
t.Error("wrong output", b.Bytes())
} }
if bytes.Compare(b.Bytes(), []byte { 0xd3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xd3, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xd3, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfe, 0xd3, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xd2, 0x80, 0x00, 0x00, 0x00, 0xd2, 0x80, 0x00, 0x00, 0x01, 0xd2, 0x80, 0x00, 0x00, 0x02, 0xd2, 0xff, 0xff, 0x7f, 0xfd, 0xd2, 0xff, 0xff, 0x7f, 0xfe, 0xd2, 0xff, 0xff, 0x7f, 0xff, 0xd1, 0x80, 0x00, 0xd1, 0x80, 0x01, 0xd1, 0xff, 0x7d, 0xd1, 0xff, 0x7e, 0xd1, 0xff, 0x7f, 0xd0, 0x80, 0xd0, 0x81, 0xd0, 0xde, 0xd0, 0xdf, 0xe0, 0xe1, 0x00, 0x01, 0x7e, 0x7f, 0xd1, 0x00, 0x80, 0xd1, 0x00, 0x81, 0xd1, 0x00, 0x82, 0xd1, 0x7f, 0xfd, 0xd1, 0x7f, 0xfe, 0xd1, 0x7f, 0xff, 0xd2, 0x00, 0x00, 0x80, 0x00, 0xd2, 0x00, 0x00, 0x80, 0x01, 0xd2, 0x00, 0x00, 0x80, 0x02, 0xd2, 0x7f, 0xff, 0xff, 0xfd, 0xd2, 0x7f, 0xff, 0xff, 0xfe, 0xd2, 0x7f, 0xff, 0xff, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0xd3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02 }) != 0 { t.Error("wrong output", b.Bytes()) }
} }
func TestPackNil(t *testing.T) { func TestPackNil(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
nbyteswrite, err := PackNil(b) nbyteswrite, err := PackNil(b)
if nbyteswrite != 1 { t.Error("nbyteswrite != 1") } if nbyteswrite != 1 {
if err != nil { t.Error("err != nil") } t.Error("nbyteswrite != 1")
if bytes.Compare(b.Bytes(), []byte { 0xc0 }) != 0 { t.Error("wrong output", b.Bytes()) } }
if err != nil {
t.Error("err != nil")
}
if bytes.Compare(b.Bytes(), []byte{0xc0}) != 0 {
t.Error("wrong output", b.Bytes())
}
} }
func TestPackBool(t *testing.T) { func TestPackBool(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
for _, i := range []bool { false, true } { for _, i := range []bool{false, true} {
nbyteswrite, err := PackBool(b, i) nbyteswrite, err := PackBool(b, i)
if nbyteswrite != 1 { t.Error("nbyteswrite != 1") } if nbyteswrite != 1 {
if err != nil { t.Error("err != nil") } t.Error("nbyteswrite != 1")
}
if err != nil {
t.Error("err != nil")
}
}
if bytes.Compare(b.Bytes(), []byte{0xc2, 0xc3}) != 0 {
t.Error("wrong output", b.Bytes())
} }
if bytes.Compare(b.Bytes(), []byte { 0xc2, 0xc3 }) != 0 { t.Error("wrong output", b.Bytes()) }
} }
func TestPackInt32Array(t *testing.T) { func TestPackInt32Array(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
_, err := PackInt32Array(b, []int32 {}) _, err := PackInt32Array(b, []int32{})
if err != nil { t.Error("err != nil") } if err != nil {
_, err = PackInt32Array(b, []int32 { 0 }) t.Error("err != nil")
if err != nil { t.Error("err != nil") } }
_, err = PackInt32Array(b, []int32 { 0, 1 }) _, err = PackInt32Array(b, []int32{0})
if err != nil { t.Error("err != nil") } if err != nil {
_, err = PackInt32Array(b, []int32 { 0, 1, 2 }) t.Error("err != nil")
if err != nil { t.Error("err != nil") } }
if bytes.Compare(b.Bytes(), []byte { 0x90, 0x91, 0x00, 0x92, 0x00, 0x01, 0x93, 0x00, 0x01, 0x02 }) != 0 { t.Error("wrong output", b.Bytes()) } _, err = PackInt32Array(b, []int32{0, 1})
if err != nil {
t.Error("err != nil")
}
_, err = PackInt32Array(b, []int32{0, 1, 2})
if err != nil {
t.Error("err != nil")
}
if bytes.Compare(b.Bytes(), []byte{0x90, 0x91, 0x00, 0x92, 0x00, 0x01, 0x93, 0x00, 0x01, 0x02}) != 0 {
t.Error("wrong output", b.Bytes())
}
} }
func TestPackArray(t *testing.T) { func TestPackArray(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
_, err := PackArray(b, reflect.NewValue([]int32 {}).(reflect.ArrayOrSliceValue)) _, err := PackArray(b, reflect.ValueOf([]int32{}))
if err != nil { t.Error("err != nil") } if err != nil {
_, err = PackArray(b, reflect.NewValue([]int32 { 0 }).(reflect.ArrayOrSliceValue)) t.Error("err != nil")
if err != nil { t.Error("err != nil") } }
_, err = PackArray(b, reflect.NewValue([]int32 { 0, 1 }).(reflect.ArrayOrSliceValue)) _, err = PackArray(b, reflect.ValueOf([]int32{0}))
if err != nil { t.Error("err != nil") } if err != nil {
_, err = PackArray(b, reflect.NewValue([]int32 { 0, 1, 2 }).(reflect.ArrayOrSliceValue)) t.Error("err != nil")
if err != nil { t.Error("err != nil") } }
if bytes.Compare(b.Bytes(), []byte { 0x90, 0x91, 0x00, 0x92, 0x00, 0x01, 0x93, 0x00, 0x01, 0x02 }) != 0 { t.Error("wrong output", b.Bytes()) } _, err = PackArray(b, reflect.ValueOf([]int32{0, 1}))
if err != nil {
t.Error("err != nil")
}
_, err = PackArray(b, reflect.ValueOf([]int32{0, 1, 2}))
if err != nil {
t.Error("err != nil")
}
if bytes.Compare(b.Bytes(), []byte{0x90, 0x91, 0x00, 0x92, 0x00, 0x01, 0x93, 0x00, 0x01, 0x02}) != 0 {
t.Error("wrong output", b.Bytes())
}
} }
func TestPackMap(t *testing.T) { func TestPackMap(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
_, err := PackMap(b, reflect.NewValue(map[int] int { 0: 1, 2: 3, 4: 5 }).(*reflect.MapValue)) _, err := PackMap(b, reflect.ValueOf(map[int]int{0: 1, 2: 3, 4: 5}))
if err != nil { t.Error("err != nil") } if err != nil {
if bytes.Compare(b.Bytes(), []byte { 0x83, 0x00, 0x01, 0x04, 0x05, 0x02, 0x03 }) != 0 { t.Error("wrong output", b.Bytes()) } t.Error("err != nil")
}
if bytes.Compare(b.Bytes(), []byte{0x83, 0x00, 0x01, 0x04, 0x05, 0x02, 0x03}) != 0 {
t.Error("wrong output", b.Bytes())
}
} }
func TestPack(t *testing.T) { func TestPack(t *testing.T) {
b := &bytes.Buffer{} b := &bytes.Buffer{}
for _, i := range [](interface{}) { nil, false, true, 0, 1, 2, 3, 127, -32, -1, -33, 128 } { for _, i := range [](interface{}){nil, false, true, 0, 1, 2, 3, 127, -32, -1, -33, 128} {
_, err := Pack(b, i) _, err := Pack(b, i)
if err != nil { t.Error("err != nil") } if err != nil {
t.Error("err != nil")
}
}
if bytes.Compare(b.Bytes(), []byte{0xc0, 0xc2, 0xc3, 0x00, 0x01, 0x02, 0x03, 0x7f, 0xf0, 0xff, 0xd0, 0xef, 0xd1, 0x00, 0x80}) == 0 {
t.Error("wrong output")
} }
if bytes.Compare(b.Bytes(), []byte { 0xc0, 0xc2, 0xc3, 0x00, 0x01, 0x02, 0x03, 0x7f, 0xf0, 0xff, 0xd0, 0xef, 0xd1, 0x00, 0x80 }) == 0 { t.Error("wrong output") }
} }
func TestUnpackArray(t *testing.T) { func TestUnpackArray(t *testing.T) {
b := bytes.NewBuffer([]byte { 0x90, 0x91, 0x00, 0x92, 0x00, 0x01, 0x93, 0xd1, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xdc, 0x00, 0x02, 0x00, 0x01, 0xdd, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x02, 0x03 }) b := bytes.NewBuffer([]byte{0x90, 0x91, 0x00, 0x92, 0x00, 0x01, 0x93, 0xd1, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xdc, 0x00, 0x02, 0x00, 0x01, 0xdd, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x02, 0x03})
for _, v := range [](interface{}) { [](interface{}) {}, [](interface{}) { int8(0) }, [](interface{}) { int8(0), int8(1) }, [](interface{}) { int16(0), int32(1), int64(2) }, [](interface{}){ int8(0), int8(1) }, [](interface{}) { int8(0), int8(1), int8(2), int8(3) } } { for _, v := range [](interface{}){[](interface{}){}, [](interface{}){int8(0)}, [](interface{}){int8(0), int8(1)}, [](interface{}){int16(0), int32(1), int64(2)}, [](interface{}){int8(0), int8(1)}, [](interface{}){int8(0), int8(1), int8(2), int8(3)}} {
retval, _, e := Unpack(b) retval, _, e := Unpack(b)
if e != nil { t.Error("err != nil") } if e != nil {
if !equal(reflect.NewValue(retval.Interface()), reflect.NewValue(v)) { t.Errorf("%s != %s", retval.Interface(), v) } t.Error("err != nil")
}
if !equal(reflect.ValueOf(retval.Interface()), reflect.ValueOf(v)) {
t.Errorf("%s != %s", retval.Interface(), v)
}
} }
} }
func TestUnpackInt(t *testing.T) { func TestUnpackInt(t *testing.T) {
b := bytes.NewBuffer([]byte { 0xff, 0xe0, 0x00, 0x01, 0x02, 0x7d, 0x7e, 0x7f, 0xd0, 0x01, 0xd0, 0x80, 0xd0, 0xff, 0xcc, 0x80, 0xcc, 0xfd, 0xcc, 0xfe, 0xcc, 0xff, 0xd1, 0x00, 0x00, 0xd1, 0x7f, 0xff, 0xd1, 0xff, 0xff, 0xcd, 0x80, 0x00, 0xcd, 0xff, 0xff, 0xd2, 0x7f, 0xff, 0xff, 0xff, 0xce, 0x7f, 0xff, 0xff, 0xff, 0xd3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }) b := bytes.NewBuffer([]byte{0xff, 0xe0, 0x00, 0x01, 0x02, 0x7d, 0x7e, 0x7f, 0xd0, 0x01, 0xd0, 0x80, 0xd0, 0xff, 0xcc, 0x80, 0xcc, 0xfd, 0xcc, 0xfe, 0xcc, 0xff, 0xd1, 0x00, 0x00, 0xd1, 0x7f, 0xff, 0xd1, 0xff, 0xff, 0xcd, 0x80, 0x00, 0xcd, 0xff, 0xff, 0xd2, 0x7f, 0xff, 0xff, 0xff, 0xce, 0x7f, 0xff, 0xff, 0xff, 0xd3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff})
for _, v := range [](interface{}) { for _, v := range [](interface{}){
int8(-1), int8(-32), int8(0), int8(1), int8(2), int8(125), int8(126), int8(127), int8(1), int8(-128), int8(-1), uint8(128), uint8(253), uint8(254), uint8(255), int16(0), int16(32767), int16(-1), uint16(32768), uint16(65535), int32(2147483647), uint32(2147483647), int64(9223372036854775807), uint64(18446744073709551615) } { int8(-1), int8(-32), int8(0), int8(1), int8(2), int8(125), int8(126), int8(127), int8(1), int8(-128), int8(-1), uint8(128), uint8(253), uint8(254), uint8(255), int16(0), int16(32767), int16(-1), uint16(32768), uint16(65535), int32(2147483647), uint32(2147483647), int64(9223372036854775807), uint64(18446744073709551615)} {
retval, _, e := Unpack(b) retval, _, e := Unpack(b)
if e != nil { t.Error("err != nil") } if e != nil {
if retval.Interface() != v { t.Errorf("%u != %u", retval.Interface(), v) } t.Error("err != nil")
}
if retval.Interface() != v {
t.Errorf("%u != %u", retval.Interface(), v)
}
} }
} }
func TestUnpackFloat(t *testing.T) { func TestUnpackFloat(t *testing.T) {
b := bytes.NewBuffer([]byte { 0xca, 0x3d, 0xcc, 0xcc, 0xcd, 0xca, 0x3e, 0x4c, 0xcc, 0xcd, 0xca, 0xbd, 0xcc, 0xcc, 0xcd, 0xca, 0xbe, 0x4c, 0xcc, 0xcd, 0xca, 0x7f, 0x80, 0x00, 0x00, 0xca, 0xff, 0x80, 0x00, 0x00, 0xca, 0xff, 0xc0, 0x00, 0x0, 0xcb, 0x3f, 0xb9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, 0xcb, 0x3f, 0xc9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, 0xcb, 0xbf, 0xb9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, 0xcb, 0xbf, 0xc9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, 0xcb, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xcb, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }) b := bytes.NewBuffer([]byte{0xca, 0x3d, 0xcc, 0xcc, 0xcd, 0xca, 0x3e, 0x4c, 0xcc, 0xcd, 0xca, 0xbd, 0xcc, 0xcc, 0xcd, 0xca, 0xbe, 0x4c, 0xcc, 0xcd, 0xca, 0x7f, 0x80, 0x00, 0x00, 0xca, 0xff, 0x80, 0x00, 0x00, 0xca, 0xff, 0xc0, 0x00, 0x0, 0xcb, 0x3f, 0xb9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, 0xcb, 0x3f, 0xc9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, 0xcb, 0xbf, 0xb9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, 0xcb, 0xbf, 0xc9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, 0xcb, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xcb, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
for _, v := range [](interface{}) { float32(.1), float32(.2), float32(-.1), float32(-.2), float32(math.Inf(1)), float32(math.Inf(-1)), float32(math.NaN()), float64(.1), float64(.2), float64(-.1), float64(-.2) } { for _, v := range [](interface{}){float32(.1), float32(.2), float32(-.1), float32(-.2), float32(math.Inf(1)), float32(math.Inf(-1)), float32(math.NaN()), float64(.1), float64(.2), float64(-.1), float64(-.2)} {
retval, _, e := Unpack(b) retval, _, e := Unpack(b)
if e != nil { t.Error("err != nil") } if e != nil {
t.Error("err != nil")
}
isnan := false isnan := false
if _v, ok := v.(float64); ok { if _v, ok := v.(float64); ok {
isnan = math.IsNaN(_v) isnan = math.IsNaN(_v)
@ -210,9 +306,13 @@ func TestUnpackFloat(t *testing.T) {
isnan = math.IsNaN(float64(_v)) isnan = math.IsNaN(float64(_v))
} }
if isnan { if isnan {
if retval.Interface() == v { t.Errorf("[NaN] %u == %u", retval.Interface(), v) } if retval.Interface() == v {
t.Errorf("[NaN] %u == %u", retval.Interface(), v)
}
} else { } else {
if retval.Interface() != v { t.Errorf("%u != %u", retval.Interface(), v) } if retval.Interface() != v {
t.Errorf("%u != %u", retval.Interface(), v)
}
} }
} }
} }

View File

@ -5,54 +5,54 @@ import (
"os" "os"
"unsafe" "unsafe"
"reflect" "reflect"
); )
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackUint8(writer io.Writer, value uint8) (n int, err os.Error) { func PackUint8(writer io.Writer, value uint8) (n int, err os.Error) {
if value < 128 { if value < 128 {
return writer.Write([]byte { byte(value) }) return writer.Write([]byte{byte(value)})
} }
return writer.Write([]byte { 0xcc, byte(value) }) return writer.Write([]byte{0xcc, byte(value)})
} }
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackUint16(writer io.Writer, value uint16) (n int, err os.Error) { func PackUint16(writer io.Writer, value uint16) (n int, err os.Error) {
if value < 128 { if value < 128 {
return writer.Write([]byte { byte(value) }) return writer.Write([]byte{byte(value)})
} else if value < 256 { } else if value < 256 {
return writer.Write([]byte { 0xcc, byte(value) }) return writer.Write([]byte{0xcc, byte(value)})
} }
return writer.Write([]byte { 0xcd, byte(value >> 8), byte(value) }) return writer.Write([]byte{0xcd, byte(value >> 8), byte(value)})
} }
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackUint32(writer io.Writer, value uint32) (n int, err os.Error) { func PackUint32(writer io.Writer, value uint32) (n int, err os.Error) {
if value < 128 { if value < 128 {
return writer.Write([]byte { byte(value) }) return writer.Write([]byte{byte(value)})
} else if value < 256 { } else if value < 256 {
return writer.Write([]byte { 0xcc, byte(value) }) return writer.Write([]byte{0xcc, byte(value)})
} else if value < 65536 { } else if value < 65536 {
return writer.Write([]byte { 0xcd, byte(value >> 8), byte(value) }) return writer.Write([]byte{0xcd, byte(value >> 8), byte(value)})
} }
return writer.Write([]byte { 0xce, byte(value >> 24), byte(value >> 16), byte(value >> 8), byte(value) }) return writer.Write([]byte{0xce, byte(value >> 24), byte(value >> 16), byte(value >> 8), byte(value)})
} }
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackUint64(writer io.Writer, value uint64) (n int, err os.Error) { func PackUint64(writer io.Writer, value uint64) (n int, err os.Error) {
if value < 128 { if value < 128 {
return writer.Write([]byte { byte(value) }) return writer.Write([]byte{byte(value)})
} else if value < 256 { } else if value < 256 {
return writer.Write([]byte { 0xcc, byte(value) }) return writer.Write([]byte{0xcc, byte(value)})
} else if value < 65536 { } else if value < 65536 {
return writer.Write([]byte { 0xcd, byte(value >> 8), byte(value) }) return writer.Write([]byte{0xcd, byte(value >> 8), byte(value)})
} else if value < 4294967296 { } else if value < 4294967296 {
return writer.Write([]byte { 0xce, byte(value >> 24), byte(value >> 16), byte(value >> 8), byte(value) }) return writer.Write([]byte{0xce, byte(value >> 24), byte(value >> 16), byte(value >> 8), byte(value)})
} }
return writer.Write([]byte { 0xcf, byte(value >> 56), byte(value >> 48), byte(value >> 40), byte(value >> 32), byte(value >> 24), byte(value >> 16), byte(value >> 8), byte(value) }) return writer.Write([]byte{0xcf, byte(value >> 56), byte(value >> 48), byte(value >> 40), byte(value >> 32), byte(value >> 24), byte(value >> 16), byte(value >> 8), byte(value)})
} }
func PackUint(writer io.Writer, value uint) (n int, err os.Error) { func PackUint(writer io.Writer, value uint) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
switch unsafe.Sizeof(value) { switch unsafe.Sizeof(value) {
case 4: case 4:
return PackUint32(writer, *(*uint32)(unsafe.Pointer(&value))) return PackUint32(writer, *(*uint32)(unsafe.Pointer(&value)))
@ -65,47 +65,47 @@ func PackUint(writer io.Writer, value uint) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackInt8(writer io.Writer, value int8) (n int, err os.Error) { func PackInt8(writer io.Writer, value int8) (n int, err os.Error) {
if value < -32 { if value < -32 {
return writer.Write([]byte { 0xd0, byte(value) }) return writer.Write([]byte{0xd0, byte(value)})
} }
return writer.Write([]byte { byte(value) }) return writer.Write([]byte{byte(value)})
} }
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackInt16(writer io.Writer, value int16) (n int, err os.Error) { func PackInt16(writer io.Writer, value int16) (n int, err os.Error) {
if value < -128 || value >= 128 { if value < -128 || value >= 128 {
return writer.Write([]byte { 0xd1, byte(uint16(value) >> 8), byte(value) }) return writer.Write([]byte{0xd1, byte(uint16(value) >> 8), byte(value)})
} else if value < -32 { } else if value < -32 {
return writer.Write([]byte { 0xd0, byte(value) }) return writer.Write([]byte{0xd0, byte(value)})
} }
return writer.Write([]byte { byte(value) }) return writer.Write([]byte{byte(value)})
} }
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackInt32(writer io.Writer, value int32) (n int, err os.Error) { func PackInt32(writer io.Writer, value int32) (n int, err os.Error) {
if value < -32768 || value >= 32768 { if value < -32768 || value >= 32768 {
return writer.Write([]byte { 0xd2, byte(uint32(value) >> 24), byte(uint32(value) >> 16), byte(uint32(value) >> 8), byte(value) }) return writer.Write([]byte{0xd2, byte(uint32(value) >> 24), byte(uint32(value) >> 16), byte(uint32(value) >> 8), byte(value)})
} else if value < -128 { } else if value < -128 {
return writer.Write([]byte { 0xd1, byte(uint32(value) >> 8), byte(value) }) return writer.Write([]byte{0xd1, byte(uint32(value) >> 8), byte(value)})
} else if value < -32 { } else if value < -32 {
return writer.Write([]byte { 0xd0, byte(value) }) return writer.Write([]byte{0xd0, byte(value)})
} else if value >= 128 { } else if value >= 128 {
return writer.Write([]byte { 0xd1, byte(uint32(value) >> 8), byte(value) }) return writer.Write([]byte{0xd1, byte(uint32(value) >> 8), byte(value)})
} }
return writer.Write([]byte { byte(value) }) return writer.Write([]byte{byte(value)})
} }
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackInt64(writer io.Writer, value int64) (n int, err os.Error) { func PackInt64(writer io.Writer, value int64) (n int, err os.Error) {
if value < -2147483648 || value >= 2147483648 { if value < -2147483648 || value >= 2147483648 {
return writer.Write([]byte { 0xd3, byte(uint64(value) >> 56), byte(uint64(value) >> 48), byte(uint64(value) >> 40), byte(uint64(value) >> 32), byte(uint64(value) >> 24), byte(uint64(value) >> 16), byte(uint64(value) >> 8), byte(value) }) return writer.Write([]byte{0xd3, byte(uint64(value) >> 56), byte(uint64(value) >> 48), byte(uint64(value) >> 40), byte(uint64(value) >> 32), byte(uint64(value) >> 24), byte(uint64(value) >> 16), byte(uint64(value) >> 8), byte(value)})
} else if value < -32768 || value >= 32768 { } else if value < -32768 || value >= 32768 {
return writer.Write([]byte { 0xd2, byte(uint64(value) >> 24), byte(uint64(value) >> 16), byte(uint64(value) >> 8), byte(value) }) return writer.Write([]byte{0xd2, byte(uint64(value) >> 24), byte(uint64(value) >> 16), byte(uint64(value) >> 8), byte(value)})
} else if value < -128 || value >= 128 { } else if value < -128 || value >= 128 {
return writer.Write([]byte { 0xd1, byte(uint64(value) >> 8), byte(value) }) return writer.Write([]byte{0xd1, byte(uint64(value) >> 8), byte(value)})
} else if value < -32 { } else if value < -32 {
return writer.Write([]byte { 0xd0, byte(value) }) return writer.Write([]byte{0xd0, byte(value)})
} }
return writer.Write([]byte { byte(value) }) return writer.Write([]byte{byte(value)})
} }
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
@ -121,18 +121,18 @@ func PackInt(writer io.Writer, value int) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackNil(writer io.Writer) (n int, err os.Error) { func PackNil(writer io.Writer) (n int, err os.Error) {
return writer.Write([]byte{ 0xc0 }) return writer.Write([]byte{0xc0})
} }
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackBool(writer io.Writer, value bool) (n int, err os.Error) { func PackBool(writer io.Writer, value bool) (n int, err os.Error) {
var code byte; var code byte
if value { if value {
code = 0xc3 code = 0xc3
} else { } else {
code = 0xc2 code = 0xc2
} }
return writer.Write([]byte{ code }) return writer.Write([]byte{code})
} }
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
@ -148,18 +148,24 @@ func PackFloat64(writer io.Writer, value float64) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackBytes(writer io.Writer, value []byte) (n int, err os.Error) { func PackBytes(writer io.Writer, value []byte) (n int, err os.Error) {
if len(value) < 32 { if len(value) < 32 {
n1, err := writer.Write([]byte { 0xa0 | uint8(len(value)) }) n1, err := writer.Write([]byte{0xa0 | uint8(len(value))})
if err != nil { return n1, err } if err != nil {
return n1, err
}
n2, err := writer.Write(value) n2, err := writer.Write(value)
return n1 + n2, err return n1 + n2, err
} else if len(value) < 65536 { } else if len(value) < 65536 {
n1, err := writer.Write([]byte { 0xda, byte(len(value) >> 16), byte(len(value)) }) n1, err := writer.Write([]byte{0xda, byte(len(value) >> 16), byte(len(value))})
if err != nil { return n1, err } if err != nil {
return n1, err
}
n2, err := writer.Write(value) n2, err := writer.Write(value)
return n1 + n2, err return n1 + n2, err
} }
n1, err := writer.Write([]byte { 0xdb, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value)) }) n1, err := writer.Write([]byte{0xdb, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value))})
if err != nil { return n1, err } if err != nil {
return n1, err
}
n2, err := writer.Write(value) n2, err := writer.Write(value)
return n1 + n2, err return n1 + n2, err
} }
@ -167,27 +173,39 @@ func PackBytes(writer io.Writer, value []byte) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackUint16Array(writer io.Writer, value []uint16) (n int, err os.Error) { func PackUint16Array(writer io.Writer, value []uint16) (n int, err os.Error) {
if len(value) < 16 { if len(value) < 16 {
n, err := writer.Write([]byte { 0x90 | byte(len(value)) }) n, err := writer.Write([]byte{0x90 | byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackUint16(writer, i) _n, err := PackUint16(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else if len(value) < 65536 { } else if len(value) < 65536 {
n, err := writer.Write([]byte { 0xdc, byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdc, byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackUint16(writer, i) _n, err := PackUint16(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else { } else {
n, err := writer.Write([]byte { 0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackUint16(writer, i) _n, err := PackUint16(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} }
@ -197,27 +215,39 @@ func PackUint16Array(writer io.Writer, value []uint16) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackUint32Array(writer io.Writer, value []uint32) (n int, err os.Error) { func PackUint32Array(writer io.Writer, value []uint32) (n int, err os.Error) {
if len(value) < 16 { if len(value) < 16 {
n, err := writer.Write([]byte { 0x90 | byte(len(value)) }) n, err := writer.Write([]byte{0x90 | byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackUint32(writer, i) _n, err := PackUint32(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else if len(value) < 65536 { } else if len(value) < 65536 {
n, err := writer.Write([]byte { 0xdc, byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdc, byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackUint32(writer, i) _n, err := PackUint32(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else { } else {
n, err := writer.Write([]byte { 0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackUint32(writer, i) _n, err := PackUint32(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} }
@ -227,27 +257,39 @@ func PackUint32Array(writer io.Writer, value []uint32) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackUint64Array(writer io.Writer, value []uint64) (n int, err os.Error) { func PackUint64Array(writer io.Writer, value []uint64) (n int, err os.Error) {
if len(value) < 16 { if len(value) < 16 {
n, err := writer.Write([]byte { 0x90 | byte(len(value)) }) n, err := writer.Write([]byte{0x90 | byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackUint64(writer, i) _n, err := PackUint64(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else if len(value) < 65536 { } else if len(value) < 65536 {
n, err := writer.Write([]byte { 0xdc, byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdc, byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackUint64(writer, i) _n, err := PackUint64(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else { } else {
n, err := writer.Write([]byte { 0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackUint64(writer, i) _n, err := PackUint64(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} }
@ -268,27 +310,39 @@ func PackUintArray(writer io.Writer, value []uint) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackInt8Array(writer io.Writer, value []int8) (n int, err os.Error) { func PackInt8Array(writer io.Writer, value []int8) (n int, err os.Error) {
if len(value) < 16 { if len(value) < 16 {
n, err := writer.Write([]byte { 0x90 | byte(len(value)) }) n, err := writer.Write([]byte{0x90 | byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackInt8(writer, i) _n, err := PackInt8(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else if len(value) < 65536 { } else if len(value) < 65536 {
n, err := writer.Write([]byte { 0xdc, byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdc, byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackInt8(writer, i) _n, err := PackInt8(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else { } else {
n, err := writer.Write([]byte { 0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackInt8(writer, i) _n, err := PackInt8(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} }
@ -298,27 +352,39 @@ func PackInt8Array(writer io.Writer, value []int8) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackInt16Array(writer io.Writer, value []int16) (n int, err os.Error) { func PackInt16Array(writer io.Writer, value []int16) (n int, err os.Error) {
if len(value) < 16 { if len(value) < 16 {
n, err := writer.Write([]byte { 0x90 | byte(len(value)) }) n, err := writer.Write([]byte{0x90 | byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackInt16(writer, i) _n, err := PackInt16(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else if len(value) < 65536 { } else if len(value) < 65536 {
n, err := writer.Write([]byte { 0xdc, byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdc, byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackInt16(writer, i) _n, err := PackInt16(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else { } else {
n, err := writer.Write([]byte { 0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackInt16(writer, i) _n, err := PackInt16(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} }
@ -328,27 +394,39 @@ func PackInt16Array(writer io.Writer, value []int16) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackInt32Array(writer io.Writer, value []int32) (n int, err os.Error) { func PackInt32Array(writer io.Writer, value []int32) (n int, err os.Error) {
if len(value) < 16 { if len(value) < 16 {
n, err := writer.Write([]byte { 0x90 | byte(len(value)) }) n, err := writer.Write([]byte{0x90 | byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackInt32(writer, i) _n, err := PackInt32(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else if len(value) < 65536 { } else if len(value) < 65536 {
n, err := writer.Write([]byte { 0xdc, byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdc, byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackInt32(writer, i) _n, err := PackInt32(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else { } else {
n, err := writer.Write([]byte { 0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackInt32(writer, i) _n, err := PackInt32(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} }
@ -358,27 +436,39 @@ func PackInt32Array(writer io.Writer, value []int32) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackInt64Array(writer io.Writer, value []int64) (n int, err os.Error) { func PackInt64Array(writer io.Writer, value []int64) (n int, err os.Error) {
if len(value) < 16 { if len(value) < 16 {
n, err := writer.Write([]byte { 0x90 | byte(len(value)) }) n, err := writer.Write([]byte{0x90 | byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackInt64(writer, i) _n, err := PackInt64(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else if len(value) < 65536 { } else if len(value) < 65536 {
n, err := writer.Write([]byte { 0xdc, byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdc, byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackInt64(writer, i) _n, err := PackInt64(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else { } else {
n, err := writer.Write([]byte { 0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackInt64(writer, i) _n, err := PackInt64(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} }
@ -399,27 +489,39 @@ func PackIntArray(writer io.Writer, value []int) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackFloat32Array(writer io.Writer, value []float32) (n int, err os.Error) { func PackFloat32Array(writer io.Writer, value []float32) (n int, err os.Error) {
if len(value) < 16 { if len(value) < 16 {
n, err := writer.Write([]byte { 0x90 | byte(len(value)) }) n, err := writer.Write([]byte{0x90 | byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackFloat32(writer, i) _n, err := PackFloat32(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else if len(value) < 65536 { } else if len(value) < 65536 {
n, err := writer.Write([]byte { 0xdc, byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdc, byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackFloat32(writer, i) _n, err := PackFloat32(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else { } else {
n, err := writer.Write([]byte { 0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackFloat32(writer, i) _n, err := PackFloat32(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} }
@ -429,27 +531,39 @@ func PackFloat32Array(writer io.Writer, value []float32) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackFloat64Array(writer io.Writer, value []float64) (n int, err os.Error) { func PackFloat64Array(writer io.Writer, value []float64) (n int, err os.Error) {
if len(value) < 16 { if len(value) < 16 {
n, err := writer.Write([]byte { 0x90 | byte(len(value)) }) n, err := writer.Write([]byte{0x90 | byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackFloat64(writer, i) _n, err := PackFloat64(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else if len(value) < 65536 { } else if len(value) < 65536 {
n, err := writer.Write([]byte { 0xdc, byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdc, byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackFloat64(writer, i) _n, err := PackFloat64(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else { } else {
n, err := writer.Write([]byte { 0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value)) }) n, err := writer.Write([]byte{0xdd, byte(len(value) >> 24), byte(len(value) >> 16), byte(len(value) >> 8), byte(len(value))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, i := range value { for _, i := range value {
_n, err := PackFloat64(writer, i) _n, err := PackFloat64(writer, i)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} }
@ -457,37 +571,50 @@ func PackFloat64Array(writer io.Writer, value []float64) (n int, err os.Error) {
} }
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackArray(writer io.Writer, value reflect.ArrayOrSliceValue) (n int, err os.Error) { func PackArray(writer io.Writer, value reflect.Value) (n int, err os.Error) {
{ {
elemType, ok := value.Type().(reflect.ArrayOrSliceType).Elem().(*reflect.UintType) elemType := value.Type().Elem()
if ok && elemType.Kind() == reflect.Uint8 { if (elemType.Kind() == reflect.Uint || elemType.Kind() == reflect.Uint8 || elemType.Kind() == reflect.Uint16 || elemType.Kind() == reflect.Uint32 || elemType.Kind() == reflect.Uint64 || elemType.Kind() == reflect.Uintptr) &&
elemType.Kind() == reflect.Uint8 {
return PackBytes(writer, value.Interface().([]byte)) return PackBytes(writer, value.Interface().([]byte))
} }
} }
l := value.Len() l := value.Len()
if l < 16 { if l < 16 {
n, err := writer.Write([]byte { 0x90 | byte(l) }) n, err := writer.Write([]byte{0x90 | byte(l)})
if err != nil { return n, err } if err != nil {
return n, err
}
for i := 0; i < l; i++ { for i := 0; i < l; i++ {
_n, err := PackValue(writer, value.Elem(i)) _n, err := PackValue(writer, value.Index(i))
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else if l < 65536 { } else if l < 65536 {
n, err := writer.Write([]byte { 0xdc, byte(l >> 8), byte(l) }) n, err := writer.Write([]byte{0xdc, byte(l >> 8), byte(l)})
if err != nil { return n, err } if err != nil {
return n, err
}
for i := 0; i < l; i++ { for i := 0; i < l; i++ {
_n, err := PackValue(writer, value.Elem(i)) _n, err := PackValue(writer, value.Index(i))
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else { } else {
n, err := writer.Write([]byte { 0xdd, byte(l >> 24), byte(l >> 16), byte(l >> 8), byte(l) }) n, err := writer.Write([]byte{0xdd, byte(l >> 24), byte(l >> 16), byte(l >> 8), byte(l)})
if err != nil { return n, err } if err != nil {
return n, err
}
for i := 0; i < l; i++ { for i := 0; i < l; i++ {
_n, err := PackValue(writer, value.Elem(i)) _n, err := PackValue(writer, value.Index(i))
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} }
@ -495,39 +622,57 @@ func PackArray(writer io.Writer, value reflect.ArrayOrSliceValue) (n int, err os
} }
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackMap(writer io.Writer, value *reflect.MapValue) (n int, err os.Error) { func PackMap(writer io.Writer, value reflect.Value) (n int, err os.Error) {
keys := value.Keys() keys := value.MapKeys()
if value.Len() < 16 { if value.Len() < 16 {
n, err := writer.Write([]byte { 0x80 | byte(len(keys)) }) n, err := writer.Write([]byte{0x80 | byte(len(keys))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, k := range keys { for _, k := range keys {
_n, err := PackValue(writer, k) _n, err := PackValue(writer, k)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
_n, err = PackValue(writer, value.Elem(k)) _n, err = PackValue(writer, value.MapIndex(k))
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else if value.Len() < 65536 { } else if value.Len() < 65536 {
n, err := writer.Write([]byte { 0xde, byte(len(keys) >> 8), byte(len(keys)) }) n, err := writer.Write([]byte{0xde, byte(len(keys) >> 8), byte(len(keys))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, k := range keys { for _, k := range keys {
_n, err := PackValue(writer, k) _n, err := PackValue(writer, k)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
_n, err = PackValue(writer, value.Elem(k)) _n, err = PackValue(writer, value.MapIndex(k))
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} else { } else {
n, err := writer.Write([]byte { 0xdf, byte(len(keys) >> 24), byte(len(keys) >> 16), byte(len(keys) >> 8), byte(len(keys)) }) n, err := writer.Write([]byte{0xdf, byte(len(keys) >> 24), byte(len(keys) >> 16), byte(len(keys) >> 8), byte(len(keys))})
if err != nil { return n, err } if err != nil {
return n, err
}
for _, k := range keys { for _, k := range keys {
_n, err := PackValue(writer, k) _n, err := PackValue(writer, k)
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
_n, err = PackValue(writer, value.Elem(k)) _n, err = PackValue(writer, value.MapIndex(k))
if err != nil { return n, err } if err != nil {
return n, err
}
n += _n n += _n
} }
} }
@ -536,19 +681,28 @@ func PackMap(writer io.Writer, value *reflect.MapValue) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func PackValue(writer io.Writer, value reflect.Value) (n int, err os.Error) { func PackValue(writer io.Writer, value reflect.Value) (n int, err os.Error) {
if value == nil || value.Type() == nil { return PackNil(writer) } if !value.IsValid() || value.Type() == nil {
switch _value := value.(type) { return PackNil(writer)
case *reflect.BoolValue: return PackBool(writer, _value.Get()) }
case *reflect.UintValue: return PackUint64(writer, _value.Get()) switch _value := value; _value.Kind() {
case *reflect.IntValue: return PackInt64(writer, _value.Get()) case reflect.Bool:
case *reflect.FloatValue: return PackFloat64(writer, _value.Get()) return PackBool(writer, _value.Bool())
case *reflect.ArrayValue: return PackArray(writer, _value) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
case *reflect.SliceValue: return PackArray(writer, _value) return PackUint64(writer, _value.Uint())
case *reflect.MapValue: return PackMap(writer, _value) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
case *reflect.InterfaceValue: return PackInt64(writer, _value.Int())
__value := reflect.NewValue(_value.Interface()) case reflect.Float32, reflect.Float64:
_, ok := __value.(*reflect.InterfaceValue) return PackFloat64(writer, _value.Float())
if !ok { case reflect.Array:
return PackArray(writer, _value)
case reflect.Slice:
return PackArray(writer, _value)
case reflect.Map:
return PackMap(writer, _value)
case reflect.Interface:
__value := reflect.ValueOf(_value.Interface())
if __value.Kind() != reflect.Interface {
return PackValue(writer, __value) return PackValue(writer, __value)
} }
} }
@ -557,35 +711,62 @@ func PackValue(writer io.Writer, value reflect.Value) (n int, err os.Error) {
// Packs a given value and writes it into the specified writer. // Packs a given value and writes it into the specified writer.
func Pack(writer io.Writer, value interface{}) (n int, err os.Error) { func Pack(writer io.Writer, value interface{}) (n int, err os.Error) {
if value == nil { return PackNil(writer) } if value == nil {
return PackNil(writer)
}
switch _value := value.(type) { switch _value := value.(type) {
case bool: return PackBool(writer, _value) case bool:
case uint8: return PackUint8(writer, _value) return PackBool(writer, _value)
case uint16: return PackUint16(writer, _value) case uint8:
case uint32: return PackUint32(writer, _value) return PackUint8(writer, _value)
case uint64: return PackUint64(writer, _value) case uint16:
case uint: return PackUint(writer, _value) return PackUint16(writer, _value)
case int8: return PackInt8(writer, _value) case uint32:
case int16: return PackInt16(writer, _value) return PackUint32(writer, _value)
case int32: return PackInt32(writer, _value) case uint64:
case int64: return PackInt64(writer, _value) return PackUint64(writer, _value)
case int: return PackInt(writer, _value) case uint:
case float32: return PackFloat32(writer, _value) return PackUint(writer, _value)
case float64: return PackFloat64(writer, _value) case int8:
case []byte: return PackBytes(writer, _value) return PackInt8(writer, _value)
case []uint16: return PackUint16Array(writer, _value) case int16:
case []uint32: return PackUint32Array(writer, _value) return PackInt16(writer, _value)
case []uint64: return PackUint64Array(writer, _value) case int32:
case []uint: return PackUintArray(writer, _value) return PackInt32(writer, _value)
case []int8: return PackInt8Array(writer, _value) case int64:
case []int16: return PackInt16Array(writer, _value) return PackInt64(writer, _value)
case []int32: return PackInt32Array(writer, _value) case int:
case []int64: return PackInt64Array(writer, _value) return PackInt(writer, _value)
case []int: return PackIntArray(writer, _value) case float32:
case []float32: return PackFloat32Array(writer, _value) return PackFloat32(writer, _value)
case []float64: return PackFloat64Array(writer, _value) case float64:
return PackFloat64(writer, _value)
case []byte:
return PackBytes(writer, _value)
case []uint16:
return PackUint16Array(writer, _value)
case []uint32:
return PackUint32Array(writer, _value)
case []uint64:
return PackUint64Array(writer, _value)
case []uint:
return PackUintArray(writer, _value)
case []int8:
return PackInt8Array(writer, _value)
case []int16:
return PackInt16Array(writer, _value)
case []int32:
return PackInt32Array(writer, _value)
case []int64:
return PackInt64Array(writer, _value)
case []int:
return PackIntArray(writer, _value)
case []float32:
return PackFloat32Array(writer, _value)
case []float64:
return PackFloat64Array(writer, _value)
default: default:
return PackValue(writer, reflect.NewValue(value)) return PackValue(writer, reflect.ValueOf(value))
} }
return 0, nil // never get here return 0, nil // never get here
} }

View File

@ -11,49 +11,63 @@ import (
func readByte(reader io.Reader) (v uint8, err os.Error) { func readByte(reader io.Reader) (v uint8, err os.Error) {
data := [1]byte{} data := [1]byte{}
_, e := reader.Read(data[0:]) _, e := reader.Read(data[0:])
if e != nil { return 0, e } if e != nil {
return 0, e
}
return data[0], nil return data[0], nil
} }
func readUint16(reader io.Reader) (v uint16, n int, err os.Error) { func readUint16(reader io.Reader) (v uint16, n int, err os.Error) {
data := [2]byte{} data := [2]byte{}
n, e := reader.Read(data[0:]) n, e := reader.Read(data[0:])
if e != nil { return 0, n, e } if e != nil {
return 0, n, e
}
return (uint16(data[0]) << 8) | uint16(data[1]), n, nil return (uint16(data[0]) << 8) | uint16(data[1]), n, nil
} }
func readUint32(reader io.Reader) (v uint32, n int, err os.Error) { func readUint32(reader io.Reader) (v uint32, n int, err os.Error) {
data := [4]byte{} data := [4]byte{}
n, e := reader.Read(data[0:]) n, e := reader.Read(data[0:])
if e != nil { return 0, n, e } if e != nil {
return 0, n, e
}
return (uint32(data[0]) << 24) | (uint32(data[1]) << 16) | (uint32(data[2]) << 8) | uint32(data[3]), n, nil return (uint32(data[0]) << 24) | (uint32(data[1]) << 16) | (uint32(data[2]) << 8) | uint32(data[3]), n, nil
} }
func readUint64(reader io.Reader) (v uint64, n int, err os.Error) { func readUint64(reader io.Reader) (v uint64, n int, err os.Error) {
data := [8]byte{} data := [8]byte{}
n, e := reader.Read(data[0:]) n, e := reader.Read(data[0:])
if e != nil { return 0, n, e } if e != nil {
return 0, n, e
}
return (uint64(data[0]) << 56) | (uint64(data[1]) << 48) | (uint64(data[2]) << 40) | (uint64(data[3]) << 32) | (uint64(data[4]) << 24) | (uint64(data[5]) << 16) | (uint64(data[6]) << 8) | uint64(data[7]), n, nil return (uint64(data[0]) << 56) | (uint64(data[1]) << 48) | (uint64(data[2]) << 40) | (uint64(data[3]) << 32) | (uint64(data[4]) << 24) | (uint64(data[5]) << 16) | (uint64(data[6]) << 8) | uint64(data[7]), n, nil
} }
func readInt16(reader io.Reader) (v int16, n int, err os.Error) { func readInt16(reader io.Reader) (v int16, n int, err os.Error) {
data := [2]byte{} data := [2]byte{}
n, e := reader.Read(data[0:]) n, e := reader.Read(data[0:])
if e != nil { return 0, n, e } if e != nil {
return 0, n, e
}
return (int16(data[0]) << 8) | int16(data[1]), n, nil return (int16(data[0]) << 8) | int16(data[1]), n, nil
} }
func readInt32(reader io.Reader) (v int32, n int, err os.Error) { func readInt32(reader io.Reader) (v int32, n int, err os.Error) {
data := [4]byte{} data := [4]byte{}
n, e := reader.Read(data[0:]) n, e := reader.Read(data[0:])
if e != nil { return 0, n, e } if e != nil {
return 0, n, e
}
return (int32(data[0]) << 24) | (int32(data[1]) << 16) | (int32(data[2]) << 8) | int32(data[3]), n, nil return (int32(data[0]) << 24) | (int32(data[1]) << 16) | (int32(data[2]) << 8) | int32(data[3]), n, nil
} }
func readInt64(reader io.Reader) (v int64, n int, err os.Error) { func readInt64(reader io.Reader) (v int64, n int, err os.Error) {
data := [8]byte{} data := [8]byte{}
n, e := reader.Read(data[0:]) n, e := reader.Read(data[0:])
if e != nil { return 0, n, e } if e != nil {
return 0, n, e
}
return (int64(data[0]) << 56) | (int64(data[1]) << 48) | (int64(data[2]) << 40) | (int64(data[3]) << 32) | (int64(data[4]) << 24) | (int64(data[5]) << 16) | (int64(data[6]) << 8) | int64(data[7]), n, nil return (int64(data[0]) << 56) | (int64(data[1]) << 48) | (int64(data[2]) << 40) | (int64(data[3]) << 32) | (int64(data[4]) << 24) | (int64(data[5]) << 16) | (int64(data[6]) << 8) | int64(data[7]), n, nil
} }
@ -64,10 +78,12 @@ func unpackArray(reader io.Reader, nelems uint) (v reflect.Value, n int, err os.
for i = 0; i < nelems; i++ { for i = 0; i < nelems; i++ {
v, n, e := Unpack(reader) v, n, e := Unpack(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
retval[i] = v.Interface() retval[i] = v.Interface()
} }
return reflect.NewValue(retval), nbytesread, nil return reflect.ValueOf(retval), nbytesread, nil
} }
func unpackArrayReflected(reader io.Reader, nelems uint) (v reflect.Value, n int, err os.Error) { func unpackArrayReflected(reader io.Reader, nelems uint) (v reflect.Value, n int, err os.Error) {
@ -77,42 +93,52 @@ func unpackArrayReflected(reader io.Reader, nelems uint) (v reflect.Value, n int
for i = 0; i < nelems; i++ { for i = 0; i < nelems; i++ {
v, n, e := UnpackReflected(reader) v, n, e := UnpackReflected(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
retval[i] = v retval[i] = v
} }
return reflect.NewValue(retval), nbytesread, nil return reflect.ValueOf(retval), nbytesread, nil
} }
func unpackMap(reader io.Reader, nelems uint) (v reflect.Value, n int, err os.Error) { func unpackMap(reader io.Reader, nelems uint) (v reflect.Value, n int, err os.Error) {
retval := make(map [interface{}] interface{}) retval := make(map[interface{}]interface{})
nbytesread := 0 nbytesread := 0
var i uint var i uint
for i = 0; i < nelems; i++ { for i = 0; i < nelems; i++ {
k, n, e := Unpack(reader) k, n, e := Unpack(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
v, n, e := Unpack(reader) v, n, e := Unpack(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
retval[k.Interface()] = v.Interface() retval[k.Interface()] = v.Interface()
} }
return reflect.NewValue(retval), nbytesread, nil return reflect.ValueOf(retval), nbytesread, nil
} }
func unpackMapReflected(reader io.Reader, nelems uint) (v reflect.Value, n int, err os.Error) { func unpackMapReflected(reader io.Reader, nelems uint) (v reflect.Value, n int, err os.Error) {
retval := make(map [reflect.Value] reflect.Value) retval := make(map[interface{}]reflect.Value)
nbytesread := 0 nbytesread := 0
var i uint var i uint
for i = 0; i < nelems; i++ { for i = 0; i < nelems; i++ {
k, n, e := UnpackReflected(reader) k, n, e := UnpackReflected(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
v, n, e := UnpackReflected(reader) v, n, e := UnpackReflected(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
retval[k] = v retval[k] = v
} }
return reflect.NewValue(retval), nbytesread, nil return reflect.ValueOf(retval), nbytesread, nil
} }
func unpack(reader io.Reader, reflected bool) (v reflect.Value, n int, err os.Error) { func unpack(reader io.Reader, reflected bool) (v reflect.Value, n int, err os.Error) {
@ -120,151 +146,206 @@ func unpack(reader io.Reader, reflected bool) (v reflect.Value, n int, err os.Er
var nbytesread int = 0 var nbytesread int = 0
c, e := readByte(reader) c, e := readByte(reader)
if e != nil { return nil, 0, e } if e != nil {
return reflect.Value{}, 0, e
}
nbytesread += 1 nbytesread += 1
if c < 0x80 || c >= 0xe0 { if c < 0x80 || c >= 0xe0 {
retval = reflect.NewValue(int8(c)) retval = reflect.ValueOf(int8(c))
} else if c >= 0x80 && c <= 0x8f { } else if c >= 0x80 && c <= 0x8f {
if reflected { if reflected {
retval, n, e = unpackMapReflected(reader, uint(c & 0xf)) retval, n, e = unpackMapReflected(reader, uint(c&0xf))
} else { } else {
retval, n, e = unpackMap(reader, uint(c & 0xf)) retval, n, e = unpackMap(reader, uint(c&0xf))
} }
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
nbytesread += n nbytesread += n
} else if c >= 0x90 && c <= 0x9f { } else if c >= 0x90 && c <= 0x9f {
if reflected { if reflected {
retval, n, e = unpackArrayReflected(reader, uint(c & 0xf)) retval, n, e = unpackArrayReflected(reader, uint(c&0xf))
} else { } else {
retval, n, e = unpackArray(reader, uint(c & 0xf)) retval, n, e = unpackArray(reader, uint(c&0xf))
} }
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
nbytesread += n nbytesread += n
} else if c >= 0xa0 && c <= 0xbf { } else if c >= 0xa0 && c <= 0xbf {
data := make([]byte, c & 0xf); data := make([]byte, c&0xf)
n, e := reader.Read(data) n, e := reader.Read(data)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(data) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(data)
} else { } else {
switch c { switch c {
case 0xc0: retval = reflect.NewValue(nil) case 0xc0:
case 0xc2: retval = reflect.NewValue(false) retval = reflect.ValueOf(nil)
case 0xc3: retval = reflect.NewValue(true) case 0xc2:
retval = reflect.ValueOf(false)
case 0xc3:
retval = reflect.ValueOf(true)
case 0xca: case 0xca:
data, n, e := readUint32(reader) data, n, e := readUint32(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(*(*float32)(unsafe.Pointer(&data))) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(*(*float32)(unsafe.Pointer(&data)))
case 0xcb: case 0xcb:
data, n, e := readUint64(reader) data, n, e := readUint64(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(*(*float64)(unsafe.Pointer(&data))) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(*(*float64)(unsafe.Pointer(&data)))
case 0xcc: case 0xcc:
data, e := readByte(reader) data, e := readByte(reader)
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(uint8(data)) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(uint8(data))
nbytesread += 1 nbytesread += 1
case 0xcd: case 0xcd:
data, n, e := readUint16(reader) data, n, e := readUint16(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(data) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(data)
case 0xce: case 0xce:
data, n, e := readUint32(reader) data, n, e := readUint32(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(data) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(data)
case 0xcf: case 0xcf:
data, n, e := readUint64(reader) data, n, e := readUint64(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(data) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(data)
case 0xd0: case 0xd0:
data, e := readByte(reader) data, e := readByte(reader)
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(int8(data)) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(int8(data))
nbytesread += 1 nbytesread += 1
case 0xd1: case 0xd1:
data, n, e := readInt16(reader) data, n, e := readInt16(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(data) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(data)
case 0xd2: case 0xd2:
data, n, e := readInt32(reader) data, n, e := readInt32(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(data) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(data)
case 0xd3: case 0xd3:
data, n, e := readInt64(reader) data, n, e := readInt64(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(data) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(data)
case 0xda: case 0xda:
nbytestoread, n, e := readUint16(reader) nbytestoread, n, e := readUint16(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
data := make([]byte, nbytestoread) data := make([]byte, nbytestoread)
n, e = reader.Read(data) n, e = reader.Read(data)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(data) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(data)
case 0xdb: case 0xdb:
nbytestoread, n, e := readUint32(reader) nbytestoread, n, e := readUint32(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
data := make([]byte, nbytestoread) data := make([]byte, nbytestoread)
n, e = reader.Read(data) n, e = reader.Read(data)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
retval = reflect.NewValue(data) return reflect.Value{}, nbytesread, e
}
retval = reflect.ValueOf(data)
case 0xdc: case 0xdc:
nelemstoread, n, e := readUint16(reader) nelemstoread, n, e := readUint16(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
if reflected { if reflected {
retval, n, e = unpackArrayReflected(reader, uint(nelemstoread)) retval, n, e = unpackArrayReflected(reader, uint(nelemstoread))
} else { } else {
retval, n, e = unpackArray(reader, uint(nelemstoread)) retval, n, e = unpackArray(reader, uint(nelemstoread))
} }
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
case 0xdd: case 0xdd:
nelemstoread, n, e := readUint32(reader) nelemstoread, n, e := readUint32(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
if reflected { if reflected {
retval, n, e = unpackArrayReflected(reader, uint(nelemstoread)) retval, n, e = unpackArrayReflected(reader, uint(nelemstoread))
} else { } else {
retval, n, e = unpackArray(reader, uint(nelemstoread)) retval, n, e = unpackArray(reader, uint(nelemstoread))
} }
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
case 0xde: case 0xde:
nelemstoread, n, e := readUint16(reader) nelemstoread, n, e := readUint16(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
if reflected { if reflected {
retval, n, e = unpackMapReflected(reader, uint(nelemstoread)) retval, n, e = unpackMapReflected(reader, uint(nelemstoread))
} else { } else {
retval, n, e = unpackMap(reader, uint(nelemstoread)) retval, n, e = unpackMap(reader, uint(nelemstoread))
} }
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
case 0xdf: case 0xdf:
nelemstoread, n, e := readUint32(reader) nelemstoread, n, e := readUint32(reader)
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
if reflected { if reflected {
retval, n, e = unpackMapReflected(reader, uint(nelemstoread)) retval, n, e = unpackMapReflected(reader, uint(nelemstoread))
} else { } else {
retval, n, e = unpackMap(reader, uint(nelemstoread)) retval, n, e = unpackMap(reader, uint(nelemstoread))
} }
nbytesread += n nbytesread += n
if e != nil { return nil, nbytesread, e } if e != nil {
return reflect.Value{}, nbytesread, e
}
default: default:
panic("unsupported code: " + strconv.Itoa(int(c))) panic("unsupported code: " + strconv.Itoa(int(c)))
} }
@ -283,6 +364,3 @@ func Unpack(reader io.Reader) (v reflect.Value, n int, err os.Error) {
func UnpackReflected(reader io.Reader) (v reflect.Value, n int, err os.Error) { func UnpackReflected(reader io.Reader) (v reflect.Value, n int, err os.Error) {
return unpack(reader, true) return unpack(reader, true)
} }