diff options
| author | 2025-03-09 17:47:56 +0100 | |
|---|---|---|
| committer | 2025-12-01 22:08:04 +0100 | |
| commit | b1af8fd87760b34e3ff2fd3bda38f211815a0473 (patch) | |
| tree | 9317fad1a7ec298d7a8d2678e4e422953bbc6f33 /vendor/github.com/ugorji/go/codec/cbor.go | |
| parent | [chore] update URLs to forked source (diff) | |
| download | gotosocial-b1af8fd87760b34e3ff2fd3bda38f211815a0473.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.go | 995 |
1 files changed, 0 insertions, 995 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 2229a2b26..000000000 --- a/vendor/github.com/ugorji/go/codec/cbor.go +++ /dev/null @@ -1,995 +0,0 @@ -//go:build notmono || codec.notmono - -// 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 ( - "io" - "math" - "math/big" - "reflect" - "time" - "unicode/utf8" -) - -// ------------------- - -type cborEncDriver[T encWriter] struct { - noBuiltInTypes - encDriverNoState - encDriverNoopContainerWriter - encDriverContainerNoTrackerT - - h *CborHandle - e *encoderBase - w T - enc encoderI - - // scratch buffer for: encode time, numbers, etc - // - // RFC3339Nano uses 35 chars: 2006-01-02T15:04:05.999999999Z07:00 - b [40]byte -} - -func (e *cborEncDriver[T]) EncodeNil() { - e.w.writen1(cborBdNil) -} - -func (e *cborEncDriver[T]) EncodeBool(b bool) { - if b { - e.w.writen1(cborBdTrue) - } else { - e.w.writen1(cborBdFalse) - } -} - -func (e *cborEncDriver[T]) EncodeFloat32(f float32) { - b := math.Float32bits(f) - if e.h.OptimumSize { - if h := floatToHalfFloatBits(b); halfFloatToFloatBits(h) == b { - e.w.writen1(cborBdFloat16) - e.w.writen2(bigen.PutUint16(h)) - return - } - } - e.w.writen1(cborBdFloat32) - e.w.writen4(bigen.PutUint32(b)) -} - -func (e *cborEncDriver[T]) EncodeFloat64(f float64) { - if e.h.OptimumSize { - if f32 := float32(f); float64(f32) == f { - e.EncodeFloat32(f32) - return - } - } - e.w.writen1(cborBdFloat64) - e.w.writen8(bigen.PutUint64(math.Float64bits(f))) -} - -func (e *cborEncDriver[T]) encUint(v uint64, bd byte) { - if v <= 0x17 { - e.w.writen1(byte(v) + bd) - } else if v <= math.MaxUint8 { - e.w.writen2(bd+0x18, uint8(v)) - } else if v <= math.MaxUint16 { - e.w.writen1(bd + 0x19) - e.w.writen2(bigen.PutUint16(uint16(v))) - } else if v <= math.MaxUint32 { - e.w.writen1(bd + 0x1a) - e.w.writen4(bigen.PutUint32(uint32(v))) - } else { // if v <= math.MaxUint64 { - e.w.writen1(bd + 0x1b) - e.w.writen8(bigen.PutUint64(v)) - } -} - -func (e *cborEncDriver[T]) EncodeInt(v int64) { - if v < 0 { - e.encUint(uint64(-1-v), cborBaseNegInt) - } else { - e.encUint(uint64(v), cborBaseUint) - } -} - -func (e *cborEncDriver[T]) EncodeUint(v uint64) { - e.encUint(v, cborBaseUint) -} - -func (e *cborEncDriver[T]) encLen(bd byte, length int) { - e.encUint(uint64(length), bd) -} - -func (e *cborEncDriver[T]) EncodeTime(t time.Time) { - if t.IsZero() { - e.EncodeNil() - } else if e.h.TimeRFC3339 { - e.encUint(0, cborBaseTag) - e.encStringBytesS(cborBaseString, stringView(t.AppendFormat(e.b[:0], time.RFC3339Nano))) - } 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[T]) EncodeExt(rv interface{}, basetype reflect.Type, xtag uint64, ext Ext) { - e.encUint(uint64(xtag), cborBaseTag) - if ext == SelfExt { - e.enc.encodeAs(rv, basetype, false) - } else if v := ext.ConvertExt(rv); v == nil { - e.writeNilBytes() - } else { - e.enc.encodeI(v) - } -} - -func (e *cborEncDriver[T]) EncodeRawExt(re *RawExt) { - e.encUint(uint64(re.Tag), cborBaseTag) - if re.Data != nil { - e.w.writeb(re.Data) - } else if re.Value != nil { - e.enc.encodeI(re.Value) - } else { - e.EncodeNil() - } -} - -func (e *cborEncDriver[T]) WriteArrayEmpty() { - if e.h.IndefiniteLength { - e.w.writen2(cborBdIndefiniteArray, cborBdBreak) - } else { - e.w.writen1(cborBaseArray) - // e.encLen(cborBaseArray, 0) - } -} - -func (e *cborEncDriver[T]) WriteMapEmpty() { - if e.h.IndefiniteLength { - e.w.writen2(cborBdIndefiniteMap, cborBdBreak) - } else { - e.w.writen1(cborBaseMap) - // e.encLen(cborBaseMap, 0) - } -} - -func (e *cborEncDriver[T]) WriteArrayStart(length int) { - if e.h.IndefiniteLength { - e.w.writen1(cborBdIndefiniteArray) - } else { - e.encLen(cborBaseArray, length) - } -} - -func (e *cborEncDriver[T]) WriteMapStart(length int) { - if e.h.IndefiniteLength { - e.w.writen1(cborBdIndefiniteMap) - } else { - e.encLen(cborBaseMap, length) - } -} - -func (e *cborEncDriver[T]) WriteMapEnd() { - if e.h.IndefiniteLength { - e.w.writen1(cborBdBreak) - } -} - -func (e *cborEncDriver[T]) WriteArrayEnd() { - if e.h.IndefiniteLength { - e.w.writen1(cborBdBreak) - } -} - -func (e *cborEncDriver[T]) EncodeString(v string) { - bb := cborBaseString - if e.h.StringToRaw { - bb = cborBaseBytes - } - e.encStringBytesS(bb, v) -} - -func (e *cborEncDriver[T]) EncodeStringNoEscape4Json(v string) { e.EncodeString(v) } - -func (e *cborEncDriver[T]) EncodeStringBytesRaw(v []byte) { - e.encStringBytesS(cborBaseBytes, stringView(v)) -} - -func (e *cborEncDriver[T]) encStringBytesS(bb byte, v string) { - if e.h.IndefiniteLength { - if bb == cborBaseBytes { - e.w.writen1(cborBdIndefiniteBytes) - } else { - e.w.writen1(cborBdIndefiniteString) - } - vlen := uint(len(v)) - n := max(4, min(vlen/4, 1024)) - for i := uint(0); i < vlen; { - i2 := i + n - if i2 >= vlen { - i2 = vlen - } - v2 := v[i:i2] - e.encLen(bb, len(v2)) - e.w.writestr(v2) - i = i2 - } - e.w.writen1(cborBdBreak) - } else { - e.encLen(bb, len(v)) - e.w.writestr(v) - } -} - -func (e *cborEncDriver[T]) EncodeBytes(v []byte) { - if v == nil { - e.writeNilBytes() - return - } - e.EncodeStringBytesRaw(v) -} - -func (e *cborEncDriver[T]) writeNilOr(v byte) { - if !e.h.NilCollectionToZeroLength { - v = cborBdNil - } - e.w.writen1(v) -} - -func (e *cborEncDriver[T]) writeNilArray() { - e.writeNilOr(cborBaseArray) -} - -func (e *cborEncDriver[T]) writeNilMap() { - e.writeNilOr(cborBaseMap) -} - -func (e *cborEncDriver[T]) writeNilBytes() { - e.writeNilOr(cborBaseBytes) -} - -// ---------------------- - -type cborDecDriver[T decReader] struct { - decDriverNoopContainerReader - // decDriverNoopNumberHelper - noBuiltInTypes - - h *CborHandle - d *decoderBase - r T - dec decoderI - bdAndBdread - // st bool // skip tags - // bytes bool -} - -func (d *cborDecDriver[T]) readNextBd() { - d.bd = d.r.readn1() - d.bdRead = true -} - -func (d *cborDecDriver[T]) 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[T]) 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[T]) skipTags() { - for d.bd>>5 == cborMajorTag { - d.decUint() - d.bd = d.r.readn1() - } -} - -func (d *cborDecDriver[T]) ContainerType() (vt valueType) { - if !d.bdRead { - d.readNextBd() - } - if d.h.SkipUnexpectedTags { - 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[T]) CheckBreak() (v bool) { - if !d.bdRead { - d.readNextBd() - } - if d.bd == cborBdBreak { - d.bdRead = false - v = true - } - return -} - -func (d *cborDecDriver[T]) decUint() (ui uint64) { - v := d.bd & 0x1f - if v <= 0x17 { - ui = uint64(v) - } else if v == 0x18 { - ui = uint64(d.r.readn1()) - } else if v == 0x19 { - ui = uint64(bigen.Uint16(d.r.readn2())) - } else if v == 0x1a { - ui = uint64(bigen.Uint32(d.r.readn4())) - } else if v == 0x1b { - ui = uint64(bigen.Uint64(d.r.readn8())) - } else { - halt.errorf("invalid descriptor decoding uint: %x/%s (%x)", d.bd, cbordesc(d.bd), v) - } - return -} - -func (d *cborDecDriver[T]) decLen() int { - return int(d.decUint()) -} - -func (d *cborDecDriver[T]) decFloat() (f float64, ok bool) { - ok = true - switch d.bd { - case cborBdFloat16: - f = float64(math.Float32frombits(halfFloatToFloatBits(bigen.Uint16(d.r.readn2())))) - case cborBdFloat32: - f = float64(math.Float32frombits(bigen.Uint32(d.r.readn4()))) - case cborBdFloat64: - f = math.Float64frombits(bigen.Uint64(d.r.readn8())) - default: - if d.bd>>5 == cborMajorTag { - // extension tag for bignum/decimal - switch d.bd & 0x1f { // tag - case 2: - f = d.decTagBigIntAsFloat(false) - case 3: - f = d.decTagBigIntAsFloat(true) - case 4: - f = d.decTagBigFloatAsFloat(true) - case 5: - f = d.decTagBigFloatAsFloat(false) - default: - ok = false - } - } else { - ok = false - } - } - return -} - -func (d *cborDecDriver[T]) 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[T]) DecodeInt64() (i int64) { - if d.advanceNil() { - return - } - if d.h.SkipUnexpectedTags { - d.skipTags() - } - v1, v2, v3 := d.decInteger() - i = decNegintPosintFloatNumberHelper{d}.int64(v1, v2, v3, true) - d.bdRead = false - return -} - -func (d *cborDecDriver[T]) DecodeUint64() (ui uint64) { - if d.advanceNil() { - return - } - if d.h.SkipUnexpectedTags { - d.skipTags() - } - ui = decNegintPosintFloatNumberHelper{d}.uint64(d.decInteger()) - d.bdRead = false - return -} - -func (d *cborDecDriver[T]) DecodeFloat64() (f float64) { - if d.advanceNil() { - return - } - if d.h.SkipUnexpectedTags { - d.skipTags() - } - v1, v2 := d.decFloat() - f = decNegintPosintFloatNumberHelper{d}.float64(v1, v2, true) - d.bdRead = false - return -} - -// bool can be decoded from bool only (single byte). -func (d *cborDecDriver[T]) DecodeBool() (b bool) { - if d.advanceNil() { - return - } - if d.h.SkipUnexpectedTags { - d.skipTags() - } - if d.bd == cborBdTrue { - b = true - } else if d.bd == cborBdFalse { - } else { - halt.errorf("not bool - %s %x/%s", msgBadDesc, d.bd, cbordesc(d.bd)) - } - d.bdRead = false - return -} - -func (d *cborDecDriver[T]) ReadMapStart() (length int) { - if d.advanceNil() { - return containerLenNil - } - if d.h.SkipUnexpectedTags { - d.skipTags() - } - d.bdRead = false - if d.bd == cborBdIndefiniteMap { - return containerLenUnknown - } - if d.bd>>5 != cborMajorMap { - halt.errorf("error reading map; got major type: %x, expected %x/%s", d.bd>>5, cborMajorMap, cbordesc(d.bd)) - } - return d.decLen() -} - -func (d *cborDecDriver[T]) ReadArrayStart() (length int) { - if d.advanceNil() { - return containerLenNil - } - if d.h.SkipUnexpectedTags { - d.skipTags() - } - d.bdRead = false - if d.bd == cborBdIndefiniteArray { - return containerLenUnknown - } - if d.bd>>5 != cborMajorArray { - halt.errorf("invalid array; got major type: %x, expect: %x/%s", d.bd>>5, cborMajorArray, cbordesc(d.bd)) - } - return d.decLen() -} - -// MARKER d.d.buf is ONLY used within DecodeBytes. -// Safe to use freely here only. - -func (d *cborDecDriver[T]) DecodeBytes() (bs []byte, state dBytesAttachState) { - if d.advanceNil() { - return - } - if d.h.SkipUnexpectedTags { - d.skipTags() - } - fnEnsureNonNilBytes := func() { - // buf is nil at first. Ensure a non-nil value is returned. - if bs == nil { - bs = zeroByteSlice - state = dBytesDetach - } - } - if d.bd == cborBdIndefiniteBytes || d.bd == cborBdIndefiniteString { - major := d.bd >> 5 - val4str := d.h.ValidateUnicode && major == cborMajorString - bs = d.d.buf[:0] - d.bdRead = false - for !d.CheckBreak() { - if d.bd>>5 != major { - const msg = "malformed indefinite string/bytes %x (%s); " + - "contains chunk with major type %v, expected %v" - halt.errorf(msg, d.bd, cbordesc(d.bd), d.bd>>5, major) - } - n := uint(d.decLen()) - bs = append(bs, d.r.readx(n)...) - d.bdRead = false - if val4str && !utf8.Valid(bs[len(bs)-int(n):]) { - const msg = "indefinite-length text string contains chunk " + - "that is not a valid utf-8 sequence: 0x%x" - halt.errorf(msg, bs[len(bs)-int(n):]) - } - } - d.bdRead = false - d.d.buf = bs - state = dBytesAttachBuffer - fnEnsureNonNilBytes() - return - } - if d.bd == cborBdIndefiniteArray { - d.bdRead = false - bs = d.d.buf[:0] - for !d.CheckBreak() { - bs = append(bs, uint8(chkOvf.UintV(d.DecodeUint64(), 8))) - } - d.d.buf = bs - state = dBytesAttachBuffer - fnEnsureNonNilBytes() - return - } - var cond bool - if d.bd>>5 == cborMajorArray { - d.bdRead = false - slen := d.decLen() - bs, cond = usableByteSlice(d.d.buf, slen) - 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))) - } - if cond { - d.d.buf = bs - } - state = dBytesAttachBuffer - fnEnsureNonNilBytes() - return - } - clen := d.decLen() - d.bdRead = false - bs, cond = d.r.readxb(uint(clen)) - state = d.d.attachState(cond) - return -} - -func (d *cborDecDriver[T]) DecodeStringAsBytes() (out []byte, state dBytesAttachState) { - out, state = d.DecodeBytes() - if d.h.ValidateUnicode && !utf8.Valid(out) { - halt.errorf("DecodeStringAsBytes: invalid UTF-8: %s", out) - } - return -} - -func (d *cborDecDriver[T]) DecodeTime() (t time.Time) { - if d.advanceNil() { - return - } - if d.bd>>5 != cborMajorTag { - halt.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[T]) decodeTime(xtag uint64) (t time.Time) { - switch xtag { - case 0: - var err error - t, err = time.Parse(time.RFC3339, stringView(bytesOKs(d.DecodeStringAsBytes()))) - halt.onerror(err) - case 1: - f1, f2 := math.Modf(d.DecodeFloat64()) - t = time.Unix(int64(f1), int64(f2*1e9)) - default: - halt.errorf("invalid tag for time.Time - expecting 0 or 1, got 0x%x", xtag) - } - t = t.UTC().Round(time.Microsecond) - return -} - -func (d *cborDecDriver[T]) preDecodeExt(checkTag bool, xtag uint64) (realxtag uint64, ok bool) { - if d.advanceNil() { - return - } - if d.bd>>5 != cborMajorTag { - halt.errorf("error reading tag; expected major type: %x, got: %x", cborMajorTag, d.bd>>5) - } - realxtag = d.decUint() - d.bdRead = false - if checkTag && xtag != realxtag { - halt.errorf("Wrong extension tag. Got %b. Expecting: %v", realxtag, xtag) - } - ok = true - return -} - -func (d *cborDecDriver[T]) DecodeRawExt(re *RawExt) { - if realxtag, ok := d.preDecodeExt(false, 0); ok { - re.Tag = realxtag - d.dec.decode(&re.Value) - d.bdRead = false - } -} - -func (d *cborDecDriver[T]) DecodeExt(rv interface{}, basetype reflect.Type, xtag uint64, ext Ext) { - if _, ok := d.preDecodeExt(true, xtag); ok { - if ext == SelfExt { - d.dec.decodeAs(rv, basetype, false) - } else { - d.dec.interfaceExtConvertAndDecode(rv, ext) - } - d.bdRead = false - } -} - -func (d *cborDecDriver[T]) decTagBigIntAsFloat(neg bool) (f float64) { - bs, _ := d.DecodeBytes() - bi := new(big.Int).SetBytes(bs) - if neg { // neg big.Int - bi0 := bi - bi = new(big.Int).Sub(big.NewInt(-1), bi0) - } - f, _ = bi.Float64() - return -} - -func (d *cborDecDriver[T]) decTagBigFloatAsFloat(decimal bool) (f float64) { - if nn := d.r.readn1(); nn != 82 { - halt.errorf("(%d) decoding decimal/big.Float: expected 2 numbers", nn) - } - exp := d.DecodeInt64() - mant := d.DecodeInt64() - if decimal { // m*(10**e) - // MARKER: if precision/other issues crop, consider using big.Float on base 10. - // The logic is more convoluted, which is why we leverage readFloatResult for now. - rf := readFloatResult{exp: int8(exp)} - if mant >= 0 { - rf.mantissa = uint64(mant) - } else { - rf.neg = true - rf.mantissa = uint64(-mant) - } - f, _ = parseFloat64_reader(rf) - // f = float64(mant) * math.Pow10(exp) - } else { // m*(2**e) - // f = float64(mant) * math.Pow(2, exp) - bfm := new(big.Float).SetPrec(64).SetInt64(mant) - bf := new(big.Float).SetPrec(64).SetMantExp(bfm, int(exp)) - f, _ = bf.Float64() - } - return -} - -func (d *cborDecDriver[T]) 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(d, false, d.h.RawToString) //, d.h.ZeroCopy) - case cborMajorString: - n.v = valueTypeString - n.s = d.d.detach2Str(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() - d.bdRead = false - n.l = nil - xx := d.h.getExtForTag(n.u) - if xx == nil { - switch n.u { - case 0, 1: - n.v = valueTypeTime - n.t = d.decodeTime(n.u) - case 2: - n.f = d.decTagBigIntAsFloat(false) - n.v = valueTypeFloat - case 3: - n.f = d.decTagBigIntAsFloat(true) - n.v = valueTypeFloat - case 4: - n.f = d.decTagBigFloatAsFloat(true) - n.v = valueTypeFloat - case 5: - n.f = d.decTagBigFloatAsFloat(false) - n.v = valueTypeFloat - case 55799: // skip - d.DecodeNaked() - default: - if d.h.SkipUnexpectedTags { - d.DecodeNaked() - } - // else we will use standard mode to decode ext e.g. into a RawExt - } - return - } - // if n.u == 0 || n.u == 1 { - // d.bdRead = false - // n.v = valueTypeTime - // n.t = d.decodeTime(n.u) - // } else if d.h.SkipUnexpectedTags && 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: - halt.errorf("decodeNaked: Unrecognized d.bd: 0x%x", d.bd) - } - default: // should never happen - halt.errorf("decodeNaked: Unrecognized d.bd: 0x%x", d.bd) - } - if !decodeFurther { - d.bdRead = false - } -} - -func (d *cborDecDriver[T]) 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.r.readx(1) - ui = uint64(v[0]) - case 0x19: - v = d.r.readx(2) - ui = uint64(bigenstd.Uint16(v)) - case 0x1a: - v = d.r.readx(4) - ui = uint64(bigenstd.Uint32(v)) - case 0x1b: - v = d.r.readx(8) - ui = uint64(bigenstd.Uint64(v)) - default: - if vv > 0x1b { - halt.errorf("invalid descriptor decoding uint: %x/%s", d.bd, cbordesc(d.bd)) - } - ui = uint64(vv) - } - return -} - -func (d *cborDecDriver[T]) nextValueBytes() (v []byte) { - if !d.bdRead { - d.readNextBd() - } - d.r.startRecording() - d.nextValueBytesBdReadR() - v = d.r.stopRecording() - d.bdRead = false - return -} - -// func (d *cborDecDriver[T]) nextValueBytesR(v0 []byte) (v []byte) { -// d.readNextBd() -// v0 = append(v0, d.bd) -// d.r.startRecording(v0) -// d.nextValueBytesBdReadR() -// v = d.r.stopRecording() -// return -// } - -func (d *cborDecDriver[T]) nextValueBytesBdReadR() { - // var bs []byte - var ui uint64 - - switch d.bd >> 5 { - case cborMajorUint, cborMajorNegInt: - d.uintBytes() - case cborMajorString, cborMajorBytes: - if d.bd == cborBdIndefiniteBytes || d.bd == cborBdIndefiniteString { - for { - d.readNextBd() - if d.bd == cborBdBreak { - break - } - _, ui = d.uintBytes() - d.r.skip(uint(ui)) - } - } else { - _, ui = d.uintBytes() - d.r.skip(uint(ui)) - } - case cborMajorArray: - if d.bd == cborBdIndefiniteArray { - for { - d.readNextBd() - if d.bd == cborBdBreak { - break - } - d.nextValueBytesBdReadR() - } - } else { - _, ui = d.uintBytes() - for i := uint64(0); i < ui; i++ { - d.readNextBd() - d.nextValueBytesBdReadR() - } - } - case cborMajorMap: - if d.bd == cborBdIndefiniteMap { - for { - d.readNextBd() - if d.bd == cborBdBreak { - break - } - d.nextValueBytesBdReadR() - d.readNextBd() - d.nextValueBytesBdReadR() - } - } else { - _, ui = d.uintBytes() - for i := uint64(0); i < ui; i++ { - d.readNextBd() - d.nextValueBytesBdReadR() - d.readNextBd() - d.nextValueBytesBdReadR() - } - } - case cborMajorTag: - d.uintBytes() - d.readNextBd() - d.nextValueBytesBdReadR() - case cborMajorSimpleOrFloat: - switch d.bd { - case cborBdNil, cborBdUndefined, cborBdFalse, cborBdTrue: // pass - case cborBdFloat16: - d.r.skip(2) - case cborBdFloat32: - d.r.skip(4) - case cborBdFloat64: - d.r.skip(8) - default: - halt.errorf("nextValueBytes: Unrecognized d.bd: 0x%x", d.bd) - } - default: // should never happen - halt.errorf("nextValueBytes: Unrecognized d.bd: 0x%x", d.bd) - } - return -} - -func (d *cborDecDriver[T]) reset() { - d.bdAndBdread.reset() - // d.st = d.h.SkipUnexpectedTags -} - -// ---- -// -// The following below are similar across all format files (except for the format name). -// -// We keep them together here, so that we can easily copy and compare. - -// ---- - -func (d *cborEncDriver[T]) init(hh Handle, shared *encoderBase, enc encoderI) (fp interface{}) { - callMake(&d.w) - d.h = hh.(*CborHandle) - d.e = shared - if shared.bytes { - fp = cborFpEncBytes - } else { - fp = cborFpEncIO - } - // d.w.init() - d.init2(enc) - return -} - -func (e *cborEncDriver[T]) writeBytesAsis(b []byte) { e.w.writeb(b) } - -// func (e *cborEncDriver[T]) writeStringAsisDblQuoted(v string) { e.w.writeqstr(v) } - -func (e *cborEncDriver[T]) writerEnd() { e.w.end() } - -func (e *cborEncDriver[T]) resetOutBytes(out *[]byte) { - e.w.resetBytes(*out, out) -} - -func (e *cborEncDriver[T]) resetOutIO(out io.Writer) { - e.w.resetIO(out, e.h.WriterBufferSize, &e.e.blist) -} - -// ---- - -func (d *cborDecDriver[T]) init(hh Handle, shared *decoderBase, dec decoderI) (fp interface{}) { - callMake(&d.r) - d.h = hh.(*CborHandle) - d.d = shared - if shared.bytes { - fp = cborFpDecBytes - } else { - fp = cborFpDecIO - } - // d.r.init() - d.init2(dec) - return -} - -func (d *cborDecDriver[T]) NumBytesRead() int { - return int(d.r.numread()) -} - -func (d *cborDecDriver[T]) resetInBytes(in []byte) { - d.r.resetBytes(in) -} - -func (d *cborDecDriver[T]) resetInIO(r io.Reader) { - d.r.resetIO(r, d.h.ReaderBufferSize, d.h.MaxInitLen, &d.d.blist) -} - -// ---- (custom stanza) - -func (d *cborDecDriver[T]) descBd() string { - return sprintf("%v (%s)", d.bd, cbordesc(d.bd)) -} - -func (d *cborDecDriver[T]) DecodeFloat32() (f float32) { - return float32(chkOvf.Float32V(d.DecodeFloat64())) -} - -func (d *cborEncDriver[T]) init2(enc encoderI) { - d.enc = enc -} - -func (d *cborDecDriver[T]) init2(dec decoderI) { - d.dec = dec - // d.d.cbor = true -} |
