summaryrefslogtreecommitdiff
path: root/vendor/github.com/ugorji/go/codec/cbor.go
diff options
context:
space:
mode:
authorLibravatar Terin Stock <terinjokes@gmail.com>2025-03-09 17:47:56 +0100
committerLibravatar Terin Stock <terinjokes@gmail.com>2025-03-10 01:59:49 +0100
commit3ac1ee16f377d31a0fb80c8dae28b6239ac4229e (patch)
treef61faa581feaaeaba2542b9f2b8234a590684413 /vendor/github.com/ugorji/go/codec/cbor.go
parent[chore] update URLs to forked source (diff)
downloadgotosocial-3ac1ee16f377d31a0fb80c8dae28b6239ac4229e.tar.xz
[chore] remove vendor
Diffstat (limited to 'vendor/github.com/ugorji/go/codec/cbor.go')
-rw-r--r--vendor/github.com/ugorji/go/codec/cbor.go966
1 files changed, 0 insertions, 966 deletions
diff --git a/vendor/github.com/ugorji/go/codec/cbor.go b/vendor/github.com/ugorji/go/codec/cbor.go
deleted file mode 100644
index 802b1fc1d..000000000
--- a/vendor/github.com/ugorji/go/codec/cbor.go
+++ /dev/null
@@ -1,966 +0,0 @@
-// Copyright (c) 2012-2020 Ugorji Nwoke. All rights reserved.
-// Use of this source code is governed by a MIT license found in the LICENSE file.
-
-package codec
-
-import (
- "math"
- "reflect"
- "time"
- "unicode/utf8"
-)
-
-// major
-const (
- cborMajorUint byte = iota
- cborMajorNegInt
- cborMajorBytes
- cborMajorString
- cborMajorArray
- cborMajorMap
- cborMajorTag
- cborMajorSimpleOrFloat
-)
-
-// simple
-const (
- cborBdFalse byte = 0xf4 + iota
- cborBdTrue
- cborBdNil
- cborBdUndefined
- cborBdExt
- cborBdFloat16
- cborBdFloat32
- cborBdFloat64
-)
-
-// indefinite
-const (
- cborBdIndefiniteBytes byte = 0x5f
- cborBdIndefiniteString byte = 0x7f
- cborBdIndefiniteArray byte = 0x9f
- cborBdIndefiniteMap byte = 0xbf
- cborBdBreak byte = 0xff
-)
-
-// These define some in-stream descriptors for
-// manual encoding e.g. when doing explicit indefinite-length
-const (
- CborStreamBytes byte = 0x5f
- CborStreamString byte = 0x7f
- CborStreamArray byte = 0x9f
- CborStreamMap byte = 0xbf
- CborStreamBreak byte = 0xff
-)
-
-// base values
-const (
- cborBaseUint byte = 0x00
- cborBaseNegInt byte = 0x20
- cborBaseBytes byte = 0x40
- cborBaseString byte = 0x60
- cborBaseArray byte = 0x80
- cborBaseMap byte = 0xa0
- cborBaseTag byte = 0xc0
- cborBaseSimple byte = 0xe0
-)
-
-// const (
-// cborSelfDesrTag byte = 0xd9
-// cborSelfDesrTag2 byte = 0xd9
-// cborSelfDesrTag3 byte = 0xf7
-// )
-
-var (
- cbordescSimpleNames = map[byte]string{
- cborBdNil: "nil",
- cborBdFalse: "false",
- cborBdTrue: "true",
- cborBdFloat16: "float",
- cborBdFloat32: "float",
- cborBdFloat64: "float",
- cborBdBreak: "break",
- }
- cbordescIndefNames = map[byte]string{
- cborBdIndefiniteBytes: "bytes*",
- cborBdIndefiniteString: "string*",
- cborBdIndefiniteArray: "array*",
- cborBdIndefiniteMap: "map*",
- }
- cbordescMajorNames = map[byte]string{
- cborMajorUint: "(u)int",
- cborMajorNegInt: "int",
- cborMajorBytes: "bytes",
- cborMajorString: "string",
- cborMajorArray: "array",
- cborMajorMap: "map",
- cborMajorTag: "tag",
- cborMajorSimpleOrFloat: "simple",
- }
-)
-
-func cbordesc(bd byte) (s string) {
- bm := bd >> 5
- if bm == cborMajorSimpleOrFloat {
- s = cbordescSimpleNames[bd]
- } else {
- s = cbordescMajorNames[bm]
- if s == "" {
- s = cbordescIndefNames[bd]
- }
- }
- if s == "" {
- s = "unknown"
- }
- return
-}
-
-// -------------------
-
-type cborEncDriver struct {
- noBuiltInTypes
- encDriverNoState
- encDriverNoopContainerWriter
- h *CborHandle
-
- // scratch buffer for: encode time, numbers, etc
- //
- // RFC3339Nano uses 35 chars: 2006-01-02T15:04:05.999999999Z07:00
- b [40]byte
-
- e Encoder
-}
-
-func (e *cborEncDriver) encoder() *Encoder {
- return &e.e
-}
-
-func (e *cborEncDriver) EncodeNil() {
- e.e.encWr.writen1(cborBdNil)
-}
-
-func (e *cborEncDriver) EncodeBool(b bool) {
- if b {
- e.e.encWr.writen1(cborBdTrue)
- } else {
- e.e.encWr.writen1(cborBdFalse)
- }
-}
-
-func (e *cborEncDriver) EncodeFloat32(f float32) {
- b := math.Float32bits(f)
- if e.h.OptimumSize {
- if h := floatToHalfFloatBits(b); halfFloatToFloatBits(h) == b {
- e.e.encWr.writen1(cborBdFloat16)
- bigen.writeUint16(e.e.w(), h)
- return
- }
- }
- e.e.encWr.writen1(cborBdFloat32)
- bigen.writeUint32(e.e.w(), b)
-}
-
-func (e *cborEncDriver) EncodeFloat64(f float64) {
- if e.h.OptimumSize {
- if f32 := float32(f); float64(f32) == f {
- e.EncodeFloat32(f32)
- return
- }
- }
- e.e.encWr.writen1(cborBdFloat64)
- bigen.writeUint64(e.e.w(), math.Float64bits(f))
-}
-
-func (e *cborEncDriver) encUint(v uint64, bd byte) {
- if v <= 0x17 {
- e.e.encWr.writen1(byte(v) + bd)
- } else if v <= math.MaxUint8 {
- e.e.encWr.writen2(bd+0x18, uint8(v))
- } else if v <= math.MaxUint16 {
- e.e.encWr.writen1(bd + 0x19)
- bigen.writeUint16(e.e.w(), uint16(v))
- } else if v <= math.MaxUint32 {
- e.e.encWr.writen1(bd + 0x1a)
- bigen.writeUint32(e.e.w(), uint32(v))
- } else { // if v <= math.MaxUint64 {
- e.e.encWr.writen1(bd + 0x1b)
- bigen.writeUint64(e.e.w(), v)
- }
-}
-
-func (e *cborEncDriver) EncodeInt(v int64) {
- if v < 0 {
- e.encUint(uint64(-1-v), cborBaseNegInt)
- } else {
- e.encUint(uint64(v), cborBaseUint)
- }
-}
-
-func (e *cborEncDriver) EncodeUint(v uint64) {
- e.encUint(v, cborBaseUint)
-}
-
-func (e *cborEncDriver) encLen(bd byte, length int) {
- e.encUint(uint64(length), bd)
-}
-
-func (e *cborEncDriver) EncodeTime(t time.Time) {
- if t.IsZero() {
- e.EncodeNil()
- } else if e.h.TimeRFC3339 {
- e.encUint(0, cborBaseTag)
- e.encStringBytesS(cborBaseString, stringView(fmtTime(t, time.RFC3339Nano, e.b[:0])))
- } else {
- e.encUint(1, cborBaseTag)
- t = t.UTC().Round(time.Microsecond)
- sec, nsec := t.Unix(), uint64(t.Nanosecond())
- if nsec == 0 {
- e.EncodeInt(sec)
- } else {
- e.EncodeFloat64(float64(sec) + float64(nsec)/1e9)
- }
- }
-}
-
-func (e *cborEncDriver) EncodeExt(rv interface{}, basetype reflect.Type, xtag uint64, ext Ext) {
- e.encUint(uint64(xtag), cborBaseTag)
- if ext == SelfExt {
- e.e.encodeValue(baseRV(rv), e.h.fnNoExt(basetype))
- } else if v := ext.ConvertExt(rv); v == nil {
- e.EncodeNil()
- } else {
- e.e.encode(v)
- }
-}
-
-func (e *cborEncDriver) EncodeRawExt(re *RawExt) {
- e.encUint(uint64(re.Tag), cborBaseTag)
- // only encodes re.Value (never re.Data)
- if re.Value != nil {
- e.e.encode(re.Value)
- } else {
- e.EncodeNil()
- }
-}
-
-func (e *cborEncDriver) WriteArrayStart(length int) {
- if e.h.IndefiniteLength {
- e.e.encWr.writen1(cborBdIndefiniteArray)
- } else {
- e.encLen(cborBaseArray, length)
- }
-}
-
-func (e *cborEncDriver) WriteMapStart(length int) {
- if e.h.IndefiniteLength {
- e.e.encWr.writen1(cborBdIndefiniteMap)
- } else {
- e.encLen(cborBaseMap, length)
- }
-}
-
-func (e *cborEncDriver) WriteMapEnd() {
- if e.h.IndefiniteLength {
- e.e.encWr.writen1(cborBdBreak)
- }
-}
-
-func (e *cborEncDriver) WriteArrayEnd() {
- if e.h.IndefiniteLength {
- e.e.encWr.writen1(cborBdBreak)
- }
-}
-
-func (e *cborEncDriver) EncodeString(v string) {
- bb := cborBaseString
- if e.h.StringToRaw {
- bb = cborBaseBytes
- }
- e.encStringBytesS(bb, v)
-}
-
-func (e *cborEncDriver) EncodeStringBytesRaw(v []byte) {
- if v == nil {
- e.EncodeNil()
- } else {
- e.encStringBytesS(cborBaseBytes, stringView(v))
- }
-}
-
-func (e *cborEncDriver) encStringBytesS(bb byte, v string) {
- if e.h.IndefiniteLength {
- if bb == cborBaseBytes {
- e.e.encWr.writen1(cborBdIndefiniteBytes)
- } else {
- e.e.encWr.writen1(cborBdIndefiniteString)
- }
- var vlen uint = uint(len(v))
- blen := vlen / 4
- if blen == 0 {
- blen = 64
- } else if blen > 1024 {
- blen = 1024
- }
- for i := uint(0); i < vlen; {
- var v2 string
- i2 := i + blen
- if i2 >= i && i2 < vlen {
- v2 = v[i:i2]
- } else {
- v2 = v[i:]
- }
- e.encLen(bb, len(v2))
- e.e.encWr.writestr(v2)
- i = i2
- }
- e.e.encWr.writen1(cborBdBreak)
- } else {
- e.encLen(bb, len(v))
- e.e.encWr.writestr(v)
- }
-}
-
-// ----------------------
-
-type cborDecDriver struct {
- decDriverNoopContainerReader
- decDriverNoopNumberHelper
- h *CborHandle
- bdAndBdread
- st bool // skip tags
- _ bool // found nil
- noBuiltInTypes
- d Decoder
-}
-
-func (d *cborDecDriver) decoder() *Decoder {
- return &d.d
-}
-
-func (d *cborDecDriver) descBd() string {
- return sprintf("%v (%s)", d.bd, cbordesc(d.bd))
-}
-
-func (d *cborDecDriver) readNextBd() {
- d.bd = d.d.decRd.readn1()
- d.bdRead = true
-}
-
-func (d *cborDecDriver) advanceNil() (null bool) {
- if !d.bdRead {
- d.readNextBd()
- }
- if d.bd == cborBdNil || d.bd == cborBdUndefined {
- d.bdRead = false
- return true // null = true
- }
- return
-}
-
-func (d *cborDecDriver) TryNil() bool {
- return d.advanceNil()
-}
-
-// skipTags is called to skip any tags in the stream.
-//
-// Since any value can be tagged, then we should call skipTags
-// before any value is decoded.
-//
-// By definition, skipTags should not be called before
-// checking for break, or nil or undefined.
-func (d *cborDecDriver) skipTags() {
- for d.bd>>5 == cborMajorTag {
- d.decUint()
- d.bd = d.d.decRd.readn1()
- }
-}
-
-func (d *cborDecDriver) ContainerType() (vt valueType) {
- if !d.bdRead {
- d.readNextBd()
- }
- if d.st {
- d.skipTags()
- }
- if d.bd == cborBdNil {
- d.bdRead = false // always consume nil after seeing it in container type
- return valueTypeNil
- }
- major := d.bd >> 5
- if major == cborMajorBytes {
- return valueTypeBytes
- } else if major == cborMajorString {
- return valueTypeString
- } else if major == cborMajorArray {
- return valueTypeArray
- } else if major == cborMajorMap {
- return valueTypeMap
- }
- return valueTypeUnset
-}
-
-func (d *cborDecDriver) CheckBreak() (v bool) {
- if !d.bdRead {
- d.readNextBd()
- }
- if d.bd == cborBdBreak {
- d.bdRead = false
- v = true
- }
- return
-}
-
-func (d *cborDecDriver) decUint() (ui uint64) {
- v := d.bd & 0x1f
- if v <= 0x17 {
- ui = uint64(v)
- } else if v == 0x18 {
- ui = uint64(d.d.decRd.readn1())
- } else if v == 0x19 {
- ui = uint64(bigen.Uint16(d.d.decRd.readn2()))
- } else if v == 0x1a {
- ui = uint64(bigen.Uint32(d.d.decRd.readn4()))
- } else if v == 0x1b {
- ui = uint64(bigen.Uint64(d.d.decRd.readn8()))
- } else {
- d.d.errorf("invalid descriptor decoding uint: %x/%s", d.bd, cbordesc(d.bd))
- }
- return
-}
-
-func (d *cborDecDriver) decLen() int {
- return int(d.decUint())
-}
-
-func (d *cborDecDriver) decAppendIndefiniteBytes(bs []byte, major byte) []byte {
- d.bdRead = false
- for !d.CheckBreak() {
- chunkMajor := d.bd >> 5
- if chunkMajor != major {
- d.d.errorf("malformed indefinite string/bytes %x (%s); contains chunk with major type %v, expected %v",
- d.bd, cbordesc(d.bd), chunkMajor, major)
- }
- n := uint(d.decLen())
- oldLen := uint(len(bs))
- newLen := oldLen + n
- if newLen > uint(cap(bs)) {
- bs2 := make([]byte, newLen, 2*uint(cap(bs))+n)
- copy(bs2, bs)
- bs = bs2
- } else {
- bs = bs[:newLen]
- }
- d.d.decRd.readb(bs[oldLen:newLen])
- if d.h.ValidateUnicode && major == cborMajorString && !utf8.Valid(bs[oldLen:newLen]) {
- d.d.errorf("indefinite-length text string contains chunk that is not a valid utf-8 sequence: 0x%x", bs[oldLen:newLen])
- }
- d.bdRead = false
- }
- d.bdRead = false
- return bs
-}
-
-func (d *cborDecDriver) decFloat() (f float64, ok bool) {
- ok = true
- switch d.bd {
- case cborBdFloat16:
- f = float64(math.Float32frombits(halfFloatToFloatBits(bigen.Uint16(d.d.decRd.readn2()))))
- case cborBdFloat32:
- f = float64(math.Float32frombits(bigen.Uint32(d.d.decRd.readn4())))
- case cborBdFloat64:
- f = math.Float64frombits(bigen.Uint64(d.d.decRd.readn8()))
- default:
- ok = false
- }
- return
-}
-
-func (d *cborDecDriver) decInteger() (ui uint64, neg, ok bool) {
- ok = true
- switch d.bd >> 5 {
- case cborMajorUint:
- ui = d.decUint()
- case cborMajorNegInt:
- ui = d.decUint()
- neg = true
- default:
- ok = false
- }
- return
-}
-
-func (d *cborDecDriver) DecodeInt64() (i int64) {
- if d.advanceNil() {
- return
- }
- if d.st {
- d.skipTags()
- }
- i = decNegintPosintFloatNumberHelper{&d.d}.int64(d.decInteger())
- d.bdRead = false
- return
-}
-
-func (d *cborDecDriver) DecodeUint64() (ui uint64) {
- if d.advanceNil() {
- return
- }
- if d.st {
- d.skipTags()
- }
- ui = decNegintPosintFloatNumberHelper{&d.d}.uint64(d.decInteger())
- d.bdRead = false
- return
-}
-
-func (d *cborDecDriver) DecodeFloat64() (f float64) {
- if d.advanceNil() {
- return
- }
- if d.st {
- d.skipTags()
- }
- f = decNegintPosintFloatNumberHelper{&d.d}.float64(d.decFloat())
- d.bdRead = false
- return
-}
-
-// bool can be decoded from bool only (single byte).
-func (d *cborDecDriver) DecodeBool() (b bool) {
- if d.advanceNil() {
- return
- }
- if d.st {
- d.skipTags()
- }
- if d.bd == cborBdTrue {
- b = true
- } else if d.bd == cborBdFalse {
- } else {
- d.d.errorf("not bool - %s %x/%s", msgBadDesc, d.bd, cbordesc(d.bd))
- }
- d.bdRead = false
- return
-}
-
-func (d *cborDecDriver) ReadMapStart() (length int) {
- if d.advanceNil() {
- return containerLenNil
- }
- if d.st {
- d.skipTags()
- }
- d.bdRead = false
- if d.bd == cborBdIndefiniteMap {
- return containerLenUnknown
- }
- if d.bd>>5 != cborMajorMap {
- d.d.errorf("error reading map; got major type: %x, expected %x/%s", d.bd>>5, cborMajorMap, cbordesc(d.bd))
- }
- return d.decLen()
-}
-
-func (d *cborDecDriver) ReadArrayStart() (length int) {
- if d.advanceNil() {
- return containerLenNil
- }
- if d.st {
- d.skipTags()
- }
- d.bdRead = false
- if d.bd == cborBdIndefiniteArray {
- return containerLenUnknown
- }
- if d.bd>>5 != cborMajorArray {
- d.d.errorf("invalid array; got major type: %x, expect: %x/%s", d.bd>>5, cborMajorArray, cbordesc(d.bd))
- }
- return d.decLen()
-}
-
-func (d *cborDecDriver) DecodeBytes(bs []byte) (bsOut []byte) {
- d.d.decByteState = decByteStateNone
- if d.advanceNil() {
- return
- }
- if d.st {
- d.skipTags()
- }
- if d.bd == cborBdIndefiniteBytes || d.bd == cborBdIndefiniteString {
- d.bdRead = false
- if bs == nil {
- d.d.decByteState = decByteStateReuseBuf
- return d.decAppendIndefiniteBytes(d.d.b[:0], d.bd>>5)
- }
- return d.decAppendIndefiniteBytes(bs[:0], d.bd>>5)
- }
- if d.bd == cborBdIndefiniteArray {
- d.bdRead = false
- if bs == nil {
- d.d.decByteState = decByteStateReuseBuf
- bs = d.d.b[:0]
- } else {
- bs = bs[:0]
- }
- for !d.CheckBreak() {
- bs = append(bs, uint8(chkOvf.UintV(d.DecodeUint64(), 8)))
- }
- return bs
- }
- if d.bd>>5 == cborMajorArray {
- d.bdRead = false
- if bs == nil {
- d.d.decByteState = decByteStateReuseBuf
- bs = d.d.b[:]
- }
- slen := d.decLen()
- var changed bool
- if bs, changed = usableByteSlice(bs, slen); changed {
- d.d.decByteState = decByteStateNone
- }
- for i := 0; i < len(bs); i++ {
- bs[i] = uint8(chkOvf.UintV(d.DecodeUint64(), 8))
- }
- for i := len(bs); i < slen; i++ {
- bs = append(bs, uint8(chkOvf.UintV(d.DecodeUint64(), 8)))
- }
- return bs
- }
- clen := d.decLen()
- d.bdRead = false
- if d.d.zerocopy() {
- d.d.decByteState = decByteStateZerocopy
- return d.d.decRd.rb.readx(uint(clen))
- }
- if bs == nil {
- d.d.decByteState = decByteStateReuseBuf
- bs = d.d.b[:]
- }
- return decByteSlice(d.d.r(), clen, d.h.MaxInitLen, bs)
-}
-
-func (d *cborDecDriver) DecodeStringAsBytes() (s []byte) {
- s = d.DecodeBytes(nil)
- if d.h.ValidateUnicode && !utf8.Valid(s) {
- d.d.errorf("DecodeStringAsBytes: invalid UTF-8: %s", s)
- }
- return
-}
-
-func (d *cborDecDriver) DecodeTime() (t time.Time) {
- if d.advanceNil() {
- return
- }
- if d.bd>>5 != cborMajorTag {
- d.d.errorf("error reading tag; expected major type: %x, got: %x", cborMajorTag, d.bd>>5)
- }
- xtag := d.decUint()
- d.bdRead = false
- return d.decodeTime(xtag)
-}
-
-func (d *cborDecDriver) decodeTime(xtag uint64) (t time.Time) {
- switch xtag {
- case 0:
- var err error
- t, err = time.Parse(time.RFC3339, stringView(d.DecodeStringAsBytes()))
- d.d.onerror(err)
- case 1:
- f1, f2 := math.Modf(d.DecodeFloat64())
- t = time.Unix(int64(f1), int64(f2*1e9))
- default:
- d.d.errorf("invalid tag for time.Time - expecting 0 or 1, got 0x%x", xtag)
- }
- t = t.UTC().Round(time.Microsecond)
- return
-}
-
-func (d *cborDecDriver) DecodeExt(rv interface{}, basetype reflect.Type, xtag uint64, ext Ext) {
- if d.advanceNil() {
- return
- }
- if d.bd>>5 != cborMajorTag {
- d.d.errorf("error reading tag; expected major type: %x, got: %x", cborMajorTag, d.bd>>5)
- }
- realxtag := d.decUint()
- d.bdRead = false
- if ext == nil {
- re := rv.(*RawExt)
- re.Tag = realxtag
- d.d.decode(&re.Value)
- } else if xtag != realxtag {
- d.d.errorf("Wrong extension tag. Got %b. Expecting: %v", realxtag, xtag)
- } else if ext == SelfExt {
- d.d.decodeValue(baseRV(rv), d.h.fnNoExt(basetype))
- } else {
- d.d.interfaceExtConvertAndDecode(rv, ext)
- }
- d.bdRead = false
-}
-
-func (d *cborDecDriver) DecodeNaked() {
- if !d.bdRead {
- d.readNextBd()
- }
-
- n := d.d.naked()
- var decodeFurther bool
-
- switch d.bd >> 5 {
- case cborMajorUint:
- if d.h.SignedInteger {
- n.v = valueTypeInt
- n.i = d.DecodeInt64()
- } else {
- n.v = valueTypeUint
- n.u = d.DecodeUint64()
- }
- case cborMajorNegInt:
- n.v = valueTypeInt
- n.i = d.DecodeInt64()
- case cborMajorBytes:
- d.d.fauxUnionReadRawBytes(false)
- case cborMajorString:
- n.v = valueTypeString
- n.s = d.d.stringZC(d.DecodeStringAsBytes())
- case cborMajorArray:
- n.v = valueTypeArray
- decodeFurther = true
- case cborMajorMap:
- n.v = valueTypeMap
- decodeFurther = true
- case cborMajorTag:
- n.v = valueTypeExt
- n.u = d.decUint()
- n.l = nil
- if n.u == 0 || n.u == 1 {
- d.bdRead = false
- n.v = valueTypeTime
- n.t = d.decodeTime(n.u)
- } else if d.st && d.h.getExtForTag(n.u) == nil {
- // d.skipTags() // no need to call this - tags already skipped
- d.bdRead = false
- d.DecodeNaked()
- return // return when done (as true recursive function)
- }
- case cborMajorSimpleOrFloat:
- switch d.bd {
- case cborBdNil, cborBdUndefined:
- n.v = valueTypeNil
- case cborBdFalse:
- n.v = valueTypeBool
- n.b = false
- case cborBdTrue:
- n.v = valueTypeBool
- n.b = true
- case cborBdFloat16, cborBdFloat32, cborBdFloat64:
- n.v = valueTypeFloat
- n.f = d.DecodeFloat64()
- default:
- d.d.errorf("decodeNaked: Unrecognized d.bd: 0x%x", d.bd)
- }
- default: // should never happen
- d.d.errorf("decodeNaked: Unrecognized d.bd: 0x%x", d.bd)
- }
- if !decodeFurther {
- d.bdRead = false
- }
-}
-
-func (d *cborDecDriver) uintBytes() (v []byte, ui uint64) {
- // this is only used by nextValueBytes, so it's ok to
- // use readx and bigenstd here.
- switch vv := d.bd & 0x1f; vv {
- case 0x18:
- v = d.d.decRd.readx(1)
- ui = uint64(v[0])
- case 0x19:
- v = d.d.decRd.readx(2)
- ui = uint64(bigenstd.Uint16(v))
- case 0x1a:
- v = d.d.decRd.readx(4)
- ui = uint64(bigenstd.Uint32(v))
- case 0x1b:
- v = d.d.decRd.readx(8)
- ui = uint64(bigenstd.Uint64(v))
- default:
- if vv > 0x1b {
- d.d.errorf("invalid descriptor decoding uint: %x/%s", d.bd, cbordesc(d.bd))
- }
- ui = uint64(vv)
- }
- return
-}
-
-func (d *cborDecDriver) nextValueBytes(v0 []byte) (v []byte) {
- if !d.bdRead {
- d.readNextBd()
- }
- v = v0
- var h = decNextValueBytesHelper{d: &d.d}
- var cursor = d.d.rb.c - 1
- h.append1(&v, d.bd)
- v = d.nextValueBytesBdReadR(v)
- d.bdRead = false
- h.bytesRdV(&v, cursor)
- return
-}
-
-func (d *cborDecDriver) nextValueBytesR(v0 []byte) (v []byte) {
- d.readNextBd()
- v = v0
- var h = decNextValueBytesHelper{d: &d.d}
- h.append1(&v, d.bd)
- return d.nextValueBytesBdReadR(v)
-}
-
-func (d *cborDecDriver) nextValueBytesBdReadR(v0 []byte) (v []byte) {
- v = v0
- var h = decNextValueBytesHelper{d: &d.d}
-
- var bs []byte
- var ui uint64
-
- switch d.bd >> 5 {
- case cborMajorUint, cborMajorNegInt:
- bs, _ = d.uintBytes()
- h.appendN(&v, bs...)
- case cborMajorString, cborMajorBytes:
- if d.bd == cborBdIndefiniteBytes || d.bd == cborBdIndefiniteString {
- for {
- d.readNextBd()
- h.append1(&v, d.bd)
- if d.bd == cborBdBreak {
- break
- }
- bs, ui = d.uintBytes()
- h.appendN(&v, bs...)
- h.appendN(&v, d.d.decRd.readx(uint(ui))...)
- }
- } else {
- bs, ui = d.uintBytes()
- h.appendN(&v, bs...)
- h.appendN(&v, d.d.decRd.readx(uint(ui))...)
- }
- case cborMajorArray:
- if d.bd == cborBdIndefiniteArray {
- for {
- d.readNextBd()
- h.append1(&v, d.bd)
- if d.bd == cborBdBreak {
- break
- }
- v = d.nextValueBytesBdReadR(v)
- }
- } else {
- bs, ui = d.uintBytes()
- h.appendN(&v, bs...)
- for i := uint64(0); i < ui; i++ {
- v = d.nextValueBytesR(v)
- }
- }
- case cborMajorMap:
- if d.bd == cborBdIndefiniteMap {
- for {
- d.readNextBd()
- h.append1(&v, d.bd)
- if d.bd == cborBdBreak {
- break
- }
- v = d.nextValueBytesBdReadR(v)
- v = d.nextValueBytesR(v)
- }
- } else {
- bs, ui = d.uintBytes()
- h.appendN(&v, bs...)
- for i := uint64(0); i < ui; i++ {
- v = d.nextValueBytesR(v)
- v = d.nextValueBytesR(v)
- }
- }
- case cborMajorTag:
- bs, _ = d.uintBytes()
- h.appendN(&v, bs...)
- v = d.nextValueBytesR(v)
- case cborMajorSimpleOrFloat:
- switch d.bd {
- case cborBdNil, cborBdUndefined, cborBdFalse, cborBdTrue: // pass
- case cborBdFloat16:
- h.appendN(&v, d.d.decRd.readx(2)...)
- case cborBdFloat32:
- h.appendN(&v, d.d.decRd.readx(4)...)
- case cborBdFloat64:
- h.appendN(&v, d.d.decRd.readx(8)...)
- default:
- d.d.errorf("nextValueBytes: Unrecognized d.bd: 0x%x", d.bd)
- }
- default: // should never happen
- d.d.errorf("nextValueBytes: Unrecognized d.bd: 0x%x", d.bd)
- }
- return
-}
-
-// -------------------------
-
-// CborHandle is a Handle for the CBOR encoding format,
-// defined at http://tools.ietf.org/html/rfc7049 and documented further at http://cbor.io .
-//
-// CBOR is comprehensively supported, including support for:
-// - indefinite-length arrays/maps/bytes/strings
-// - (extension) tags in range 0..0xffff (0 .. 65535)
-// - half, single and double-precision floats
-// - all numbers (1, 2, 4 and 8-byte signed and unsigned integers)
-// - nil, true, false, ...
-// - arrays and maps, bytes and text strings
-//
-// None of the optional extensions (with tags) defined in the spec are supported out-of-the-box.
-// Users can implement them as needed (using SetExt), including spec-documented ones:
-// - timestamp, BigNum, BigFloat, Decimals,
-// - Encoded Text (e.g. URL, regexp, base64, MIME Message), etc.
-type CborHandle struct {
- binaryEncodingType
- // noElemSeparators
- BasicHandle
-
- // IndefiniteLength=true, means that we encode using indefinitelength
- IndefiniteLength bool
-
- // TimeRFC3339 says to encode time.Time using RFC3339 format.
- // If unset, we encode time.Time using seconds past epoch.
- TimeRFC3339 bool
-
- // SkipUnexpectedTags says to skip over any tags for which extensions are
- // not defined. This is in keeping with the cbor spec on "Optional Tagging of Items".
- //
- // Furthermore, this allows the skipping over of the Self Describing Tag 0xd9d9f7.
- SkipUnexpectedTags bool
-}
-
-// Name returns the name of the handle: cbor
-func (h *CborHandle) Name() string { return "cbor" }
-
-func (h *CborHandle) desc(bd byte) string { return cbordesc(bd) }
-
-func (h *CborHandle) newEncDriver() encDriver {
- var e = &cborEncDriver{h: h}
- e.e.e = e
- e.e.init(h)
- e.reset()
- return e
-}
-
-func (h *CborHandle) newDecDriver() decDriver {
- d := &cborDecDriver{h: h, st: h.SkipUnexpectedTags}
- d.d.d = d
- d.d.cbor = true
- d.d.init(h)
- d.reset()
- return d
-}
-
-func (d *cborDecDriver) reset() {
- d.bdAndBdread.reset()
- d.st = d.h.SkipUnexpectedTags
-}
-
-var _ decDriver = (*cborDecDriver)(nil)
-var _ encDriver = (*cborEncDriver)(nil)