Log.txt 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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 c := 0AX END;
  36. Console.WriteChar(c);
  37. textR.ReadChar(c)
  38. END;
  39. buf.Delete(0, buf.Length())
  40. END
  41. END FlushBuf;
  42. PROCEDURE* SubFlush;
  43. BEGIN
  44. IF Log.synch THEN
  45. FlushBuf;
  46. (* IF Log.force THEN Views.RestoreDomain(text.Domain()) END *)
  47. END;
  48. END SubFlush;
  49. PROCEDURE (log: LogHook) Guard* (o: ANYPTR): BOOLEAN;
  50. BEGIN RETURN Guard(o)
  51. END Guard;
  52. PROCEDURE (log: LogHook) ClearBuf*;
  53. BEGIN ClearBuf
  54. END ClearBuf;
  55. PROCEDURE (log: LogHook) FlushBuf*;
  56. BEGIN FlushBuf
  57. END FlushBuf;
  58. PROCEDURE (log: LogHook) Beep*;
  59. BEGIN Dialog.Beep
  60. END Beep;
  61. PROCEDURE (log: LogHook) Char* (ch: CHAR);
  62. BEGIN
  63. subOut.WriteChar(ch); SubFlush
  64. END Char;
  65. PROCEDURE (log: LogHook) Int* (n: INTEGER);
  66. BEGIN
  67. subOut.WriteChar(" "); subOut.WriteInt(n); SubFlush
  68. END Int;
  69. PROCEDURE (log: LogHook) Real* (x: REAL);
  70. BEGIN
  71. subOut.WriteChar(" "); subOut.WriteReal(x); SubFlush
  72. END Real;
  73. PROCEDURE (log: LogHook) String* (IN str: ARRAY OF CHAR);
  74. BEGIN
  75. subOut.WriteString(str); SubFlush
  76. END String;
  77. PROCEDURE (log: LogHook) Bool* (x: BOOLEAN);
  78. BEGIN
  79. subOut.WriteChar(" "); subOut.WriteBool(x); SubFlush
  80. END Bool;
  81. PROCEDURE (log: LogHook) Set* (x: SET);
  82. BEGIN
  83. subOut.WriteChar(" "); subOut.WriteSet(x); SubFlush
  84. END Set;
  85. PROCEDURE (log: LogHook) IntForm* (x: INTEGER; base, minWidth: INTEGER; fillCh: CHAR; showBase: BOOLEAN);
  86. BEGIN
  87. subOut.WriteIntForm(x, base, minWidth, fillCh, showBase); SubFlush
  88. END IntForm;
  89. PROCEDURE (log: LogHook) RealForm* (x: REAL; precision, minW, expW: INTEGER; fillCh: CHAR);
  90. BEGIN
  91. subOut.WriteRealForm(x, precision, minW, expW, fillCh); SubFlush
  92. END RealForm;
  93. PROCEDURE (log: LogHook) Tab*;
  94. BEGIN
  95. subOut.WriteTab; SubFlush
  96. END Tab;
  97. PROCEDURE (log: LogHook) Ln*;
  98. BEGIN
  99. subOut.WriteLn; SubFlush;
  100. (* IF Log.synch THEN Views.RestoreDomain(text.Domain()) END *)
  101. END Ln;
  102. PROCEDURE (log: LogHook) Para*;
  103. BEGIN
  104. subOut.WritePara; SubFlush;
  105. (* IF Log.synch THEN Views.RestoreDomain(text.Domain()) END *)
  106. END Para;
  107. PROCEDURE (log: LogHook) View* (v: ANYPTR);
  108. BEGIN
  109. IF (v # NIL) & (v IS Views.View) THEN
  110. subOut.WriteView(v(Views.View)); SubFlush
  111. END
  112. END View;
  113. PROCEDURE (log: LogHook) ViewForm* (v: ANYPTR; w, h: INTEGER);
  114. BEGIN
  115. ASSERT(v # NIL, 20);
  116. IF (v # NIL) & (v IS Views.View) THEN
  117. subOut.WriteViewForm(v(Views.View), w, h); SubFlush
  118. END
  119. END ViewForm;
  120. PROCEDURE (log: LogHook) ParamMsg* (IN s, p0, p1, p2: ARRAY OF CHAR);
  121. VAR msg: ARRAY 256 OF CHAR; i: INTEGER; ch: CHAR;
  122. BEGIN
  123. IF logAlerts THEN
  124. (* IF Log.synch THEN Open END; *)
  125. Dialog.MapParamString(s, p0, p1, p2, msg);
  126. i := 0; ch := msg[0];
  127. WHILE ch # 0X DO
  128. IF ch = TextModels.line THEN subOut.WriteLn
  129. ELSIF ch = TextModels.para THEN subOut.WritePara
  130. ELSIF ch = TextModels.tab THEN subOut.WriteTab
  131. ELSIF ch >= " " THEN subOut.WriteChar(ch)
  132. END;
  133. INC(i); ch := msg[i];
  134. END;
  135. subOut.WriteLn; SubFlush
  136. (* ELSE
  137. HostDialog.ShowParamMsg(s, p0, p1, p2) *)
  138. END
  139. END ParamMsg;
  140. PROCEDURE AttachSubLog;
  141. VAR h: LogHook;
  142. BEGIN
  143. subOut.ConnectTo(TextModels.dir.New());
  144. buf := subOut.rider.Base();
  145. textR := buf.NewReader(NIL);
  146. NEW(h);
  147. Log.SetHook(h);
  148. END AttachSubLog;
  149. PROCEDURE DetachSubLog;
  150. BEGIN
  151. Log.SetHook(NIL)
  152. END DetachSubLog;
  153. BEGIN
  154. AttachSubLog
  155. CLOSE
  156. DetachSubLog;
  157. END ConsLog.