# Parses an Int or Float
fun parse_json_number: Serializable do
var max = len
var p = pos
var c = src[p]
var is_neg = false
if c == '-' then
is_neg = true
p += 1
if p >= max then return make_parse_error("Bad JSON number")
c = src[p]
end
var val = 0
while c.is_numeric do
val *= 10
val += c.to_i
p += 1
if p >= max then break
c = src[p]
end
if c == '.' then
p += 1
if p >= max then return make_parse_error("Bad JSON number")
c = src[p]
var fl = val.to_f
var frac = 0.1
while c.is_numeric do
fl += c.to_i.to_f * frac
frac /= 10.0
p += 1
if p >= max then break
c = src[p]
end
if c == 'e' or c == 'E' then
p += 1
var exp = 0
if p >= max then return make_parse_error("Malformed JSON number")
c = src[p]
while c.is_numeric do
exp *= 10
exp += c.to_i
p += 1
if p >= max then break
c = src[p]
end
fl *= (10 ** exp).to_f
end
if p < max and not c.is_json_separator then return make_parse_error("Malformed JSON number")
pos = p
if is_neg then return -fl
return fl
end
if c == 'e' or c == 'E' then
p += 1
if p >= max then return make_parse_error("Bad JSON number")
var exp = src[p].to_i
c = src[p]
while c.is_numeric do
exp *= 10
exp += c.to_i
p += 1
if p >= max then break
c = src[p]
end
val *= (10 ** exp)
end
if p < max and not src[p].is_json_separator then return make_parse_error("Malformed JSON number")
pos = p
if is_neg then return -val
return val
end
lib/json/static.nit:278,2--348,4