erroru.pp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. {$J+}
  2. unit erroru;
  3. interface
  4. {$ifdef ver1_0}
  5. type
  6. ptrint=longint;
  7. sizeint=longint;
  8. {$endif}
  9. procedure do_error(l : longint);
  10. procedure error;
  11. procedure accept_error(num : longint);
  12. procedure require_error(num : longint);
  13. {$ifndef HASGETHEAPSTATUS}
  14. type
  15. THeapStatus = record
  16. MaxHeapSize,
  17. MaxHeapUsed,
  18. CurrHeapSize,
  19. CurrHeapUsed,
  20. CurrHeapFree : ptrint;
  21. end;
  22. procedure getheapstatus(var status:THeapStatus);
  23. {$endif HASGETHEAPSTATUS}
  24. {$ifndef HASGETFPCHEAPSTATUS}
  25. type
  26. TFPCHeapStatus = THeapStatus;
  27. function GetFPCHeapStatus:TFPCHeapStatus;
  28. {$endif HASGETFPCHEAPSTATUS}
  29. function DoMem (Var StartMem : sizeint): sizeint;
  30. implementation
  31. const
  32. program_has_error : boolean = false;
  33. accepted_error_num : longint = 0;
  34. required_error_num : longint = 0;
  35. procedure do_error(l : longint);
  36. begin
  37. writeln('Error near: ',l);
  38. halt(100);
  39. end;
  40. procedure error;
  41. begin
  42. Writeln('Error in ',paramstr(0));
  43. program_has_error:=true;
  44. end;
  45. procedure accept_error(num : longint);
  46. begin
  47. accepted_error_num:=num;
  48. end;
  49. procedure require_error(num : longint);
  50. begin
  51. required_error_num:=num;
  52. accepted_error_num:=num;
  53. end;
  54. procedure error_unit_exit;
  55. begin
  56. if exitcode<>0 then
  57. begin
  58. if (required_error_num<>0) and (exitcode<>required_error_num) then
  59. begin
  60. Write('Program ',paramstr(0));
  61. Write(' exited with error ',exitcode,' whereas error ');
  62. Writeln(required_error_num,' was expected');
  63. Halt(1);
  64. end
  65. else if exitcode<>accepted_error_num then
  66. begin
  67. Write('Program ',paramstr(0));
  68. Write(' exited with error ',exitcode,' whereas only error ');
  69. Writeln(accepted_error_num,' was expected');
  70. Halt(1);
  71. end;
  72. end
  73. else if required_error_num<>0 then
  74. begin
  75. Write('Program ',paramstr(0));
  76. Write(' exited without error whereas error ');
  77. Writeln(required_error_num,' was expected');
  78. Halt(1);
  79. end;
  80. if program_has_error then
  81. Halt(1)
  82. else
  83. begin
  84. exitcode:=0;
  85. erroraddr:=nil;
  86. end;
  87. end;
  88. {$ifndef HASGETHEAPSTATUS}
  89. procedure getheapstatus(var status:THeapStatus);
  90. begin
  91. fillchar(status,sizeof(status),0);
  92. status.MaxHeapSize:=HeapSize;
  93. status.MaxHeapUsed:=HeapSize-MemAvail;
  94. status.CurrHeapSize:=HeapSize;
  95. status.CurrHeapUsed:=HeapSize-MemAvail;
  96. status.CurrHeapFree:=MemAvail;
  97. end;
  98. {$endif HASGETHEAPSTATUS}
  99. {$ifndef HASGETFPCHEAPSTATUS}
  100. function GetFPCHeapStatus:TFPCHeapStatus;
  101. begin
  102. GetHeapStatus(GetFPCHeapStatus);
  103. end;
  104. {$endif HASGETFPCHEAPSTATUS}
  105. function DoMem (Var StartMem : sizeint): sizeint;
  106. function getsize(l:sizeint):string;
  107. begin
  108. if l<16*1024 then
  109. begin
  110. str(l,getsize);
  111. getsize:=getsize+' bytes';
  112. end
  113. else
  114. begin
  115. str(l shr 10,getsize);
  116. getsize:=getsize+' Kb';
  117. end;
  118. end;
  119. var
  120. hstatus : TFPCHeapstatus;
  121. begin
  122. hstatus:=GetFPCHeapStatus;
  123. if StartMem=0 then
  124. begin
  125. Writeln ('[HEAP] Size: ',getsize(hstatus.CurrHeapSize),', Used: ',getsize(hstatus.CurrHeapUsed));
  126. DoMem:=0;
  127. end
  128. else
  129. begin
  130. Writeln ('[HEAP] Size: ',getsize(hstatus.CurrHeapSize),', Used: ',getsize(hstatus.CurrHeapUsed),
  131. ', Lost: ',getsize(hstatus.CurrHeapUsed-StartMem));
  132. DoMem:=hstatus.CurrHeapUsed-StartMem;
  133. end;
  134. StartMem:=hstatus.CurrHeapUsed;
  135. end;
  136. initialization
  137. finalization
  138. error_unit_exit;
  139. end.