mirror of
https://github.com/odin-lang/Odin.git
synced 2026-01-04 04:02:33 +00:00
Support NaN and Infinity for JSON5
This commit is contained in:
@@ -93,6 +93,28 @@ parse_value :: proc(p: ^Parser) -> (value: Value, err: Error) {
|
||||
|
||||
case Kind.Open_Bracket:
|
||||
return parse_array(p);
|
||||
|
||||
case:
|
||||
if p.spec == Specification.JSON5 {
|
||||
switch token.kind {
|
||||
case Kind.Infinity:
|
||||
inf: u64 = 0x7ff0000000000000;
|
||||
if token.text[0] == '-' {
|
||||
inf = 0xfff0000000000000;
|
||||
}
|
||||
value.value = transmute(f64)inf;
|
||||
advance_token(p);
|
||||
return;
|
||||
case Kind.NaN:
|
||||
nan: u64 = 0x7ff7ffffffffffff;
|
||||
if token.text[0] == '-' {
|
||||
nan = 0xfff7ffffffffffff;
|
||||
}
|
||||
value.value = transmute(f64)nan;
|
||||
advance_token(p);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
err = Error.Unexpected_Token;
|
||||
|
||||
@@ -90,31 +90,33 @@ validate_array :: proc(p: ^Parser) -> bool {
|
||||
|
||||
validate_value :: proc(p: ^Parser) -> bool {
|
||||
token := p.curr_token;
|
||||
|
||||
using Kind;
|
||||
switch token.kind {
|
||||
case Kind.Null:
|
||||
case Null, False, True:
|
||||
advance_token(p);
|
||||
return true;
|
||||
case Kind.False:
|
||||
case Integer, Float:
|
||||
advance_token(p);
|
||||
return true;
|
||||
case Kind.True:
|
||||
advance_token(p);
|
||||
return true;
|
||||
case Kind.Integer:
|
||||
advance_token(p);
|
||||
return true;
|
||||
case Kind.Float:
|
||||
advance_token(p);
|
||||
return true;
|
||||
case Kind.String:
|
||||
case String:
|
||||
advance_token(p);
|
||||
return is_valid_string_literal(token.text, p.spec);
|
||||
|
||||
case Kind.Open_Brace:
|
||||
case Open_Brace:
|
||||
return validate_object(p);
|
||||
|
||||
case Kind.Open_Bracket:
|
||||
case Open_Bracket:
|
||||
return validate_array(p);
|
||||
|
||||
case:
|
||||
if p.spec == Specification.JSON5 {
|
||||
switch token.kind {
|
||||
case Infinity, NaN:
|
||||
advance_token(p);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user