package httpsfv
import (
"errors"
"io"
"strconv"
)
const maxDigit = 12
var ErrNotDigit = errors .New ("character is not a digit" )
var ErrNumberOutOfRange = errors .New ("integer or decimal out of range" )
var ErrInvalidDecimalFormat = errors .New ("invalid decimal format" )
const (
typeInteger = iota
typeDecimal
)
func marshalInteger(b io .StringWriter , i int64 ) error {
if i < -999999999999999 || i > 999999999999999 {
return ErrNumberOutOfRange
}
_ , err := b .WriteString (strconv .FormatInt (i , 10 ))
return err
}
func parseNumber(s *scanner ) (interface {}, error ) {
neg := isNeg (s )
if neg && s .eof () {
return 0 , &UnmarshalError {s .off , ErrUnexpectedEndOfString }
}
if !isDigit (s .data [s .off ]) {
return 0 , &UnmarshalError {s .off , ErrNotDigit }
}
start := s .off
s .off ++
var (
decSepOff int
t = typeInteger
)
for s .off < len (s .data ) {
size := s .off - start
if (t == typeInteger && (size >= 15 )) || size >= 16 {
return 0 , &UnmarshalError {s .off , ErrNumberOutOfRange }
}
c := s .data [s .off ]
if isDigit (c ) {
s .off ++
continue
}
if t == typeInteger && c == '.' {
if size > maxDigit {
return 0 , &UnmarshalError {s .off , ErrNumberOutOfRange }
}
t = typeDecimal
decSepOff = s .off
s .off ++
continue
}
break
}
str := s .data [start :s .off ]
if t == typeInteger {
return parseInteger (str , neg , s .off )
}
return parseDecimal (s , decSepOff , str , neg )
}
func isNeg(s *scanner ) bool {
if s .data [s .off ] == '-' {
s .off ++
return true
}
return false
}
func parseInteger(str string , neg bool , off int ) (int64 , error ) {
i , err := strconv .ParseInt (str , 10 , 64 )
if err != nil {
return 0 , &UnmarshalError {off , err }
}
if neg {
i = -i
}
if i < -999999999999999 || i > 999999999999999 {
return 0 , &UnmarshalError {off , ErrNumberOutOfRange }
}
return i , err
}
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 .