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:
michael 2008-03-29 09:15:28 +00:00
parent 2eaf30e77f
commit 046fb5baf4
2 changed files with 35 additions and 34 deletions

View File

@ -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

View File

@ -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;