erroru.pp 3.2 KB

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