msgpack-go

Message Pack Encoder/Decoder for Golang
git clone git://git.lair.cx/msgpack-go
Log | Files | Refs | LICENSE

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 }