mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-04 06:38:47 +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:
|
case Kind.Open_Bracket:
|
||||||
return parse_array(p);
|
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;
|
err = Error.Unexpected_Token;
|
||||||
|
|||||||
@@ -90,31 +90,33 @@ validate_array :: proc(p: ^Parser) -> bool {
|
|||||||
|
|
||||||
validate_value :: proc(p: ^Parser) -> bool {
|
validate_value :: proc(p: ^Parser) -> bool {
|
||||||
token := p.curr_token;
|
token := p.curr_token;
|
||||||
|
|
||||||
|
using Kind;
|
||||||
switch token.kind {
|
switch token.kind {
|
||||||
case Kind.Null:
|
case Null, False, True:
|
||||||
advance_token(p);
|
advance_token(p);
|
||||||
return true;
|
return true;
|
||||||
case Kind.False:
|
case Integer, Float:
|
||||||
advance_token(p);
|
advance_token(p);
|
||||||
return true;
|
return true;
|
||||||
case Kind.True:
|
case String:
|
||||||
advance_token(p);
|
|
||||||
return true;
|
|
||||||
case Kind.Integer:
|
|
||||||
advance_token(p);
|
|
||||||
return true;
|
|
||||||
case Kind.Float:
|
|
||||||
advance_token(p);
|
|
||||||
return true;
|
|
||||||
case Kind.String:
|
|
||||||
advance_token(p);
|
advance_token(p);
|
||||||
return is_valid_string_literal(token.text, p.spec);
|
return is_valid_string_literal(token.text, p.spec);
|
||||||
|
|
||||||
case Kind.Open_Brace:
|
case Open_Brace:
|
||||||
return validate_object(p);
|
return validate_object(p);
|
||||||
|
|
||||||
case Kind.Open_Bracket:
|
case Open_Bracket:
|
||||||
return validate_array(p);
|
return validate_array(p);
|
||||||
|
|
||||||
|
case:
|
||||||
|
if p.spec == Specification.JSON5 {
|
||||||
|
switch token.kind {
|
||||||
|
case Infinity, NaN:
|
||||||
|
advance_token(p);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user