ERRORMAN.MOD 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. IMPLEMENTATION MODULE ErrorManager;
  2. (*
  3. * REPERTOIRE
  4. * Release 1.6
  5. * By Charles Bradford and Cole Brecheen
  6. * (c) Copyright 1985-1992 PMI
  7. * Green Bay, Wisconsin
  8. * All rights reserved
  9. * (414) 468-6040
  10. *
  11. * $Header: D:/logfiles/mods/errorman.mov 1.8 10 Mar 1991 15:27:10 coleb $
  12. *
  13. *)
  14. IMPORT KbdInput;
  15. IMPORT LowLevel;
  16. IMPORT M2Strings;
  17. IMPORT StrConv;
  18. IMPORT StrEdit;
  19. IMPORT StringIO;
  20. IMPORT SYSTEM;
  21. IMPORT FAPI;
  22. IMPORT VStorage;
  23. VAR
  24. Initialized : BOOLEAN;
  25. CONST
  26. MaxStaticProcs = 8;
  27. TYPE
  28. AProcRecPtr = POINTER TO AProcRec;
  29. AProcRec =
  30. RECORD
  31. TheProc: ATermProc;
  32. prv: AProcRecPtr;
  33. fromblock: BOOLEAN;
  34. END;
  35. VAR
  36. TermProcStackTop : AProcRecPtr;
  37. TermProcsDoneOnce: BOOLEAN;
  38. (*This keeps us from getting in trouble with recursive calls
  39. to DoTermProcs.*)
  40. ErrorReturn : CARDINAL;
  41. Aborting: BOOLEAN;
  42. (*And this prevents recursive calls to WARN.*)
  43. StaticProcs : ARRAY [1..MaxStaticProcs] OF AProcRec;
  44. (*We have this StaticProcs array because certain Repertoire
  45. modules need to add TermProcs in their initialization
  46. blocks, which are executed before the user tells us where
  47. DOS memory is coming from. We can't allocate new elements
  48. of the TermProcList until we can get memory. *)
  49. ProcCount : CARDINAL;
  50. PROCEDURE CallHalt( TheMessage: ARRAY OF CHAR );
  51. BEGIN
  52. IF Aborting THEN
  53. RETURN
  54. ELSE
  55. Aborting := TRUE;
  56. END;
  57. IF (M2Strings.Length( TheMessage ) > 0) THEN
  58. IF NOT AbortConfirmed( TheMessage ) THEN
  59. Aborting := FALSE;
  60. RETURN;
  61. END;
  62. END;
  63. DoTermProcs();
  64. HALT();
  65. END CallHalt;
  66. PROCEDURE DefaultWarnNumber( TheMessage: ARRAY OF CHAR;
  67. TheErrorNum: CARDINAL );
  68. VAR
  69. tmpstr: ARRAY [0..79] OF CHAR;
  70. BEGIN
  71. StrConv.CardinalToStr( TheErrorNum, 0, tmpstr );
  72. M2Strings.Insert( ' ', tmpstr, 0 );
  73. M2Strings.Insert( TheMessage, tmpstr, 0 );
  74. WARN( tmpstr );
  75. END DefaultWarnNumber;
  76. PROCEDURE StraightToDOS( TheMessage: ARRAY OF CHAR );
  77. BEGIN
  78. IF Aborting THEN
  79. RETURN
  80. ELSE
  81. Aborting := TRUE;
  82. END;
  83. IF (M2Strings.Length( TheMessage ) > 0) THEN
  84. IF NOT AbortConfirmed( TheMessage ) THEN
  85. Aborting := FALSE;
  86. RETURN;
  87. END;
  88. END;
  89. DoTermProcs();
  90. FAPI.DOSEXIT(0, 0);
  91. END StraightToDOS;
  92. PROCEDURE DoTermProcs();
  93. VAR
  94. LocalProcRecPtr: AProcRecPtr;
  95. count : CARDINAL;
  96. BEGIN
  97. IF TermProcsDoneOnce OR (TermProcStackTop = NIL) THEN
  98. RETURN
  99. ELSE
  100. TermProcsDoneOnce := TRUE;
  101. END;
  102. LocalProcRecPtr := TermProcStackTop;
  103. WHILE LocalProcRecPtr # NIL DO
  104. LocalProcRecPtr^.TheProc();
  105. LocalProcRecPtr := LocalProcRecPtr^.prv;
  106. (* We don't attempt to deallocate the TermProc list as
  107. we go, because it's about to be released to the
  108. operating system anyway. *)
  109. END;
  110. END DoTermProcs;
  111. PROCEDURE AddTermProc( TheTermProc: ATermProc );
  112. VAR
  113. LocalProcRecPtr: AProcRecPtr;
  114. (* Although it may look like a mistake for this to be local,
  115. the object to which it points will be on the heap, and
  116. that's what we're adding to the TermProcStack, not the
  117. pointer itself. *)
  118. BEGIN
  119. INC(ProcCount);
  120. IF ProcCount <= MaxStaticProcs THEN
  121. StaticProcs[ ProcCount ].TheProc := TheTermProc;
  122. LocalProcRecPtr := SYSTEM.ADR(StaticProcs[ ProcCount ]);
  123. LocalProcRecPtr^.fromblock := TRUE;
  124. ELSE
  125. VStorage.DosAlloc( LocalProcRecPtr, SYSTEM.TSIZE(AProcRec) );
  126. LocalProcRecPtr^.fromblock := FALSE;
  127. END;
  128. LocalProcRecPtr^.TheProc := TheTermProc;
  129. LocalProcRecPtr^.prv := TermProcStackTop;
  130. TermProcStackTop := LocalProcRecPtr;
  131. END AddTermProc;
  132. PROCEDURE RemoveTermProc(TheTermProc: ATermProc);
  133. VAR
  134. LocalProcRecPtr, nxt: AProcRecPtr;
  135. BEGIN
  136. LocalProcRecPtr := TermProcStackTop;
  137. nxt := NIL;
  138. WHILE (LocalProcRecPtr # NIL) AND
  139. (SYSTEM.ADDRESS(LocalProcRecPtr^.TheProc) #
  140. SYSTEM.ADDRESS(TheTermProc)) DO
  141. nxt := LocalProcRecPtr;
  142. LocalProcRecPtr := LocalProcRecPtr^.prv;
  143. END;
  144. IF LocalProcRecPtr = NIL THEN
  145. RETURN;
  146. END;
  147. IF (LocalProcRecPtr = TermProcStackTop) THEN
  148. TermProcStackTop := LocalProcRecPtr^.prv;
  149. END;
  150. IF nxt # NIL THEN
  151. nxt^.prv := LocalProcRecPtr^.prv;
  152. END;
  153. LocalProcRecPtr^.prv := NIL;
  154. LocalProcRecPtr^.TheProc := ATermProc(NIL);
  155. IF NOT LocalProcRecPtr^.fromblock THEN
  156. VStorage.DosDealloc( LocalProcRecPtr, SYSTEM.TSIZE(AProcRec) );
  157. END;
  158. END RemoveTermProc;
  159. PROCEDURE DefaultConfirm( TheMessage: ARRAY OF CHAR ): BOOLEAN;
  160. VAR
  161. dummy: ARRAY [0..255] OF CHAR;
  162. BEGIN
  163. M2Strings.Assign( TheMessage, dummy );
  164. StrEdit.Append( dummy, '. Press C to continue, anything else to abort.' );
  165. StringIO.WriteEol( StringIO.ErrorOutp, '' );
  166. StringIO.WriteEol( StringIO.ErrorOutp, dummy );
  167. RETURN KbdInput.CAPkey( KbdInput.KeyHit(KbdInput.AnyKeyNum) ) # ORD('C');
  168. END DefaultConfirm;
  169. PROCEDURE InitStatProcs();
  170. (* Initialize the StaticProcs array. *)
  171. VAR
  172. i: CARDINAL;
  173. BEGIN
  174. FOR i := 1 TO (MaxStaticProcs - 1) DO
  175. StaticProcs[i].prv := SYSTEM.ADR(StaticProcs[i+1]);
  176. StaticProcs[i].fromblock := TRUE;
  177. StaticProcs[i].TheProc := ATermProc(NIL);
  178. END;
  179. StaticProcs[MaxStaticProcs].prv := NIL;
  180. StaticProcs[MaxStaticProcs].fromblock := TRUE;
  181. StaticProcs[MaxStaticProcs].TheProc := ATermProc(NIL);
  182. END InitStatProcs;
  183. PROCEDURE Init();
  184. BEGIN
  185. IF Initialized THEN
  186. RETURN;
  187. ELSE
  188. Initialized := TRUE;
  189. END;
  190. KbdInput.Init();
  191. LowLevel.Init();
  192. M2Strings.Init();
  193. StrConv.Init();
  194. StrEdit.Init();
  195. StringIO.Init();
  196. VStorage.Init();
  197. KbdInput.Init();
  198. Aborting := FALSE;
  199. TermProcStackTop := NIL;
  200. TermProcsDoneOnce := FALSE;
  201. WARN := CallHalt;
  202. WarnNumber := DefaultWarnNumber;
  203. AbortConfirmed := DefaultConfirm;
  204. ProcCount := 0;
  205. InitStatProcs();
  206. END Init;
  207. BEGIN
  208. Initialized := FALSE;
  209. Init();
  210. END ErrorManager.