mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 10:39:18 +02:00
Patch from Giulio Bernardi - fixes regression of bug #3595:
* ObjectTextToBinary now correctly handles widestrings * Fixed TParser's handling of decimal strings git-svn-id: trunk@10578 -
This commit is contained in:
parent
2eaf30e77f
commit
046fb5baf4
@ -1352,6 +1352,21 @@ var
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure ProcessWideString(const left : widestring);
|
||||||
|
var ws : widestring;
|
||||||
|
begin
|
||||||
|
ws:=left+parser.TokenWideString;
|
||||||
|
while parser.NextToken = '+' do
|
||||||
|
begin
|
||||||
|
parser.NextToken; // Get next string fragment
|
||||||
|
if not (parser.Token in [toString,toWString]) then
|
||||||
|
parser.CheckToken(toWString);
|
||||||
|
ws:=ws+parser.TokenWideString;
|
||||||
|
end;
|
||||||
|
Output.WriteByte(Ord(vaWstring));
|
||||||
|
WriteWString(ws);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure ProcessProperty; forward;
|
procedure ProcessProperty; forward;
|
||||||
|
|
||||||
procedure ProcessValue;
|
procedure ProcessValue;
|
||||||
@ -1360,10 +1375,7 @@ var
|
|||||||
flt: Extended;
|
flt: Extended;
|
||||||
{$endif}
|
{$endif}
|
||||||
s: String;
|
s: String;
|
||||||
ws: WideString;
|
|
||||||
stream: TMemoryStream;
|
stream: TMemoryStream;
|
||||||
i: Integer;
|
|
||||||
b: Boolean;
|
|
||||||
begin
|
begin
|
||||||
case parser.Token of
|
case parser.Token of
|
||||||
toInteger:
|
toInteger:
|
||||||
@ -1382,40 +1394,32 @@ var
|
|||||||
{$endif}
|
{$endif}
|
||||||
toString:
|
toString:
|
||||||
begin
|
begin
|
||||||
ws := parser.TokenWideString;
|
s := parser.TokenString;
|
||||||
while parser.NextToken = '+' do
|
while parser.NextToken = '+' do
|
||||||
begin
|
begin
|
||||||
parser.NextToken; // Get next string fragment
|
parser.NextToken; // Get next string fragment
|
||||||
parser.CheckToken(toString);
|
case parser.Token of
|
||||||
ws := ws + parser.TokenWideString;
|
toString : s:=s+parser.TokenString;
|
||||||
end;
|
toWString : begin
|
||||||
b:= false;
|
ProcessWideString(s);
|
||||||
for i:= 1 to length(ws) do begin
|
exit;
|
||||||
if ord(ws[i]) and $ff00 <> 0 then begin
|
end
|
||||||
b:= true;
|
else parser.CheckToken(toString);
|
||||||
break;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
if b then begin
|
if (length(S)>255) then
|
||||||
Output.WriteByte(Ord(vaWstring));
|
begin
|
||||||
WriteWString(ws);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
setlength(s,length(ws));
|
|
||||||
for i:= 1 to length(s) do begin
|
|
||||||
s[i]:= chr(ord(ws[i])); //cut msb
|
|
||||||
end;
|
|
||||||
if (length(S)>255) then begin
|
|
||||||
Output.WriteByte(Ord(vaLString));
|
Output.WriteByte(Ord(vaLString));
|
||||||
WriteLString(S);
|
WriteLString(S);
|
||||||
end
|
end
|
||||||
else begin
|
else
|
||||||
|
begin
|
||||||
Output.WriteByte(Ord(vaString));
|
Output.WriteByte(Ord(vaString));
|
||||||
WriteString(s);
|
WriteString(s);
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
toWString:
|
||||||
|
ProcessWideString('');
|
||||||
toSymbol:
|
toSymbol:
|
||||||
begin
|
begin
|
||||||
if CompareText(parser.TokenString, 'True') = 0 then
|
if CompareText(parser.TokenString, 'True') = 0 then
|
||||||
|
@ -243,14 +243,11 @@ begin
|
|||||||
inc(fPos);
|
inc(fPos);
|
||||||
CheckLoadBuffer;
|
CheckLoadBuffer;
|
||||||
end;
|
end;
|
||||||
if TryStrToInt(Result,i) and (i<256) then
|
if not TryStrToInt(Result,i) then
|
||||||
begin
|
i:=0;
|
||||||
if i>127 then ascii:=false;
|
if i>127 then ascii:=false;
|
||||||
setlength(Result,1);
|
setlength(Result,1);
|
||||||
Result[1]:=widechar(word(i));
|
Result[1]:=widechar(word(i));
|
||||||
end
|
|
||||||
else
|
|
||||||
Result:='#'+Result;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TParser.HandleString;
|
procedure TParser.HandleString;
|
||||||
|
Loading…
Reference in New Issue
Block a user