| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- // Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
- // All rights reserved. Use of this source code is governed by an MIT-style
- // license that can be found in the LICENSE file.
- package xdr
- import "io"
- type Unmarshaller struct {
- Error error
- Data []byte
- }
- func (u *Unmarshaller) UnmarshalRaw(l int) []byte {
- if u.Error != nil {
- return nil
- }
- if len(u.Data) < l {
- u.Error = io.ErrUnexpectedEOF
- return nil
- }
- v := u.Data[:l]
- u.Data = u.Data[l:]
- return v
- }
- func (u *Unmarshaller) UnmarshalString() string {
- return u.UnmarshalStringMax(0)
- }
- func (u *Unmarshaller) UnmarshalStringMax(max int) string {
- buf := u.UnmarshalBytesMax(max)
- if len(buf) == 0 || u.Error != nil {
- return ""
- }
- return string(buf)
- }
- func (u *Unmarshaller) UnmarshalBytes() []byte {
- return u.UnmarshalBytesMax(0)
- }
- func (u *Unmarshaller) UnmarshalBytesMax(max int) []byte {
- if u.Error != nil {
- return nil
- }
- if len(u.Data) < 4 {
- u.Error = io.ErrUnexpectedEOF
- return nil
- }
- l := int(u.Data[3]) | int(u.Data[2])<<8 | int(u.Data[1])<<16 | int(u.Data[0])<<24
- if l == 0 {
- u.Data = u.Data[4:]
- return nil
- }
- if l < 0 || max > 0 && l > max {
- // l may be negative on 32 bit builds
- u.Error = ElementSizeExceeded("bytes field", l, max)
- return nil
- }
- if len(u.Data) < l+4 {
- u.Error = io.ErrUnexpectedEOF
- return nil
- }
- v := u.Data[4 : 4+l]
- u.Data = u.Data[4+l+Padding(l):]
- return v
- }
- func (u *Unmarshaller) UnmarshalBool() bool {
- return u.UnmarshalUint8() != 0
- }
- func (u *Unmarshaller) UnmarshalUint8() uint8 {
- if u.Error != nil {
- return 0
- }
- if len(u.Data) < 4 {
- u.Error = io.ErrUnexpectedEOF
- return 0
- }
- v := uint8(u.Data[3])
- u.Data = u.Data[4:]
- return v
- }
- func (u *Unmarshaller) UnmarshalUint16() uint16 {
- if u.Error != nil {
- return 0
- }
- if len(u.Data) < 4 {
- u.Error = io.ErrUnexpectedEOF
- return 0
- }
- v := uint16(u.Data[3]) | uint16(u.Data[2])<<8
- u.Data = u.Data[4:]
- return v
- }
- func (u *Unmarshaller) UnmarshalUint32() uint32 {
- if u.Error != nil {
- return 0
- }
- if len(u.Data) < 4 {
- u.Error = io.ErrUnexpectedEOF
- return 0
- }
- v := uint32(u.Data[3]) | uint32(u.Data[2])<<8 | uint32(u.Data[1])<<16 | uint32(u.Data[0])<<24
- u.Data = u.Data[4:]
- return v
- }
- func (u *Unmarshaller) UnmarshalUint64() uint64 {
- if u.Error != nil {
- return 0
- }
- if len(u.Data) < 8 {
- u.Error = io.ErrUnexpectedEOF
- return 0
- }
- v := uint64(u.Data[7]) | uint64(u.Data[6])<<8 | uint64(u.Data[5])<<16 | uint64(u.Data[4])<<24 |
- uint64(u.Data[3])<<32 | uint64(u.Data[2])<<40 | uint64(u.Data[1])<<48 | uint64(u.Data[0])<<56
- u.Data = u.Data[8:]
- return v
- }
|