[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]
The definitive Assert. Better than the line numbers supplied w/ the
C/C++ Assert, this assert gives you the "find|error" logical address
of the calling module that called assert. It returns the ssss:oooo
seg offset pair so you can find where the assert was called. Again,
you can use the ifopt D+ if you wish but I prefer a define _NDEBUG
instead. Hopefully this is the end-all assert. Use freely, just drop
me an e-mail at vandewb@wku.wkuvx1.edu if you find it useful.
Here it is...Jay Cole
{ Call if you need to verify implied conditions }
procedure Assert(assertedCond : boolean; const msgStr : string);
implementation
{$ifdef WINDOWS}
uses WinProcs, SysUtils, WinTypes;
{$else}
uses sysUtils;
{$endif}
{ Error when the assumption made is not correct. }
procedure Assert(assertedCond : boolean; const msgStr : string);
var
msgOut : array[0..300] of char;
hexStr : array[0..30] of char;
progSeg, progOfs : word;
tmpStr : string;
begin
{ Get the logical segment used by the Find|Error menu option of
delphi }
asm
mov ax, [bp+04] { Load physical segm of the calling
proc on call stack }
mov es, ax
mov ax, word ptr es:0 { Logical segm stored in 0th position
of physical seg }
mov progSeg, ax { Logical, not physical segm used in
Find|Error menu item }
mov ax, [bp+02]
mov progOfs, ax { Physical ofs is used by find|error,
no translation needed }
end;
{$ifndef _NDEBUG} { Are we allowed to assert? }
if (not assertedCond) then begin
{ construct msg\nat location ssss:oooo using the logical address
}
StrPCopy(msgOut, msgStr);
tmpStr := chr(10)+'at location
'+IntToHex(progSeg,4)+':'+IntToHex(progOfs,4);
StrPCopy(hexStr, tmpStr);
StrCat(msgOut, hexStr);
{$ifdef WINDOWS}
MessageBox(0, msgOut, 'Assert Failed',
MB_ICONSTOP+MB_SYSTEMMODAL+MB_OK);
{$else}
WriteLn('Assert Failed', msgOut);
{$endif}
{ Now, terminate the program because of assertion problem }
halt;
end;
{$endif}
end;
[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]