summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-03-09 11:56:08 +0000
committermichael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-03-09 11:56:08 +0000
commit1dab102d31e002cbffee7755526ba7ad42fa524f (patch)
tree4b4e7b0e2a28f27017571219b00c5f681408a0c3
parent0225f661caa6332ab5e00ed22afec30da78cda12 (diff)
downloadfpc-1dab102d31e002cbffee7755526ba7ad42fa524f.tar.gz
* Allow BOM check
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@48926 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--packages/fcl-json/src/jsonconf.pp2
-rw-r--r--packages/fcl-json/src/jsonscanner.pp18
2 files changed, 18 insertions, 2 deletions
diff --git a/packages/fcl-json/src/jsonconf.pp b/packages/fcl-json/src/jsonconf.pp
index 794c796e99..b0bccbf575 100644
--- a/packages/fcl-json/src/jsonconf.pp
+++ b/packages/fcl-json/src/jsonconf.pp
@@ -31,7 +31,7 @@ uses
SysUtils, Classes, fpjson, jsonscanner, jsonparser;
Const
- DefaultJSONOptions = [joUTF8,joComments];
+ DefaultJSONOptions = [joUTF8,joComments,joBOMCheck];
type
EJSONConfigError = class(Exception);
diff --git a/packages/fcl-json/src/jsonscanner.pp b/packages/fcl-json/src/jsonscanner.pp
index 5294e02ac6..c81f543bcb 100644
--- a/packages/fcl-json/src/jsonscanner.pp
+++ b/packages/fcl-json/src/jsonscanner.pp
@@ -51,7 +51,7 @@ type
EScannerError = class(EParserError);
- TJSONOption = (joUTF8,joStrict,joComments,joIgnoreTrailingComma,joIgnoreDuplicates);
+ TJSONOption = (joUTF8,joStrict,joComments,joIgnoreTrailingComma,joIgnoreDuplicates,joBOMCheck);
TJSONOptions = set of TJSONOption;
Const
@@ -141,10 +141,26 @@ end;
constructor TJSONScanner.Create(Source: TStream; AOptions: TJSONOptions);
+ procedure SkipStreamBOM;
+ Var
+ OldPos : integer;
+ Header : array[0..3] of byte;
+ begin
+ OldPos := Source.Position;
+ FillChar(Header, SizeOf(Header), 0);
+ if Source.Read(Header, 3) = 3 then
+ if (Header[0]=$EF) and (Header[1]=$BB) and (Header[2]=$BF) then
+ exit;
+ Source.Position := OldPos;
+ end;
+
+
Var
S : RawByteString;
begin
+ if (joBOMCheck in aOptions) then
+ SkipStreamBom;
S:='';
SetLength(S,Source.Size-Source.Position);
if Length(S)>0 then