diff options
Diffstat (limited to 'vendor/github.com/francoispqt/gojay/decode_number.go')
-rw-r--r-- | vendor/github.com/francoispqt/gojay/decode_number.go | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/vendor/github.com/francoispqt/gojay/decode_number.go b/vendor/github.com/francoispqt/gojay/decode_number.go new file mode 100644 index 00000000..0042b471 --- /dev/null +++ b/vendor/github.com/francoispqt/gojay/decode_number.go @@ -0,0 +1,118 @@ +package gojay + +import ( + "math" +) + +var digits []int8 + +const maxInt64toMultiply = math.MaxInt64 / 10 +const maxInt32toMultiply = math.MaxInt32 / 10 +const maxInt16toMultiply = math.MaxInt16 / 10 +const maxInt8toMultiply = math.MaxInt8 / 10 +const maxUint8toMultiply = math.MaxUint8 / 10 +const maxUint16toMultiply = math.MaxUint16 / 10 +const maxUint32toMultiply = math.MaxUint32 / 10 +const maxUint64toMultiply = math.MaxUint64 / 10 +const maxUint32Length = 10 +const maxUint64Length = 20 +const maxUint16Length = 5 +const maxUint8Length = 3 +const maxInt32Length = 10 +const maxInt64Length = 19 +const maxInt16Length = 5 +const maxInt8Length = 3 +const invalidNumber = int8(-1) + +var pow10uint64 = [21]uint64{ + 0, + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, + 10000000000000000, + 100000000000000000, + 1000000000000000000, + 10000000000000000000, +} + +var skipNumberEndCursorIncrement [256]int + +func init() { + digits = make([]int8, 256) + for i := 0; i < len(digits); i++ { + digits[i] = invalidNumber + } + for i := int8('0'); i <= int8('9'); i++ { + digits[i] = i - int8('0') + } + + for i := 0; i < 256; i++ { + switch i { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'e', 'E', '+', '-': + skipNumberEndCursorIncrement[i] = 1 + } + } +} + +func (dec *Decoder) skipNumber() (int, error) { + end := dec.cursor + 1 + // look for following numbers + for j := dec.cursor + 1; j < dec.length || dec.read(); j++ { + end += skipNumberEndCursorIncrement[dec.data[j]] + + switch dec.data[j] { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'e', 'E', '+', '-', ' ', '\n', '\t', '\r': + continue + case ',', '}', ']': + return end, nil + default: + // invalid json we expect numbers, dot (single one), comma, or spaces + return end, dec.raiseInvalidJSONErr(dec.cursor) + } + } + + return end, nil +} + +func (dec *Decoder) getExponent() (int64, error) { + start := dec.cursor + end := dec.cursor + for ; dec.cursor < dec.length || dec.read(); dec.cursor++ { + switch dec.data[dec.cursor] { // is positive + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + end = dec.cursor + 1 + case '-': + dec.cursor++ + exp, err := dec.getExponent() + return -exp, err + case '+': + dec.cursor++ + return dec.getExponent() + default: + // if nothing return 0 + // could raise error + if start == end { + return 0, dec.raiseInvalidJSONErr(dec.cursor) + } + return dec.atoi64(start, end-1), nil + } + } + if start == end { + + return 0, dec.raiseInvalidJSONErr(dec.cursor) + } + return dec.atoi64(start, end-1), nil +} |