mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-10-29 17:52:24 -05:00
- github.com/KimMachineGun/automemlimit v0.7.2 => v0.7.3
- github.com/gin-contrib/cors v1.7.5 => v1.7.6
- github.com/minio/minio-go/v7 v7.0.92 => v7.0.94
- github.com/spf13/cast v1.8.0 => v1.9.2
- github.com/uptrace/bun{,/*} v1.2.11 => v1.2.14
- golang.org/x/image v0.27.0 => v0.28.0
- golang.org/x/net v0.40.0 => v0.41.0
- code.superseriousbusiness.org/go-swagger v0.31.0-gts-go1.23-fix => v0.32.3-gts-go1.23-fix
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4304
Co-authored-by: kim <grufwub@gmail.com>
Co-committed-by: kim <grufwub@gmail.com>
194 lines
4.9 KiB
Go
194 lines
4.9 KiB
Go
// 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 (
|
|
"reflect"
|
|
"time"
|
|
)
|
|
|
|
// Symbol management:
|
|
// - symbols are stored in a symbol map during encoding and decoding.
|
|
// - the symbols persist until the (En|De)coder ResetXXX method is called.
|
|
|
|
const bincDoPrune = true
|
|
|
|
// vd as low 4 bits (there are 16 slots)
|
|
const (
|
|
bincVdSpecial byte = iota
|
|
bincVdPosInt
|
|
bincVdNegInt
|
|
bincVdFloat
|
|
|
|
bincVdString
|
|
bincVdByteArray
|
|
bincVdArray
|
|
bincVdMap
|
|
|
|
bincVdTimestamp
|
|
bincVdSmallInt
|
|
_ // bincVdUnicodeOther
|
|
bincVdSymbol
|
|
|
|
_ // bincVdDecimal
|
|
_ // open slot
|
|
_ // open slot
|
|
bincVdCustomExt = 0x0f
|
|
)
|
|
|
|
const (
|
|
bincSpNil byte = iota
|
|
bincSpFalse
|
|
bincSpTrue
|
|
bincSpNan
|
|
bincSpPosInf
|
|
bincSpNegInf
|
|
bincSpZeroFloat
|
|
bincSpZero
|
|
bincSpNegOne
|
|
)
|
|
|
|
const (
|
|
_ byte = iota // bincFlBin16
|
|
bincFlBin32
|
|
_ // bincFlBin32e
|
|
bincFlBin64
|
|
_ // bincFlBin64e
|
|
// others not currently supported
|
|
)
|
|
|
|
const bincBdNil = 0 // bincVdSpecial<<4 | bincSpNil // staticcheck barfs on this (SA4016)
|
|
|
|
var (
|
|
bincdescSpecialVsNames = map[byte]string{
|
|
bincSpNil: "nil",
|
|
bincSpFalse: "false",
|
|
bincSpTrue: "true",
|
|
bincSpNan: "float",
|
|
bincSpPosInf: "float",
|
|
bincSpNegInf: "float",
|
|
bincSpZeroFloat: "float",
|
|
bincSpZero: "uint",
|
|
bincSpNegOne: "int",
|
|
}
|
|
bincdescVdNames = map[byte]string{
|
|
bincVdSpecial: "special",
|
|
bincVdSmallInt: "uint",
|
|
bincVdPosInt: "uint",
|
|
bincVdFloat: "float",
|
|
bincVdSymbol: "string",
|
|
bincVdString: "string",
|
|
bincVdByteArray: "bytes",
|
|
bincVdTimestamp: "time",
|
|
bincVdCustomExt: "ext",
|
|
bincVdArray: "array",
|
|
bincVdMap: "map",
|
|
}
|
|
)
|
|
|
|
func bincdescbd(bd byte) (s string) {
|
|
return bincdesc(bd>>4, bd&0x0f)
|
|
}
|
|
|
|
func bincdesc(vd, vs byte) (s string) {
|
|
if vd == bincVdSpecial {
|
|
s = bincdescSpecialVsNames[vs]
|
|
} else {
|
|
s = bincdescVdNames[vd]
|
|
}
|
|
if s == "" {
|
|
s = "unknown"
|
|
}
|
|
return
|
|
}
|
|
|
|
type bincEncState struct {
|
|
m map[string]uint16 // symbols
|
|
}
|
|
|
|
// func (e *bincEncState) restoreState(v interface{}) { e.m = v.(map[string]uint16) }
|
|
// func (e bincEncState) captureState() interface{} { return e.m }
|
|
// func (e *bincEncState) resetState() { e.m = nil }
|
|
// func (e *bincEncState) reset() { e.resetState() }
|
|
func (e *bincEncState) reset() { e.m = nil }
|
|
|
|
type bincDecState struct {
|
|
bdRead bool
|
|
bd byte
|
|
vd byte
|
|
vs byte
|
|
|
|
_ bool
|
|
// MARKER: consider using binary search here instead of a map (ie bincDecSymbol)
|
|
s map[uint16][]byte
|
|
}
|
|
|
|
// func (x bincDecState) captureState() interface{} { return x }
|
|
// func (x *bincDecState) resetState() { *x = bincDecState{} }
|
|
// func (x *bincDecState) reset() { x.resetState() }
|
|
// func (x *bincDecState) restoreState(v interface{}) { *x = v.(bincDecState) }
|
|
func (x *bincDecState) reset() { *x = bincDecState{} }
|
|
|
|
//------------------------------------
|
|
|
|
// BincHandle is a Handle for the Binc Schema-Free Encoding Format
|
|
// defined at https://github.com/ugorji/binc .
|
|
//
|
|
// BincHandle currently supports all Binc features with the following EXCEPTIONS:
|
|
// - only integers up to 64 bits of precision are supported.
|
|
// big integers are unsupported.
|
|
// - Only IEEE 754 binary32 and binary64 floats are supported (ie Go float32 and float64 types).
|
|
// extended precision and decimal IEEE 754 floats are unsupported.
|
|
// - Only UTF-8 strings supported.
|
|
// Unicode_Other Binc types (UTF16, UTF32) are currently unsupported.
|
|
//
|
|
// Note that these EXCEPTIONS are temporary and full support is possible and may happen soon.
|
|
type BincHandle struct {
|
|
binaryEncodingType
|
|
notJsonType
|
|
// noElemSeparators
|
|
BasicHandle
|
|
|
|
// AsSymbols defines what should be encoded as symbols.
|
|
//
|
|
// Encoding as symbols can reduce the encoded size significantly.
|
|
//
|
|
// However, during decoding, each string to be encoded as a symbol must
|
|
// be checked to see if it has been seen before. Consequently, encoding time
|
|
// will increase if using symbols, because string comparisons has a clear cost.
|
|
//
|
|
// Values:
|
|
// - 0: default: library uses best judgement
|
|
// - 1: use symbols
|
|
// - 2: do not use symbols
|
|
AsSymbols uint8
|
|
|
|
// AsSymbols: may later on introduce more options ...
|
|
// - m: map keys
|
|
// - s: struct fields
|
|
// - n: none
|
|
// - a: all: same as m, s, ...
|
|
|
|
// _ [7]uint64 // padding (cache-aligned)
|
|
}
|
|
|
|
// Name returns the name of the handle: binc
|
|
func (h *BincHandle) Name() string { return "binc" }
|
|
|
|
func (h *BincHandle) desc(bd byte) string { return bincdesc(bd>>4, bd&0x0f) }
|
|
|
|
// SetBytesExt sets an extension
|
|
func (h *BincHandle) SetBytesExt(rt reflect.Type, tag uint64, ext BytesExt) (err error) {
|
|
return h.SetExt(rt, tag, makeExt(ext))
|
|
}
|
|
|
|
// var timeDigits = [...]byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
|
|
|
|
func bincEncodeTime(t time.Time) []byte {
|
|
return customEncodeTime(t)
|
|
}
|
|
|
|
func bincDecodeTime(bs []byte) (tt time.Time, err error) {
|
|
return customDecodeTime(bs)
|
|
}
|