mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-01 13:11:06 +02:00
* Merging revisions r48926,r48931 from trunk:
------------------------------------------------------------------------ r48926 | michael | 2021-03-09 12:56:08 +0100 (Tue, 09 Mar 2021) | 1 line * Allow BOM check ------------------------------------------------------------------------ r48931 | michael | 2021-03-10 11:58:55 +0100 (Wed, 10 Mar 2021) | 1 line * Fix size issue for UTF8, bug ID #37370, patch by Luca Olivetti ------------------------------------------------------------------------ git-svn-id: branches/fixes_3_2@48932 -
This commit is contained in:
parent
855efcaad6
commit
08dc64ec0d
@ -378,9 +378,14 @@ begin
|
|||||||
FFileName := Value;
|
FFileName := Value;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function FieldDefDataSize(fd:TFieldDef):integer;
|
||||||
|
begin
|
||||||
|
result:=fd.Size*fd.CharSize+1;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TFixedFormatDataSet.InternalInitFieldDefs;
|
procedure TFixedFormatDataSet.InternalInitFieldDefs;
|
||||||
var
|
var
|
||||||
i, Len, MaxLen :Integer;
|
i, Len, DataLen, MaxLen :Integer;
|
||||||
LstFields :TStrings;
|
LstFields :TStrings;
|
||||||
FEnc : TSystemCodePage;
|
FEnc : TSystemCodePage;
|
||||||
|
|
||||||
@ -410,12 +415,11 @@ begin
|
|||||||
Fenc:=FEncoding.CodePage
|
Fenc:=FEncoding.CodePage
|
||||||
else
|
else
|
||||||
FEnc:=DefaultSystemCodePage;
|
FEnc:=DefaultSystemCodePage;
|
||||||
FieldDefs.Add(Trim(LstFields.Names[i]), ftString, Len, 0, False,False,FieldDefs.Count+1,FEnc);
|
DataLen:=FieldDefDataSize(FieldDefs.Add(Trim(LstFields.Names[i]), ftString, Len, 0, False,False,FieldDefs.Count+1,FEnc));
|
||||||
Inc(Len);
|
|
||||||
{$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT}
|
{$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT}
|
||||||
Len := Align(Len, SizeOf(PtrInt));
|
DataLen := Align(DataLen, SizeOf(PtrInt));
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
Inc(FRecordSize, Len);
|
Inc(FRecordSize, DataLen);
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
LstFields.Free;
|
LstFields.Free;
|
||||||
@ -696,7 +700,7 @@ begin
|
|||||||
Result := RecBuf < StrEnd(RecBuf); // just ''=Null
|
Result := RecBuf < StrEnd(RecBuf); // just ''=Null
|
||||||
if Result and Assigned(Buffer) then
|
if Result and Assigned(Buffer) then
|
||||||
begin
|
begin
|
||||||
StrLCopy(Buffer, RecBuf, Field.Size);
|
StrLCopy(Buffer, RecBuf, Field.DataSize);
|
||||||
if FTrimSpace then // trim trailing spaces
|
if FTrimSpace then // trim trailing spaces
|
||||||
begin
|
begin
|
||||||
BufEnd := StrEnd(Buffer);
|
BufEnd := StrEnd(Buffer);
|
||||||
@ -759,7 +763,7 @@ begin
|
|||||||
i := 1;
|
i := 1;
|
||||||
while (i < FieldNo) and (i < FieldDefs.Count) do
|
while (i < FieldNo) and (i < FieldDefs.Count) do
|
||||||
begin
|
begin
|
||||||
Len := FieldDefs.Items[i-1].Size + 1;
|
Len := FieldDefDataSize(FieldDefs[i-1]);
|
||||||
{$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT}
|
{$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT}
|
||||||
Len := Align(Len, SizeOf(PtrInt));
|
Len := Align(Len, SizeOf(PtrInt));
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
@ -912,7 +916,7 @@ begin
|
|||||||
Dest := PChar(Result);
|
Dest := PChar(Result);
|
||||||
for i := 0 to FieldDefs.Count - 1 do
|
for i := 0 to FieldDefs.Count - 1 do
|
||||||
begin
|
begin
|
||||||
Len := FieldDefs[i].Size;
|
Len := FieldDefDataSize(FieldDefs[i])-1;
|
||||||
Move(Src^, Dest^, Len);
|
Move(Src^, Dest^, Len);
|
||||||
Inc(Src, Len);
|
Inc(Src, Len);
|
||||||
Inc(Dest, Len);
|
Inc(Dest, Len);
|
||||||
@ -928,14 +932,14 @@ begin
|
|||||||
// calculate fixed length record size
|
// calculate fixed length record size
|
||||||
Len := 0;
|
Len := 0;
|
||||||
for i := 0 to FieldDefs.Count - 1 do
|
for i := 0 to FieldDefs.Count - 1 do
|
||||||
Inc(Len, FieldDefs[i].Size);
|
Inc(Len, FieldDefDataSize(FieldDefs[i])-1);
|
||||||
SetLength(Result, Len);
|
SetLength(Result, Len);
|
||||||
|
|
||||||
Src := PChar(Buffer);
|
Src := PChar(Buffer);
|
||||||
Dest := PChar(Result);
|
Dest := PChar(Result);
|
||||||
for i := 0 to FieldDefs.Count - 1 do
|
for i := 0 to FieldDefs.Count - 1 do
|
||||||
begin
|
begin
|
||||||
Len := FieldDefs[i].Size;
|
Len := FieldDefDataSize(FieldDefs[i])-1;
|
||||||
Move(Src^, Dest^, Len);
|
Move(Src^, Dest^, Len);
|
||||||
// fields in record buffer are null-terminated, but pad them with spaces to fixed length
|
// fields in record buffer are null-terminated, but pad them with spaces to fixed length
|
||||||
SrcLen := StrLen(Src);
|
SrcLen := StrLen(Src);
|
||||||
@ -1142,7 +1146,7 @@ begin
|
|||||||
|
|
||||||
for i := 0 to FieldDefs.Count - 1 do
|
for i := 0 to FieldDefs.Count - 1 do
|
||||||
begin
|
begin
|
||||||
MaxLen := FieldDefs[i].Size;
|
MaxLen := FieldDefDataSize(FieldDefs[i])-1;
|
||||||
S := ExtractDelimited(Source, Pos);
|
S := ExtractDelimited(Source, Pos);
|
||||||
Len := Length(S);
|
Len := Length(S);
|
||||||
|
|
||||||
@ -1152,8 +1156,7 @@ begin
|
|||||||
if Len = 0 then // bug in StrPLCopy
|
if Len = 0 then // bug in StrPLCopy
|
||||||
Dest^ := #0
|
Dest^ := #0
|
||||||
else
|
else
|
||||||
StrPLCopy(Dest, S, Len); // null-terminate
|
StrPLCopy(Dest, S, Len+1); // null-terminate
|
||||||
|
|
||||||
Inc(Dest, MaxLen+1);
|
Inc(Dest, MaxLen+1);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -1173,7 +1176,7 @@ begin
|
|||||||
Src := PChar(Buffer);
|
Src := PChar(Buffer);
|
||||||
for i := 0 to FieldDefs.Count - 1 do
|
for i := 0 to FieldDefs.Count - 1 do
|
||||||
begin
|
begin
|
||||||
MaxLen := FieldDefs[i].Size;
|
MaxLen := FieldDefDataSize(FieldDefs[i])-1;
|
||||||
Len := StrLen(Src); // field values are null-terminated in record buffer
|
Len := StrLen(Src); // field values are null-terminated in record buffer
|
||||||
if Len > MaxLen then
|
if Len > MaxLen then
|
||||||
Len := MaxLen;
|
Len := MaxLen;
|
||||||
|
@ -31,7 +31,7 @@ uses
|
|||||||
SysUtils, Classes, fpjson, jsonscanner, jsonparser;
|
SysUtils, Classes, fpjson, jsonscanner, jsonparser;
|
||||||
|
|
||||||
Const
|
Const
|
||||||
DefaultJSONOptions = [joUTF8,joComments];
|
DefaultJSONOptions = [joUTF8,joComments,joBOMCheck];
|
||||||
|
|
||||||
type
|
type
|
||||||
EJSONConfigError = class(Exception);
|
EJSONConfigError = class(Exception);
|
||||||
|
@ -51,7 +51,7 @@ type
|
|||||||
|
|
||||||
EScannerError = class(EParserError);
|
EScannerError = class(EParserError);
|
||||||
|
|
||||||
TJSONOption = (joUTF8,joStrict,joComments,joIgnoreTrailingComma,joIgnoreDuplicates);
|
TJSONOption = (joUTF8,joStrict,joComments,joIgnoreTrailingComma,joIgnoreDuplicates,joBOMCheck);
|
||||||
TJSONOptions = set of TJSONOption;
|
TJSONOptions = set of TJSONOption;
|
||||||
|
|
||||||
Const
|
Const
|
||||||
@ -141,10 +141,26 @@ end;
|
|||||||
|
|
||||||
constructor TJSONScanner.Create(Source: TStream; AOptions: TJSONOptions);
|
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
|
Var
|
||||||
S : RawByteString;
|
S : RawByteString;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
if (joBOMCheck in aOptions) then
|
||||||
|
SkipStreamBom;
|
||||||
S:='';
|
S:='';
|
||||||
SetLength(S,Source.Size-Source.Position);
|
SetLength(S,Source.Size-Source.Position);
|
||||||
if Length(S)>0 then
|
if Length(S)>0 then
|
||||||
|
Loading…
Reference in New Issue
Block a user