Log.txt 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. MODULE ConsLog;
  2. (*
  3. A. V. Shiryaev, 2012.10
  4. Log.Hook implementation
  5. based on StdLog
  6. *)
  7. IMPORT
  8. Log, Views, Dialog,
  9. TextModels, TextMappers,
  10. Console;
  11. TYPE
  12. LogHook = POINTER TO RECORD (Log.Hook) END;
  13. VAR
  14. logAlerts: BOOLEAN;
  15. subOut: TextMappers.Formatter;
  16. buf: TextModels.Model;
  17. textR: TextModels.Reader;
  18. (* Sub support *)
  19. PROCEDURE* Guard (o: ANYPTR): BOOLEAN;
  20. BEGIN
  21. RETURN o # NIL
  22. END Guard;
  23. PROCEDURE* ClearBuf;
  24. VAR subBuf: TextModels.Model;
  25. BEGIN
  26. subBuf := subOut.rider.Base(); subBuf.Delete(0, subBuf.Length())
  27. END ClearBuf;
  28. PROCEDURE* FlushBuf;
  29. VAR c: CHAR;
  30. BEGIN
  31. IF buf.Length() > 0 THEN
  32. textR.SetPos(0);
  33. textR.ReadChar(c);
  34. WHILE ~textR.eot DO
  35. IF c = 0DX THEN
  36. Console.WriteLn
  37. ELSE
  38. Console.WriteChar(c)
  39. END;
  40. textR.ReadChar(c)
  41. END;
  42. buf.Delete(0, buf.Length())
  43. END
  44. END FlushBuf;
  45. PROCEDURE* SubFlush;
  46. BEGIN
  47. IF Log.synch THEN
  48. FlushBuf;
  49. (* IF Log.force THEN Views.RestoreDomain(text.Domain()) END *)
  50. END;
  51. END SubFlush;
  52. PROCEDURE (log: LogHook) Guard* (o: ANYPTR): BOOLEAN;
  53. BEGIN RETURN Guard(o)
  54. END Guard;
  55. PROCEDURE (log: LogHook) ClearBuf*;
  56. BEGIN ClearBuf
  57. END ClearBuf;
  58. PROCEDURE (log: LogHook) FlushBuf*;
  59. BEGIN FlushBuf
  60. END FlushBuf;
  61. PROCEDURE (log: LogHook) Beep*;
  62. BEGIN Dialog.Beep
  63. END Beep;
  64. PROCEDURE (log: LogHook) Char* (ch: CHAR);
  65. BEGIN
  66. subOut.WriteChar(ch); SubFlush
  67. END Char;
  68. PROCEDURE (log: LogHook) Int* (n: INTEGER);
  69. BEGIN
  70. subOut.WriteChar(" "); subOut.WriteInt(n); SubFlush
  71. END Int;
  72. PROCEDURE (log: LogHook) Real* (x: REAL);
  73. BEGIN
  74. subOut.WriteChar(" "); subOut.WriteReal(x); SubFlush
  75. END Real;
  76. PROCEDURE (log: LogHook) String* (IN str: ARRAY OF CHAR);
  77. BEGIN
  78. subOut.WriteString(str); SubFlush
  79. END String;
  80. PROCEDURE (log: LogHook) Bool* (x: BOOLEAN);
  81. BEGIN
  82. subOut.WriteChar(" "); subOut.WriteBool(x); SubFlush
  83. END Bool;
  84. PROCEDURE (log: LogHook) Set* (x: SET);
  85. BEGIN
  86. subOut.WriteChar(" "); subOut.WriteSet(x); SubFlush
  87. END Set;
  88. PROCEDURE (log: LogHook) IntForm* (x: INTEGER; base, minWidth: INTEGER; fillCh: CHAR; showBase: BOOLEAN);
  89. BEGIN
  90. subOut.WriteIntForm(x, base, minWidth, fillCh, showBase); SubFlush
  91. END IntForm;
  92. PROCEDURE (log: LogHook) RealForm* (x: REAL; precision, minW, expW: INTEGER; fillCh: CHAR);
  93. BEGIN
  94. subOut.WriteRealForm(x, precision, minW, expW, fillCh); SubFlush
  95. END RealForm;
  96. PROCEDURE (log: LogHook) Tab*;
  97. BEGIN
  98. subOut.WriteTab; SubFlush
  99. END Tab;
  100. PROCEDURE (log: LogHook) Ln*;
  101. BEGIN
  102. subOut.WriteLn; SubFlush;
  103. (* IF Log.synch THEN Views.RestoreDomain(text.Domain()) END *)
  104. END Ln;
  105. PROCEDURE (log: LogHook) Para*;
  106. BEGIN
  107. subOut.WritePara; SubFlush;
  108. (* IF Log.synch THEN Views.RestoreDomain(text.Domain()) END *)
  109. END Para;
  110. PROCEDURE (log: LogHook) View* (v: ANYPTR);
  111. BEGIN
  112. IF (v # NIL) & (v IS Views.View) THEN
  113. subOut.WriteView(v(Views.View)); SubFlush
  114. END
  115. END View;
  116. PROCEDURE (log: LogHook) ViewForm* (v: ANYPTR; w, h: INTEGER);
  117. BEGIN
  118. ASSERT(v # NIL, 20);
  119. IF (v # NIL) & (v IS Views.View) THEN
  120. subOut.WriteViewForm(v(Views.View), w, h); SubFlush
  121. END
  122. END ViewForm;
  123. PROCEDURE (log: LogHook) ParamMsg* (IN s, p0, p1, p2: ARRAY OF CHAR);
  124. VAR msg: ARRAY 256 OF CHAR; i: INTEGER; ch: CHAR;
  125. BEGIN
  126. IF logAlerts THEN
  127. (* IF Log.synch THEN Open END; *)
  128. Dialog.MapParamString(s, p0, p1, p2, msg);
  129. i := 0; ch := msg[0];
  130. WHILE ch # 0X DO
  131. IF ch = TextModels.line THEN subOut.WriteLn
  132. ELSIF ch = TextModels.para THEN subOut.WritePara
  133. ELSIF ch = TextModels.tab THEN subOut.WriteTab
  134. ELSIF ch >= " " THEN subOut.WriteChar(ch)
  135. END;
  136. INC(i); ch := msg[i];
  137. END;
  138. subOut.WriteLn; SubFlush
  139. (* ELSE
  140. HostDialog.ShowParamMsg(s, p0, p1, p2) *)
  141. END
  142. END ParamMsg;
  143. PROCEDURE AttachSubLog;
  144. VAR h: LogHook;
  145. BEGIN
  146. subOut.ConnectTo(TextModels.dir.New());
  147. buf := subOut.rider.Base();
  148. textR := buf.NewReader(NIL);
  149. NEW(h);
  150. Log.SetHook(h);
  151. END AttachSubLog;
  152. PROCEDURE DetachSubLog;
  153. BEGIN
  154. Log.SetHook(NIL)
  155. END DetachSubLog;
  156. BEGIN
  157. AttachSubLog
  158. CLOSE
  159. DetachSubLog;
  160. END ConsLog.