stringsandids.patch (2,590 bytes)
Index: packages/fcl-json/src/jsonscanner.pp
===================================================================
--- packages/fcl-json/src/jsonscanner.pp (Revision 47001)
+++ packages/fcl-json/src/jsonscanner.pp (Arbeitskopie)
@@ -373,8 +373,9 @@
end
else if u1<>0 then
MaybeAppendUnicode;
- if FTokenStr^ = #0 then
- Error(SErrOpenString,[FCurRow]);
+ if FTokenStr^ < #$20 then
+ if FTokenStr^ = #0 then Error(SErrOpenString,[FCurRow])
+ else if joStrict in Options then Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);
Inc(FTokenStr);
end;
if FTokenStr^ = #0 then
@@ -513,6 +531,16 @@
tstart:=CurRow;
Tcol:=CurColumn;
TokenStart := FTokenStr;
+ Result:=tkIdentifier;
+ case TokenStart^ of
+ 't': if (TokenStart[1] = 'r') and (TokenStart[2] = 'u') and (TokenStart[3] = 'e') then
+ Result:=tkTrue;
+ 'f': if (TokenStart[1] = 'a') and (TokenStart[2] = 'l') and (TokenStart[3] = 's') and (TokenStart[4] = 'e')then
+ Result:=tkFalse;
+ 'n': if (TokenStart[1] = 'u') and (TokenStart[2] = 'l') and (TokenStart[3] = 'l') then
+ Result:=tkNull;
+ end;
+ if result <> tkIdentifier then inc(FTokenStr, length(TokenInfos[result]) - 1);
repeat
Inc(FTokenStr);
until not (FTokenStr^ in ['A'..'Z', 'a'..'z', '0'..'9', '_']);
@@ -519,17 +547,17 @@
SectionLength := FTokenStr - TokenStart;
FCurTokenString:='';
SetString(FCurTokenString, TokenStart, SectionLength);
- for it := tkTrue to tkNull do
- if CompareText(CurTokenString, TokenInfos[it]) = 0 then
- begin
- Result := it;
- FCurToken := Result;
- exit;
- end;
- if (joStrict in Options) then
- Error(SErrInvalidCharacter, [tStart,tcol,TokenStart[0]])
- else
- Result:=tkIdentifier;
+ if (result = tkIdentifier) or (SectionLength <> length(TokenInfos[result])) then begin
+ if (joStrict in Options) then
+ Error(SErrInvalidCharacter, [tStart,tcol,TokenStart[0]]);
+ for it := tkTrue to tkNull do
+ if CompareText(CurTokenString, TokenInfos[it]) = 0 then
+ begin
+ Result := it;
+ FCurToken := Result;
+ exit;
+ end;
+ end;
end;
else
Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);