* Better patch from Laco for bug #24274, without relying on try/except

git-svn-id: trunk@24323 -
This commit is contained in:
michael 2013-04-25 18:26:24 +00:00
parent 742b9b5359
commit 3125b9e6b0

View File

@ -1813,9 +1813,11 @@ IMPLEMENTATION
function BCDToCurr ( const BCD : tBCD; function BCDToCurr ( const BCD : tBCD;
var Curr : currency ) : Boolean; var Curr : currency ) : Boolean;
const
MaxCurr: array[boolean] of QWord = (QWord($7FFFFFFFFFFFFFFF), QWord($8000000000000000));
var var
bh : tBCD_helper; bh : tBCD_helper;
res : int64; res : QWord;
c : currency absolute res; c : currency absolute res;
i : {$ifopt r+} low ( bh.FDig )..4 {$else} Integer {$endif}; i : {$ifopt r+} low ( bh.FDig )..4 {$else} Integer {$endif};
@ -1824,22 +1826,28 @@ IMPLEMENTATION
} }
begin begin
BCDToCurr := True; BCDToCurr := False;
if BCDPrecision(BCD) - BCDScale(BCD) > 15 then
Exit;
unpack_BCD ( BCD, bh ); unpack_BCD ( BCD, bh );
res := 0; res := 0;
WITH bh do WITH bh do
try begin
for i := FDig TO 4 do for i := FDig TO 4 do
res := res * 10 - Singles[i]; res := res * 10 + Singles[i];
if Plac > 4 if Plac > 4
then then
if Singles[5] > 4 if Singles[5] > 4
then Inc ( res ); then Inc ( res );
if not Neg then if res > MaxCurr[Neg] then
res := -res; Exit;
if Neg then
begin
res := not res;
inc(res);
end;
Curr := c; Curr := c;
except BCDToCurr := True;
BCDToCurr := False;
end; end;
end; end;