decode_unsafe.go (1460B)
1 package msgpack 2 3 import ( 4 "io" 5 ) 6 7 type UnsafeDecoder struct { 8 *Decoder 9 } 10 11 func NewUnsafeDecoder(r io.Reader, buf []byte) *UnsafeDecoder { 12 return &UnsafeDecoder{NewDecoder(r, buf)} 13 } 14 15 func (d *UnsafeDecoder) Reader() io.Reader { 16 return d.r 17 } 18 19 func (d *UnsafeDecoder) SetReader(r io.Reader) { 20 d.r = r 21 } 22 23 func (d *UnsafeDecoder) Buffer() []byte { 24 return d.buf 25 } 26 27 func (d *UnsafeDecoder) SetBuffer(p []byte) { 28 d.buf = p 29 } 30 31 func (d *UnsafeDecoder) BufferLength() int { 32 return d.length 33 } 34 35 func (d *UnsafeDecoder) SetBufferLength(n int) { 36 d.length = n 37 } 38 39 func (d *UnsafeDecoder) CursorPosition() int { 40 return d.cursor 41 } 42 43 func (d *UnsafeDecoder) SetCursorPosition(n int) { 44 d.cursor = n 45 } 46 47 func (d *UnsafeDecoder) ReadBuffer(p []byte) (int, error) { 48 return d.read(p) 49 } 50 51 func (d *UnsafeDecoder) PreviewBuffer(p []byte) (int, error) { 52 if len(p) == 0 { 53 return 0, nil 54 } 55 56 if d.length-d.cursor < len(p) && d.r != nil { 57 err := d.ExpandBuffer(len(p)) 58 if err != nil { 59 return 0, err 60 } 61 } 62 63 n := len(p) 64 if d.length-d.cursor < n { 65 n = d.length - d.cursor 66 } 67 68 copy(p[:n], d.buf[d.cursor:d.cursor+n]) 69 return n, nil 70 } 71 72 func (d *UnsafeDecoder) ExpandBuffer(n int) error { 73 if d.r == nil { 74 return nil 75 } 76 77 buf := make([]byte, d.length+n) 78 79 // Read from reader 80 rn, err := d.r.Read(buf[d.length:]) 81 if err != nil { 82 return err 83 } 84 buf = buf[:d.length+rn] 85 86 // Copy from original 87 copy(buf[:d.length], d.buf) 88 89 d.buf = buf 90 d.length += rn 91 92 return nil 93 }