package gojay
import (
"fmt"
"math"
)
func (dec *Decoder ) DecodeInt (v *int ) error {
if dec .isPooled == 1 {
panic (InvalidUsagePooledDecoderError ("Invalid usage of pooled decoder" ))
}
return dec .decodeInt (v )
}
func (dec *Decoder ) decodeInt (v *int ) error {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch c := dec .data [dec .cursor ]; c {
case ' ' , '\n' , '\t' , '\r' , ',' :
continue
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
val , err := dec .getInt64 ()
if err != nil {
return err
}
*v = int (val )
return nil
case '-' :
dec .cursor = dec .cursor + 1
val , err := dec .getInt64Negative ()
if err != nil {
return err
}
*v = -int (val )
return nil
case 'n' :
dec .cursor ++
err := dec .assertNull ()
if err != nil {
return err
}
return nil
default :
dec .err = InvalidUnmarshalError (
fmt .Sprintf (
"Cannot unmarshall to int, wrong char '%s' found at pos %d" ,
string (dec .data [dec .cursor ]),
dec .cursor ,
),
)
err := dec .skipData ()
if err != nil {
return err
}
return nil
}
}
return dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) decodeIntNull (v **int ) error {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch c := dec .data [dec .cursor ]; c {
case ' ' , '\n' , '\t' , '\r' , ',' :
continue
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
val , err := dec .getInt64 ()
if err != nil {
return err
}
if *v == nil {
*v = new (int )
}
**v = int (val )
return nil
case '-' :
dec .cursor = dec .cursor + 1
val , err := dec .getInt64Negative ()
if err != nil {
return err
}
if *v == nil {
*v = new (int )
}
**v = -int (val )
return nil
case 'n' :
dec .cursor ++
err := dec .assertNull ()
if err != nil {
return err
}
return nil
default :
dec .err = InvalidUnmarshalError (
fmt .Sprintf (
"Cannot unmarshall to int, wrong char '%s' found at pos %d" ,
string (dec .data [dec .cursor ]),
dec .cursor ,
),
)
err := dec .skipData ()
if err != nil {
return err
}
return nil
}
}
return dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) DecodeInt16 (v *int16 ) error {
if dec .isPooled == 1 {
panic (InvalidUsagePooledDecoderError ("Invalid usage of pooled decoder" ))
}
return dec .decodeInt16 (v )
}
func (dec *Decoder ) decodeInt16 (v *int16 ) error {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch c := dec .data [dec .cursor ]; c {
case ' ' , '\n' , '\t' , '\r' , ',' :
continue
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
val , err := dec .getInt16 ()
if err != nil {
return err
}
*v = val
return nil
case '-' :
dec .cursor = dec .cursor + 1
val , err := dec .getInt16Negative ()
if err != nil {
return err
}
*v = -val
return nil
case 'n' :
dec .cursor ++
err := dec .assertNull ()
if err != nil {
return err
}
return nil
default :
dec .err = dec .makeInvalidUnmarshalErr (v )
err := dec .skipData ()
if err != nil {
return err
}
return nil
}
}
return dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) decodeInt16Null (v **int16 ) error {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch c := dec .data [dec .cursor ]; c {
case ' ' , '\n' , '\t' , '\r' , ',' :
continue
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
val , err := dec .getInt16 ()
if err != nil {
return err
}
if *v == nil {
*v = new (int16 )
}
**v = val
return nil
case '-' :
dec .cursor = dec .cursor + 1
val , err := dec .getInt16Negative ()
if err != nil {
return err
}
if *v == nil {
*v = new (int16 )
}
**v = -val
return nil
case 'n' :
dec .cursor ++
err := dec .assertNull ()
if err != nil {
return err
}
return nil
default :
dec .err = dec .makeInvalidUnmarshalErr (v )
err := dec .skipData ()
if err != nil {
return err
}
return nil
}
}
return dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) getInt16Negative () (int16 , error ) {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
return dec .getInt16 ()
default :
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) getInt16 () (int16 , error ) {
var end = dec .cursor
var start = dec .cursor
for j := dec .cursor + 1 ; j < dec .length || dec .read (); j ++ {
switch dec .data [j ] {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
end = j
continue
case '.' :
j ++
startDecimal := j
endDecimal := j - 1
for ; j < dec .length || dec .read (); j ++ {
switch dec .data [j ] {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
endDecimal = j
continue
case 'e' , 'E' :
if startDecimal > endDecimal {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
dec .cursor = j + 1
beforeDecimal := dec .atoi16 (start , end )
for i := startDecimal ; i <= endDecimal ; i ++ {
beforeDecimal = (beforeDecimal << 3 ) + (beforeDecimal << 1 )
}
afterDecimal := dec .atoi16 (startDecimal , endDecimal )
expI := endDecimal - startDecimal + 2
if expI >= len (pow10uint64 ) || expI < 0 {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
pow := pow10uint64 [expI ]
floatVal := float64 (beforeDecimal +afterDecimal ) / float64 (pow )
exp , err := dec .getExponent ()
if err != nil {
return 0 , err
}
pExp := (exp + (exp >> 31 )) ^ (exp >> 31 ) + 1
if pExp >= int64 (len (pow10uint64 )) || pExp < 0 {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
val := floatVal * float64 (pow10uint64 [pExp ])
return int16 (val ), nil
case ' ' , '\t' , '\n' , ',' , ']' , '}' :
dec .cursor = j
return dec .atoi16 (start , end ), nil
default :
dec .cursor = j
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
return dec .atoi16 (start , end ), nil
case 'e' , 'E' :
dec .cursor = j + 1
return dec .getInt16WithExp (dec .atoi16 (start , end ))
case ' ' , '\n' , '\t' , '\r' , ',' , '}' , ']' :
dec .cursor = j
return dec .atoi16 (start , end ), nil
}
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
return dec .atoi16 (start , end ), nil
}
func (dec *Decoder ) getInt16WithExp (init int16 ) (int16 , error ) {
var exp uint16
var sign = int16 (1 )
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case '+' :
continue
case '-' :
sign = -1
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
uintv := uint16 (digits [dec .data [dec .cursor ]])
exp = (exp << 3 ) + (exp << 1 ) + uintv
dec .cursor ++
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
uintv := uint16 (digits [dec .data [dec .cursor ]])
exp = (exp << 3 ) + (exp << 1 ) + uintv
case ' ' , '\t' , '\n' , '}' , ',' , ']' :
exp = exp + 1
if exp >= uint16 (len (pow10uint64 )) {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
if sign == -1 {
return init * (1 / int16 (pow10uint64 [exp ])), nil
}
return init * int16 (pow10uint64 [exp ]), nil
default :
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
exp = exp + 1
if exp >= uint16 (len (pow10uint64 )) {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
if sign == -1 {
return init * (1 / int16 (pow10uint64 [exp ])), nil
}
return init * int16 (pow10uint64 [exp ]), nil
default :
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) DecodeInt8 (v *int8 ) error {
if dec .isPooled == 1 {
panic (InvalidUsagePooledDecoderError ("Invalid usage of pooled decoder" ))
}
return dec .decodeInt8 (v )
}
func (dec *Decoder ) decodeInt8 (v *int8 ) error {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch c := dec .data [dec .cursor ]; c {
case ' ' , '\n' , '\t' , '\r' , ',' :
continue
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
val , err := dec .getInt8 ()
if err != nil {
return err
}
*v = val
return nil
case '-' :
dec .cursor = dec .cursor + 1
val , err := dec .getInt8Negative ()
if err != nil {
return err
}
*v = -val
return nil
case 'n' :
dec .cursor ++
err := dec .assertNull ()
if err != nil {
return err
}
return nil
default :
dec .err = dec .makeInvalidUnmarshalErr (v )
err := dec .skipData ()
if err != nil {
return err
}
return nil
}
}
return dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) decodeInt8Null (v **int8 ) error {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch c := dec .data [dec .cursor ]; c {
case ' ' , '\n' , '\t' , '\r' , ',' :
continue
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
val , err := dec .getInt8 ()
if err != nil {
return err
}
if *v == nil {
*v = new (int8 )
}
**v = val
return nil
case '-' :
dec .cursor = dec .cursor + 1
val , err := dec .getInt8Negative ()
if err != nil {
return err
}
if *v == nil {
*v = new (int8 )
}
**v = -val
return nil
case 'n' :
dec .cursor ++
err := dec .assertNull ()
if err != nil {
return err
}
return nil
default :
dec .err = dec .makeInvalidUnmarshalErr (v )
err := dec .skipData ()
if err != nil {
return err
}
return nil
}
}
return dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) getInt8Negative () (int8 , error ) {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
return dec .getInt8 ()
default :
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) getInt8 () (int8 , error ) {
var end = dec .cursor
var start = dec .cursor
for j := dec .cursor + 1 ; j < dec .length || dec .read (); j ++ {
switch dec .data [j ] {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
end = j
continue
case '.' :
j ++
startDecimal := j
endDecimal := j - 1
for ; j < dec .length || dec .read (); j ++ {
switch dec .data [j ] {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
endDecimal = j
continue
case 'e' , 'E' :
if startDecimal > endDecimal {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
dec .cursor = j + 1
beforeDecimal := dec .atoi8 (start , end )
for i := startDecimal ; i <= endDecimal ; i ++ {
beforeDecimal = (beforeDecimal << 3 ) + (beforeDecimal << 1 )
}
afterDecimal := dec .atoi8 (startDecimal , endDecimal )
expI := endDecimal - startDecimal + 2
if expI >= len (pow10uint64 ) || expI < 0 {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
pow := pow10uint64 [expI ]
floatVal := float64 (beforeDecimal +afterDecimal ) / float64 (pow )
exp , err := dec .getExponent ()
if err != nil {
return 0 , err
}
pExp := (exp + (exp >> 31 )) ^ (exp >> 31 ) + 1
if pExp >= int64 (len (pow10uint64 )) || pExp < 0 {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
val := floatVal * float64 (pow10uint64 [pExp ])
return int8 (val ), nil
case ' ' , '\t' , '\n' , ',' , ']' , '}' :
dec .cursor = j
return dec .atoi8 (start , end ), nil
default :
dec .cursor = j
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
return dec .atoi8 (start , end ), nil
case 'e' , 'E' :
dec .cursor = j + 1
return dec .getInt8WithExp (dec .atoi8 (start , end ))
case ' ' , '\n' , '\t' , '\r' , ',' , '}' , ']' :
dec .cursor = j
return dec .atoi8 (start , end ), nil
}
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
return dec .atoi8 (start , end ), nil
}
func (dec *Decoder ) getInt8WithExp (init int8 ) (int8 , error ) {
var exp uint8
var sign = int8 (1 )
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case '+' :
continue
case '-' :
sign = -1
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
uintv := uint8 (digits [dec .data [dec .cursor ]])
exp = (exp << 3 ) + (exp << 1 ) + uintv
dec .cursor ++
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
uintv := uint8 (digits [dec .data [dec .cursor ]])
exp = (exp << 3 ) + (exp << 1 ) + uintv
case ' ' , '\t' , '\n' , '}' , ',' , ']' :
if exp +1 >= uint8 (len (pow10uint64 )) {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
if sign == -1 {
return init * (1 / int8 (pow10uint64 [exp +1 ])), nil
}
return init * int8 (pow10uint64 [exp +1 ]), nil
default :
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
if exp +1 >= uint8 (len (pow10uint64 )) {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
if sign == -1 {
return init * (1 / int8 (pow10uint64 [exp +1 ])), nil
}
return init * int8 (pow10uint64 [exp +1 ]), nil
default :
dec .err = dec .raiseInvalidJSONErr (dec .cursor )
return 0 , dec .err
}
}
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) DecodeInt32 (v *int32 ) error {
if dec .isPooled == 1 {
panic (InvalidUsagePooledDecoderError ("Invalid usage of pooled decoder" ))
}
return dec .decodeInt32 (v )
}
func (dec *Decoder ) decodeInt32 (v *int32 ) error {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch c := dec .data [dec .cursor ]; c {
case ' ' , '\n' , '\t' , '\r' , ',' :
continue
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
val , err := dec .getInt32 ()
if err != nil {
return err
}
*v = val
return nil
case '-' :
dec .cursor = dec .cursor + 1
val , err := dec .getInt32Negative ()
if err != nil {
return err
}
*v = -val
return nil
case 'n' :
dec .cursor ++
err := dec .assertNull ()
if err != nil {
return err
}
return nil
default :
dec .err = dec .makeInvalidUnmarshalErr (v )
err := dec .skipData ()
if err != nil {
return err
}
return nil
}
}
return dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) decodeInt32Null (v **int32 ) error {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch c := dec .data [dec .cursor ]; c {
case ' ' , '\n' , '\t' , '\r' , ',' :
continue
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
val , err := dec .getInt32 ()
if err != nil {
return err
}
if *v == nil {
*v = new (int32 )
}
**v = val
return nil
case '-' :
dec .cursor = dec .cursor + 1
val , err := dec .getInt32Negative ()
if err != nil {
return err
}
if *v == nil {
*v = new (int32 )
}
**v = -val
return nil
case 'n' :
dec .cursor ++
err := dec .assertNull ()
if err != nil {
return err
}
return nil
default :
dec .err = dec .makeInvalidUnmarshalErr (v )
err := dec .skipData ()
if err != nil {
return err
}
return nil
}
}
return dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) getInt32Negative () (int32 , error ) {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
return dec .getInt32 ()
default :
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) getInt32 () (int32 , error ) {
var end = dec .cursor
var start = dec .cursor
for j := dec .cursor + 1 ; j < dec .length || dec .read (); j ++ {
switch dec .data [j ] {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
end = j
continue
case '.' :
j ++
startDecimal := j
endDecimal := j - 1
for ; j < dec .length || dec .read (); j ++ {
switch dec .data [j ] {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
endDecimal = j
continue
case 'e' , 'E' :
if startDecimal > endDecimal {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
dec .cursor = j + 1
beforeDecimal := dec .atoi64 (start , end )
for i := startDecimal ; i <= endDecimal ; i ++ {
beforeDecimal = (beforeDecimal << 3 ) + (beforeDecimal << 1 )
}
afterDecimal := dec .atoi64 (startDecimal , endDecimal )
expI := endDecimal - startDecimal + 2
if expI >= len (pow10uint64 ) || expI < 0 {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
pow := pow10uint64 [expI ]
floatVal := float64 (beforeDecimal +afterDecimal ) / float64 (pow )
exp , err := dec .getExponent ()
if err != nil {
return 0 , err
}
pExp := (exp + (exp >> 31 )) ^ (exp >> 31 ) + 1
if pExp >= int64 (len (pow10uint64 )) || pExp < 0 {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
val := floatVal * float64 (pow10uint64 [pExp ])
return int32 (val ), nil
case ' ' , '\t' , '\n' , ',' , ']' , '}' :
dec .cursor = j
return dec .atoi32 (start , end ), nil
default :
dec .cursor = j
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
return dec .atoi32 (start , end ), nil
case 'e' , 'E' :
dec .cursor = j + 1
return dec .getInt32WithExp (dec .atoi32 (start , end ))
case ' ' , '\n' , '\t' , '\r' , ',' , '}' , ']' :
dec .cursor = j
return dec .atoi32 (start , end ), nil
}
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
return dec .atoi32 (start , end ), nil
}
func (dec *Decoder ) getInt32WithExp (init int32 ) (int32 , error ) {
var exp uint32
var sign = int32 (1 )
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case '+' :
continue
case '-' :
sign = -1
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
uintv := uint32 (digits [dec .data [dec .cursor ]])
exp = (exp << 3 ) + (exp << 1 ) + uintv
dec .cursor ++
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
uintv := uint32 (digits [dec .data [dec .cursor ]])
exp = (exp << 3 ) + (exp << 1 ) + uintv
case ' ' , '\t' , '\n' , '}' , ',' , ']' :
if exp +1 >= uint32 (len (pow10uint64 )) {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
if sign == -1 {
return init * (1 / int32 (pow10uint64 [exp +1 ])), nil
}
return init * int32 (pow10uint64 [exp +1 ]), nil
default :
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
if exp +1 >= uint32 (len (pow10uint64 )) {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
if sign == -1 {
return init * (1 / int32 (pow10uint64 [exp +1 ])), nil
}
return init * int32 (pow10uint64 [exp +1 ]), nil
default :
dec .err = dec .raiseInvalidJSONErr (dec .cursor )
return 0 , dec .err
}
}
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) DecodeInt64 (v *int64 ) error {
if dec .isPooled == 1 {
panic (InvalidUsagePooledDecoderError ("Invalid usage of pooled decoder" ))
}
return dec .decodeInt64 (v )
}
func (dec *Decoder ) decodeInt64 (v *int64 ) error {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch c := dec .data [dec .cursor ]; c {
case ' ' , '\n' , '\t' , '\r' , ',' :
continue
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
val , err := dec .getInt64 ()
if err != nil {
return err
}
*v = val
return nil
case '-' :
dec .cursor = dec .cursor + 1
val , err := dec .getInt64Negative ()
if err != nil {
return err
}
*v = -val
return nil
case 'n' :
dec .cursor ++
err := dec .assertNull ()
if err != nil {
return err
}
return nil
default :
dec .err = dec .makeInvalidUnmarshalErr (v )
err := dec .skipData ()
if err != nil {
return err
}
return nil
}
}
return dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) decodeInt64Null (v **int64 ) error {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch c := dec .data [dec .cursor ]; c {
case ' ' , '\n' , '\t' , '\r' , ',' :
continue
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
val , err := dec .getInt64 ()
if err != nil {
return err
}
if *v == nil {
*v = new (int64 )
}
**v = val
return nil
case '-' :
dec .cursor = dec .cursor + 1
val , err := dec .getInt64Negative ()
if err != nil {
return err
}
if *v == nil {
*v = new (int64 )
}
**v = -val
return nil
case 'n' :
dec .cursor ++
err := dec .assertNull ()
if err != nil {
return err
}
return nil
default :
dec .err = dec .makeInvalidUnmarshalErr (v )
err := dec .skipData ()
if err != nil {
return err
}
return nil
}
}
return dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) getInt64Negative () (int64 , error ) {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
return dec .getInt64 ()
default :
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) getInt64 () (int64 , error ) {
var end = dec .cursor
var start = dec .cursor
for j := dec .cursor + 1 ; j < dec .length || dec .read (); j ++ {
switch dec .data [j ] {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
end = j
continue
case ' ' , '\t' , '\n' , ',' , '}' , ']' :
dec .cursor = j
return dec .atoi64 (start , end ), nil
case '.' :
j ++
startDecimal := j
endDecimal := j - 1
for ; j < dec .length || dec .read (); j ++ {
switch dec .data [j ] {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
endDecimal = j
continue
case 'e' , 'E' :
if startDecimal > endDecimal {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
dec .cursor = j + 1
beforeDecimal := dec .atoi64 (start , end )
for i := startDecimal ; i <= endDecimal ; i ++ {
beforeDecimal = (beforeDecimal << 3 ) + (beforeDecimal << 1 )
}
afterDecimal := dec .atoi64 (startDecimal , endDecimal )
expI := endDecimal - startDecimal + 2
if expI >= len (pow10uint64 ) || expI < 0 {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
pow := pow10uint64 [expI ]
floatVal := float64 (beforeDecimal +afterDecimal ) / float64 (pow )
exp , err := dec .getExponent ()
if err != nil {
return 0 , err
}
pExp := (exp + (exp >> 31 )) ^ (exp >> 31 ) + 1
if pExp >= int64 (len (pow10uint64 )) || pExp < 0 {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
val := floatVal * float64 (pow10uint64 [pExp ])
return int64 (val ), nil
case ' ' , '\t' , '\n' , ',' , ']' , '}' :
dec .cursor = j
return dec .atoi64 (start , end ), nil
default :
dec .cursor = j
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
return dec .atoi64 (start , end ), nil
case 'e' , 'E' :
dec .cursor = j + 1
return dec .getInt64WithExp (dec .atoi64 (start , end ))
}
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
return dec .atoi64 (start , end ), nil
}
func (dec *Decoder ) getInt64WithExp (init int64 ) (int64 , error ) {
var exp uint64
var sign = int64 (1 )
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case '+' :
continue
case '-' :
sign = -1
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
uintv := uint64 (digits [dec .data [dec .cursor ]])
exp = (exp << 3 ) + (exp << 1 ) + uintv
dec .cursor ++
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
uintv := uint64 (digits [dec .data [dec .cursor ]])
exp = (exp << 3 ) + (exp << 1 ) + uintv
case ' ' , '\t' , '\n' , '}' , ',' , ']' :
if exp +1 >= uint64 (len (pow10uint64 )) {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
if sign == -1 {
return init * (1 / int64 (pow10uint64 [exp +1 ])), nil
}
return init * int64 (pow10uint64 [exp +1 ]), nil
default :
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
if exp +1 >= uint64 (len (pow10uint64 )) {
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
if sign == -1 {
return init * (1 / int64 (pow10uint64 [exp +1 ])), nil
}
return init * int64 (pow10uint64 [exp +1 ]), nil
default :
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
}
return 0 , dec .raiseInvalidJSONErr (dec .cursor )
}
func (dec *Decoder ) atoi64 (start , end int ) int64 {
var ll = end + 1 - start
var val = int64 (digits [dec .data [start ]])
end = end + 1
if ll < maxInt64Length {
for i := start + 1 ; i < end ; i ++ {
intv := int64 (digits [dec .data [i ]])
val = (val << 3 ) + (val << 1 ) + intv
}
return val
} else if ll == maxInt64Length {
for i := start + 1 ; i < end ; i ++ {
intv := int64 (digits [dec .data [i ]])
if val > maxInt64toMultiply {
dec .err = dec .makeInvalidUnmarshalErr (val )
return 0
}
val = (val << 3 ) + (val << 1 )
if math .MaxInt64 -val < intv {
dec .err = dec .makeInvalidUnmarshalErr (val )
return 0
}
val += intv
}
} else {
dec .err = dec .makeInvalidUnmarshalErr (val )
return 0
}
return val
}
func (dec *Decoder ) atoi32 (start , end int ) int32 {
var ll = end + 1 - start
var val = int32 (digits [dec .data [start ]])
end = end + 1
if ll < maxInt32Length {
for i := start + 1 ; i < end ; i ++ {
intv := int32 (digits [dec .data [i ]])
val = (val << 3 ) + (val << 1 ) + intv
}
} else if ll == maxInt32Length {
for i := start + 1 ; i < end ; i ++ {
intv := int32 (digits [dec .data [i ]])
if val > maxInt32toMultiply {
dec .err = dec .makeInvalidUnmarshalErr (val )
return 0
}
val = (val << 3 ) + (val << 1 )
if math .MaxInt32 -val < intv {
dec .err = dec .makeInvalidUnmarshalErr (val )
return 0
}
val += intv
}
} else {
dec .err = dec .makeInvalidUnmarshalErr (val )
return 0
}
return val
}
func (dec *Decoder ) atoi16 (start , end int ) int16 {
var ll = end + 1 - start
var val = int16 (digits [dec .data [start ]])
end = end + 1
if ll < maxInt16Length {
for i := start + 1 ; i < end ; i ++ {
intv := int16 (digits [dec .data [i ]])
val = (val << 3 ) + (val << 1 ) + intv
}
} else if ll == maxInt16Length {
for i := start + 1 ; i < end ; i ++ {
intv := int16 (digits [dec .data [i ]])
if val > maxInt16toMultiply {
dec .err = dec .makeInvalidUnmarshalErr (val )
return 0
}
val = (val << 3 ) + (val << 1 )
if math .MaxInt16 -val < intv {
dec .err = dec .makeInvalidUnmarshalErr (val )
return 0
}
val += intv
}
} else {
dec .err = dec .makeInvalidUnmarshalErr (val )
return 0
}
return val
}
func (dec *Decoder ) atoi8 (start , end int ) int8 {
var ll = end + 1 - start
var val = int8 (digits [dec .data [start ]])
end = end + 1
if ll < maxInt8Length {
for i := start + 1 ; i < end ; i ++ {
intv := int8 (digits [dec .data [i ]])
val = (val << 3 ) + (val << 1 ) + intv
}
} else if ll == maxInt8Length {
for i := start + 1 ; i < end ; i ++ {
intv := int8 (digits [dec .data [i ]])
if val > maxInt8toMultiply {
dec .err = dec .makeInvalidUnmarshalErr (val )
return 0
}
val = (val << 3 ) + (val << 1 )
if math .MaxInt8 -val < intv {
dec .err = dec .makeInvalidUnmarshalErr (val )
return 0
}
val += intv
}
} else {
dec .err = dec .makeInvalidUnmarshalErr (val )
return 0
}
return val
}
func (dec *Decoder ) AddInt (v *int ) error {
return dec .Int (v )
}
func (dec *Decoder ) AddIntNull (v **int ) error {
return dec .IntNull (v )
}
func (dec *Decoder ) AddInt8 (v *int8 ) error {
return dec .Int8 (v )
}
func (dec *Decoder ) AddInt8Null (v **int8 ) error {
return dec .Int8Null (v )
}
func (dec *Decoder ) AddInt16 (v *int16 ) error {
return dec .Int16 (v )
}
func (dec *Decoder ) AddInt16Null (v **int16 ) error {
return dec .Int16Null (v )
}
func (dec *Decoder ) AddInt32 (v *int32 ) error {
return dec .Int32 (v )
}
func (dec *Decoder ) AddInt32Null (v **int32 ) error {
return dec .Int32Null (v )
}
func (dec *Decoder ) AddInt64 (v *int64 ) error {
return dec .Int64 (v )
}
func (dec *Decoder ) AddInt64Null (v **int64 ) error {
return dec .Int64Null (v )
}
func (dec *Decoder ) Int (v *int ) error {
err := dec .decodeInt (v )
if err != nil {
return err
}
dec .called |= 1
return nil
}
func (dec *Decoder ) IntNull (v **int ) error {
err := dec .decodeIntNull (v )
if err != nil {
return err
}
dec .called |= 1
return nil
}
func (dec *Decoder ) Int8 (v *int8 ) error {
err := dec .decodeInt8 (v )
if err != nil {
return err
}
dec .called |= 1
return nil
}
func (dec *Decoder ) Int8Null (v **int8 ) error {
err := dec .decodeInt8Null (v )
if err != nil {
return err
}
dec .called |= 1
return nil
}
func (dec *Decoder ) Int16 (v *int16 ) error {
err := dec .decodeInt16 (v )
if err != nil {
return err
}
dec .called |= 1
return nil
}
func (dec *Decoder ) Int16Null (v **int16 ) error {
err := dec .decodeInt16Null (v )
if err != nil {
return err
}
dec .called |= 1
return nil
}
func (dec *Decoder ) Int32 (v *int32 ) error {
err := dec .decodeInt32 (v )
if err != nil {
return err
}
dec .called |= 1
return nil
}
func (dec *Decoder ) Int32Null (v **int32 ) error {
err := dec .decodeInt32Null (v )
if err != nil {
return err
}
dec .called |= 1
return nil
}
func (dec *Decoder ) Int64 (v *int64 ) error {
err := dec .decodeInt64 (v )
if err != nil {
return err
}
dec .called |= 1
return nil
}
func (dec *Decoder ) Int64Null (v **int64 ) error {
err := dec .decodeInt64Null (v )
if err != nil {
return err
}
dec .called |= 1
return nil
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .