gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

decode_string.go (3280B)


      1 package msgpack
      2 
      3 import (
      4 	"fmt"
      5 	"reflect"
      6 
      7 	"github.com/vmihailenco/msgpack/v5/msgpcode"
      8 )
      9 
     10 func (d *Decoder) bytesLen(c byte) (int, error) {
     11 	if c == msgpcode.Nil {
     12 		return -1, nil
     13 	}
     14 
     15 	if msgpcode.IsFixedString(c) {
     16 		return int(c & msgpcode.FixedStrMask), nil
     17 	}
     18 
     19 	switch c {
     20 	case msgpcode.Str8, msgpcode.Bin8:
     21 		n, err := d.uint8()
     22 		return int(n), err
     23 	case msgpcode.Str16, msgpcode.Bin16:
     24 		n, err := d.uint16()
     25 		return int(n), err
     26 	case msgpcode.Str32, msgpcode.Bin32:
     27 		n, err := d.uint32()
     28 		return int(n), err
     29 	}
     30 
     31 	return 0, fmt.Errorf("msgpack: invalid code=%x decoding string/bytes length", c)
     32 }
     33 
     34 func (d *Decoder) DecodeString() (string, error) {
     35 	if intern := d.flags&useInternedStringsFlag != 0; intern || len(d.dict) > 0 {
     36 		return d.decodeInternedString(intern)
     37 	}
     38 
     39 	c, err := d.readCode()
     40 	if err != nil {
     41 		return "", err
     42 	}
     43 	return d.string(c)
     44 }
     45 
     46 func (d *Decoder) string(c byte) (string, error) {
     47 	n, err := d.bytesLen(c)
     48 	if err != nil {
     49 		return "", err
     50 	}
     51 	return d.stringWithLen(n)
     52 }
     53 
     54 func (d *Decoder) stringWithLen(n int) (string, error) {
     55 	if n <= 0 {
     56 		return "", nil
     57 	}
     58 	b, err := d.readN(n)
     59 	return string(b), err
     60 }
     61 
     62 func decodeStringValue(d *Decoder, v reflect.Value) error {
     63 	s, err := d.DecodeString()
     64 	if err != nil {
     65 		return err
     66 	}
     67 	v.SetString(s)
     68 	return nil
     69 }
     70 
     71 func (d *Decoder) DecodeBytesLen() (int, error) {
     72 	c, err := d.readCode()
     73 	if err != nil {
     74 		return 0, err
     75 	}
     76 	return d.bytesLen(c)
     77 }
     78 
     79 func (d *Decoder) DecodeBytes() ([]byte, error) {
     80 	c, err := d.readCode()
     81 	if err != nil {
     82 		return nil, err
     83 	}
     84 	return d.bytes(c, nil)
     85 }
     86 
     87 func (d *Decoder) bytes(c byte, b []byte) ([]byte, error) {
     88 	n, err := d.bytesLen(c)
     89 	if err != nil {
     90 		return nil, err
     91 	}
     92 	if n == -1 {
     93 		return nil, nil
     94 	}
     95 	return readN(d.r, b, n)
     96 }
     97 
     98 func (d *Decoder) decodeStringTemp() (string, error) {
     99 	if intern := d.flags&useInternedStringsFlag != 0; intern || len(d.dict) > 0 {
    100 		return d.decodeInternedString(intern)
    101 	}
    102 
    103 	c, err := d.readCode()
    104 	if err != nil {
    105 		return "", err
    106 	}
    107 
    108 	n, err := d.bytesLen(c)
    109 	if err != nil {
    110 		return "", err
    111 	}
    112 	if n == -1 {
    113 		return "", nil
    114 	}
    115 
    116 	b, err := d.readN(n)
    117 	if err != nil {
    118 		return "", err
    119 	}
    120 
    121 	return bytesToString(b), nil
    122 }
    123 
    124 func (d *Decoder) decodeBytesPtr(ptr *[]byte) error {
    125 	c, err := d.readCode()
    126 	if err != nil {
    127 		return err
    128 	}
    129 	return d.bytesPtr(c, ptr)
    130 }
    131 
    132 func (d *Decoder) bytesPtr(c byte, ptr *[]byte) error {
    133 	n, err := d.bytesLen(c)
    134 	if err != nil {
    135 		return err
    136 	}
    137 	if n == -1 {
    138 		*ptr = nil
    139 		return nil
    140 	}
    141 
    142 	*ptr, err = readN(d.r, *ptr, n)
    143 	return err
    144 }
    145 
    146 func (d *Decoder) skipBytes(c byte) error {
    147 	n, err := d.bytesLen(c)
    148 	if err != nil {
    149 		return err
    150 	}
    151 	if n <= 0 {
    152 		return nil
    153 	}
    154 	return d.skipN(n)
    155 }
    156 
    157 func decodeBytesValue(d *Decoder, v reflect.Value) error {
    158 	c, err := d.readCode()
    159 	if err != nil {
    160 		return err
    161 	}
    162 
    163 	b, err := d.bytes(c, v.Bytes())
    164 	if err != nil {
    165 		return err
    166 	}
    167 
    168 	v.SetBytes(b)
    169 
    170 	return nil
    171 }
    172 
    173 func decodeByteArrayValue(d *Decoder, v reflect.Value) error {
    174 	c, err := d.readCode()
    175 	if err != nil {
    176 		return err
    177 	}
    178 
    179 	n, err := d.bytesLen(c)
    180 	if err != nil {
    181 		return err
    182 	}
    183 	if n == -1 {
    184 		return nil
    185 	}
    186 	if n > v.Len() {
    187 		return fmt.Errorf("%s len is %d, but msgpack has %d elements", v.Type(), v.Len(), n)
    188 	}
    189 
    190 	b := v.Slice(0, n).Bytes()
    191 	return d.readFull(b)
    192 }