Fix som JSON parsing bugs.

- Single digit integer keys `{"a": 5}`
` Negative float keys `{"b": -42.0}`
This commit is contained in:
Kevin Watters
2019-04-06 09:19:09 -04:00
parent 6ab471ff87
commit 62f5eb5bca
+20 -18
View File
@@ -68,12 +68,12 @@ next_rune :: proc(t: ^Tokenizer) -> rune #no_bounds_check {
get_token :: proc(t: ^Tokenizer) -> (token: Token, err: Error) { get_token :: proc(t: ^Tokenizer) -> (token: Token, err: Error) {
skip_digits :: proc(t: ^Tokenizer) { skip_digits :: proc(t: ^Tokenizer) {
for t.offset < len(t.data) { for t.offset < len(t.data) {
next_rune(t);
if '0' <= t.r && t.r <= '9' { if '0' <= t.r && t.r <= '9' {
// Okay // Okay
} else { } else {
return; return;
} }
next_rune(t);
} }
} }
skip_hex_digits :: proc(t: ^Tokenizer) { skip_hex_digits :: proc(t: ^Tokenizer) {
@@ -158,6 +158,7 @@ get_token :: proc(t: ^Tokenizer) -> (token: Token, err: Error) {
skip_whitespace(t); skip_whitespace(t);
token.pos = t.pos; token.pos = t.pos;
token.kind = Kind.Invalid; token.kind = Kind.Invalid;
curr_rune := t.r; curr_rune := t.r;
@@ -213,23 +214,6 @@ get_token :: proc(t: ^Tokenizer) -> (token: Token, err: Error) {
} }
fallthrough; fallthrough;
case '.':
err = Error.Illegal_Character;
if t.spec == Specification.JSON5 { // Allow leading decimal point
skip_digits(t);
if t.r == 'e' || t.r == 'E' {
switch r := next_rune(t); r {
case '+', '-':
next_rune(t);
}
skip_digits(t);
}
str := string(t.data[token.offset:t.offset]);
if !is_valid_number(str, t.spec) {
err = Error.Invalid_Number;
}
}
case '0'..'9': case '0'..'9':
token.kind = Kind.Integer; token.kind = Kind.Integer;
if t.spec == Specification.JSON5 { // Hexadecimal Numbers if t.spec == Specification.JSON5 { // Hexadecimal Numbers
@@ -241,6 +225,7 @@ get_token :: proc(t: ^Tokenizer) -> (token: Token, err: Error) {
} }
skip_digits(t); skip_digits(t);
if t.r == '.' { if t.r == '.' {
token.kind = Kind.Float; token.kind = Kind.Float;
next_rune(t); next_rune(t);
@@ -259,6 +244,23 @@ get_token :: proc(t: ^Tokenizer) -> (token: Token, err: Error) {
err = Error.Invalid_Number; err = Error.Invalid_Number;
} }
case '.':
err = Error.Illegal_Character;
if t.spec == Specification.JSON5 { // Allow leading decimal point
skip_digits(t);
if t.r == 'e' || t.r == 'E' {
switch r := next_rune(t); r {
case '+', '-':
next_rune(t);
}
skip_digits(t);
}
str := string(t.data[token.offset:t.offset]);
if !is_valid_number(str, t.spec) {
err = Error.Invalid_Number;
}
}
case '\'': case '\'':
err = Error.Illegal_Character; err = Error.Illegal_Character;