mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 16:19:35 +02:00
* Merging revisions 47005 from trunk:
------------------------------------------------------------------------ r47005 | michael | 2020-09-29 17:33:59 +0200 (Tue, 29 Sep 2020) | 1 line * Fix more strict handling of numbers (bug ID 37840, patch by Benito van der Zander) ------------------------------------------------------------------------ git-svn-id: branches/fixes_3_2@49317 -
This commit is contained in:
parent
4b7f92a367
commit
073b992122
@ -412,37 +412,54 @@ begin
|
||||
'0'..'9','.','-':
|
||||
begin
|
||||
TokenStart := FTokenStr;
|
||||
if FTokenStr^ = '-' then inc(FTokenStr);
|
||||
case FTokenStr^ of
|
||||
'1'..'9': Inc(FTokenStr);
|
||||
'0': begin
|
||||
Inc(FTokenStr);
|
||||
if (joStrict in Options) and (FTokenStr^ in ['0'..'9']) then
|
||||
Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);
|
||||
end;
|
||||
'.': if joStrict in Options then
|
||||
Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);
|
||||
else
|
||||
Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);
|
||||
end;
|
||||
while true do
|
||||
begin
|
||||
Inc(FTokenStr);
|
||||
case FTokenStr^ of
|
||||
'0'..'9': inc(FTokenStr);
|
||||
'.':
|
||||
begin
|
||||
if FTokenStr[1] in ['0'..'9', 'e', 'E'] then
|
||||
begin
|
||||
Inc(FTokenStr);
|
||||
repeat
|
||||
case FTokenStr[1] of
|
||||
'0'..'9': Inc(FTokenStr, 2);
|
||||
'e', 'E': begin
|
||||
if joStrict in Options then
|
||||
Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);
|
||||
Inc(FTokenStr);
|
||||
until not (FTokenStr^ in ['0'..'9', 'e', 'E','-','+']);
|
||||
end;
|
||||
else Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);
|
||||
end;
|
||||
break;
|
||||
end;
|
||||
'0'..'9': ;
|
||||
'e', 'E':
|
||||
begin
|
||||
Inc(FTokenStr);
|
||||
if FTokenStr^ in ['-','+'] then
|
||||
Inc(FTokenStr);
|
||||
while FTokenStr^ in ['0'..'9'] do
|
||||
Inc(FTokenStr);
|
||||
inc(FTokenStr);
|
||||
break;
|
||||
end;
|
||||
else
|
||||
if {(FTokenStr<>FEOL) and }not (FTokenStr^ in [#13,#10,#0,'}',']',',',#9,' ']) then
|
||||
Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
if FTokenStr^ in ['e', 'E'] then begin
|
||||
Inc(FTokenStr);
|
||||
if FTokenStr^ in ['-','+'] then
|
||||
Inc(FTokenStr);
|
||||
if not (FTokenStr^ in ['0'..'9']) then
|
||||
Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);
|
||||
repeat
|
||||
Inc(FTokenStr);
|
||||
until not (FTokenStr^ in ['0'..'9']);
|
||||
end;
|
||||
if {(FTokenStr<>FEOL) and }not (FTokenStr^ in [#13,#10,#0,'}',']',',',#9,' ']) then
|
||||
Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);
|
||||
SectionLength := FTokenStr - TokenStart;
|
||||
FCurTokenString:='';
|
||||
SetString(FCurTokenString, TokenStart, SectionLength);
|
||||
|
@ -42,6 +42,8 @@ type
|
||||
|
||||
{ TTestReader }
|
||||
|
||||
{ TBaseTestReader }
|
||||
|
||||
TBaseTestReader = class(TTestJSON)
|
||||
private
|
||||
FOptions : TJSONOptions;
|
||||
@ -60,6 +62,7 @@ type
|
||||
procedure TestTrue;
|
||||
procedure TestFalse;
|
||||
procedure TestFloat;
|
||||
procedure TestFloatError;
|
||||
procedure TestInteger;
|
||||
procedure TestInt64;
|
||||
procedure TestString;
|
||||
@ -299,6 +302,14 @@ begin
|
||||
DoTestFloat(0,'0.0');
|
||||
end;
|
||||
|
||||
procedure TBaseTestReader.TestFloatError;
|
||||
begin
|
||||
DoTestError('.12',[joStrict]);
|
||||
DoTestError('.12E',[]);
|
||||
DoTestError('0.12E+',[]);
|
||||
DoTestError('.12E+-1',[]);
|
||||
end;
|
||||
|
||||
procedure TBaseTestReader.TestString;
|
||||
|
||||
begin
|
||||
|
Loading…
Reference in New Issue
Block a user