erroru.pp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. {$J+}
  2. unit erroru;
  3. interface
  4. procedure do_error(l : longint);
  5. procedure error;
  6. procedure accept_error(num : longint);
  7. procedure require_error(num : longint);
  8. function DoMem (Var StartMem : sizeint): sizeint;
  9. implementation
  10. const
  11. program_has_error : boolean = false;
  12. accepted_error_num : longint = 0;
  13. required_error_num : longint = 0;
  14. procedure do_error(l : longint);
  15. begin
  16. writeln('Error near: ',l);
  17. halt(100);
  18. end;
  19. procedure error;
  20. begin
  21. Writeln('Error in ',paramstr(0));
  22. program_has_error:=true;
  23. end;
  24. procedure accept_error(num : longint);
  25. begin
  26. accepted_error_num:=num;
  27. end;
  28. procedure require_error(num : longint);
  29. begin
  30. required_error_num:=num;
  31. accepted_error_num:=num;
  32. end;
  33. procedure error_unit_exit;
  34. begin
  35. if exitcode<>0 then
  36. begin
  37. if (required_error_num<>0) and (exitcode<>required_error_num) then
  38. begin
  39. Write('Program ',paramstr(0));
  40. Write(' exited with error ',exitcode,' whereas error ');
  41. Writeln(required_error_num,' was expected');
  42. Halt(1);
  43. end
  44. else if exitcode<>accepted_error_num then
  45. begin
  46. Write('Program ',paramstr(0));
  47. Write(' exited with error ',exitcode,' whereas only error ');
  48. Writeln(accepted_error_num,' was expected');
  49. Halt(1);
  50. end;
  51. end
  52. else if required_error_num<>0 then
  53. begin
  54. Write('Program ',paramstr(0));
  55. Write(' exited without error whereas error ');
  56. Writeln(required_error_num,' was expected');
  57. Halt(1);
  58. end;
  59. if program_has_error then
  60. Halt(1)
  61. else
  62. begin
  63. exitcode:=0;
  64. erroraddr:=nil;
  65. end;
  66. end;
  67. function DoMem (Var StartMem : sizeint): sizeint;
  68. function getsize(l:sizeint):string;
  69. begin
  70. if l<16*1024 then
  71. begin
  72. str(l,getsize);
  73. getsize:=getsize+' bytes';
  74. end
  75. else
  76. begin
  77. str(l shr 10,getsize);
  78. getsize:=getsize+' Kb';
  79. end;
  80. end;
  81. var
  82. hstatus : TFPCHeapstatus;
  83. begin
  84. hstatus:=GetFPCHeapStatus;
  85. if StartMem=0 then
  86. begin
  87. Writeln ('[HEAP] Size: ',getsize(hstatus.CurrHeapSize),', Used: ',getsize(hstatus.CurrHeapUsed));
  88. DoMem:=0;
  89. end
  90. else
  91. begin
  92. Writeln ('[HEAP] Size: ',getsize(hstatus.CurrHeapSize),', Used: ',getsize(hstatus.CurrHeapUsed),
  93. ', Lost: ',getsize(hstatus.CurrHeapUsed-StartMem));
  94. DoMem:=hstatus.CurrHeapUsed-StartMem;
  95. end;
  96. StartMem:=hstatus.CurrHeapUsed;
  97. end;
  98. initialization
  99. finalization
  100. error_unit_exit;
  101. end.