mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
toml: fix, test and optimize nan
and inf
values (#12592)
This commit is contained in:
@@ -93,22 +93,23 @@ pub fn (mut s Scanner) scan() ?token.Token {
|
||||
ascii := byte_c.ascii_str()
|
||||
util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'current char "$ascii"')
|
||||
|
||||
is_sign := byte_c in [`+`, `-`]
|
||||
is_signed_number := is_sign && byte(s.at()).is_digit() && !byte(s.peek(-1)).is_digit()
|
||||
is_sign := c == `+` || c == `-`
|
||||
|
||||
// (+/-)nan & (+/-)inf
|
||||
is_nan := byte_c == `n` && s.at() == `a` && s.peek(1) == `n` && s.peek(2) == `\n`
|
||||
is_inf := byte_c == `i` && s.at() == `n` && s.peek(1) == `f` && s.peek(2) == `\n`
|
||||
is_signed_nan := is_sign && s.at() == `n` && s.peek(1) == `a` && s.peek(2) == `n`
|
||||
&& s.peek(3) == `\n`
|
||||
is_signed_inf := is_sign && s.at() == `i` && s.peek(1) == `n` && s.peek(2) == `f`
|
||||
&& s.peek(3) == `\n`
|
||||
if is_nan || is_inf || is_signed_nan || is_signed_inf {
|
||||
peek_1 := s.peek(1)
|
||||
peek_2 := s.peek(2)
|
||||
is_nan := c == `n` && s.at() == `a` && peek_1 == `n`
|
||||
is_inf := !is_nan && c == `i` && s.at() == `n` && peek_1 == `f`
|
||||
is_signed_nan := is_sign && s.at() == `n` && peek_1 == `a` && peek_2 == `n`
|
||||
is_signed_inf := !is_signed_nan && is_sign && s.at() == `i` && peek_1 == `n`
|
||||
&& peek_2 == `f`
|
||||
if !s.is_left_of_assign && (is_nan || is_inf || is_signed_nan || is_signed_inf) {
|
||||
num := s.extract_nan_or_inf_number() ?
|
||||
util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'identified a special number "$num" ($num.len)')
|
||||
return s.new_token(.number, num, num.len)
|
||||
}
|
||||
|
||||
is_signed_number := is_sign && byte(s.at()).is_digit() && !byte(s.peek(-1)).is_digit()
|
||||
is_digit := byte_c.is_digit()
|
||||
if is_digit || is_signed_number {
|
||||
num := s.extract_number() ?
|
||||
@@ -118,7 +119,8 @@ pub fn (mut s Scanner) scan() ?token.Token {
|
||||
|
||||
if util.is_key_char(byte_c) {
|
||||
key := s.extract_key()
|
||||
if key.to_lower() in ['true', 'false'] {
|
||||
key_lower_case := key.to_lower()
|
||||
if key_lower_case == 'true' || key_lower_case == 'false' {
|
||||
util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'identified a boolean "$key" ($key.len)')
|
||||
return s.new_token(.boolean, key, key.len)
|
||||
}
|
||||
|
Reference in New Issue
Block a user