mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 02:19:22 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			125 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
{$J+}
 | 
						|
unit erroru;
 | 
						|
interface
 | 
						|
 | 
						|
  procedure do_error(l : longint);
 | 
						|
 | 
						|
  procedure error;
 | 
						|
 | 
						|
  procedure accept_error(num : longint);
 | 
						|
 | 
						|
  procedure require_error(num : longint);
 | 
						|
 | 
						|
function DoMem (Var StartMem : sizeint): sizeint;
 | 
						|
 | 
						|
 | 
						|
implementation
 | 
						|
 | 
						|
const
 | 
						|
  program_has_error  : boolean = false;
 | 
						|
  accepted_error_num : longint = 0;
 | 
						|
  required_error_num : longint = 0;
 | 
						|
 | 
						|
procedure do_error(l : longint);
 | 
						|
begin
 | 
						|
  writeln('Error near: ',l);
 | 
						|
  halt(100);
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
procedure error;
 | 
						|
begin
 | 
						|
   Writeln('Error in ',paramstr(0));
 | 
						|
   program_has_error:=true;
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
procedure accept_error(num : longint);
 | 
						|
begin
 | 
						|
   accepted_error_num:=num;
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
procedure require_error(num : longint);
 | 
						|
begin
 | 
						|
   required_error_num:=num;
 | 
						|
   accepted_error_num:=num;
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
procedure error_unit_exit;
 | 
						|
begin
 | 
						|
   if exitcode<>0 then
 | 
						|
     begin
 | 
						|
        if (required_error_num<>0) and (exitcode<>required_error_num) then
 | 
						|
          begin
 | 
						|
             Write('Program ',paramstr(0));
 | 
						|
             Write(' exited with error ',exitcode,' whereas error ');
 | 
						|
             Writeln(required_error_num,' was expected');
 | 
						|
             Halt(1);
 | 
						|
          end
 | 
						|
        else if exitcode<>accepted_error_num then
 | 
						|
          begin
 | 
						|
             Write('Program ',paramstr(0));
 | 
						|
             Write(' exited with error ',exitcode,' whereas only error ');
 | 
						|
             Writeln(accepted_error_num,' was expected');
 | 
						|
             Halt(1);
 | 
						|
          end;
 | 
						|
     end
 | 
						|
   else if required_error_num<>0 then
 | 
						|
     begin
 | 
						|
        Write('Program ',paramstr(0));
 | 
						|
        Write(' exited without error whereas error ');
 | 
						|
        Writeln(required_error_num,' was expected');
 | 
						|
        Halt(1);
 | 
						|
     end;
 | 
						|
   if program_has_error then
 | 
						|
     Halt(1)
 | 
						|
   else
 | 
						|
     begin
 | 
						|
        exitcode:=0;
 | 
						|
        erroraddr:=nil;
 | 
						|
     end;
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
function DoMem (Var StartMem : sizeint): sizeint;
 | 
						|
 | 
						|
  function getsize(l:sizeint):string;
 | 
						|
  begin
 | 
						|
    if l<16*1024 then
 | 
						|
      begin
 | 
						|
        str(l,getsize);
 | 
						|
        getsize:=getsize+' bytes';
 | 
						|
      end
 | 
						|
    else
 | 
						|
      begin
 | 
						|
        str(l shr 10,getsize);
 | 
						|
        getsize:=getsize+' Kb';
 | 
						|
      end;
 | 
						|
  end;
 | 
						|
 | 
						|
var
 | 
						|
  hstatus : TFPCHeapstatus;
 | 
						|
begin
 | 
						|
  hstatus:=GetFPCHeapStatus;
 | 
						|
  if StartMem=0 then
 | 
						|
    begin
 | 
						|
      Writeln ('[HEAP] Size: ',getsize(hstatus.CurrHeapSize),',   Used: ',getsize(hstatus.CurrHeapUsed));
 | 
						|
      DoMem:=0;
 | 
						|
    end
 | 
						|
  else
 | 
						|
    begin
 | 
						|
      Writeln ('[HEAP] Size: ',getsize(hstatus.CurrHeapSize),',   Used: ',getsize(hstatus.CurrHeapUsed),
 | 
						|
               ',  Lost: ',getsize(hstatus.CurrHeapUsed-StartMem));
 | 
						|
      DoMem:=hstatus.CurrHeapUsed-StartMem;
 | 
						|
    end;
 | 
						|
  StartMem:=hstatus.CurrHeapUsed;
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
initialization
 | 
						|
finalization
 | 
						|
  error_unit_exit;
 | 
						|
end.
 |