Fix whitespace in number parsing (#3195)
* Handle input errors for --indent
Handle malformed and overflowing arguments. Also, forbid leading and
trailing spaces to match the behavior of tonumber from commit ce0e788
(improve tonumber/0 performance by parsing input as number literal,
2024-03-02).
* Do not skip leading whitespace in jvp_strtod
`jvp_strtod` skips leading whitespace, but its decnum counterpart
`decNumberFromString` (called within `jv_number_with_literal`) does not.
Those two are called interchangeably, so it leads to inconsistent
behavior depending on whether the decnum feature is enabled.
Additionally, `classify`, used in the token scanner, only considers
[ \t\n\r] to be whitespace, but `jvp_strtod` consumes the larger set
[ \t\n\v\f\r], so those extra characters are considered literals.
Changing this deviates from the behavior of `strdod` from <stdlib.h> and
is technically a breaking API change, since it is a public symbol.
This commit is contained in:
1 parent
aaace5432a
commit
9ac6ddae22
3 files changed
+11
-16
No files matched your search
+3
-11
@@ -2368,29 +2368,21 @@ jvp_strtod
|
||||
|
||||
sign = nz0 = nz1 = nz = bc.dplen = bc.uflchk = 0;
|
||||
dval(&rv) = 0.;
|
||||
for(s = s00;;s++) switch(*s) {
|
||||
switch(*(s = s00)) {
|
||||
case '-':
|
||||
sign = 1;
|
||||
/* no break */
|
||||
JQ_FALLTHROUGH;
|
||||
case '+':
|
||||
if (*++s)
|
||||
goto break2;
|
||||
break;
|
||||
/* no break */
|
||||
JQ_FALLTHROUGH;
|
||||
case 0:
|
||||
goto ret0;
|
||||
case '\t':
|
||||
case '\n':
|
||||
case '\v':
|
||||
case '\f':
|
||||
case '\r':
|
||||
case ' ':
|
||||
continue;
|
||||
default:
|
||||
goto break2;
|
||||
break;
|
||||
}
|
||||
break2:
|
||||
if (*s == '0') {
|
||||
#ifndef NO_HEX_FP /*{*/
|
||||
switch(s[1]) {
|
||||
|
||||
Reference in new issue
Block a user