Windows.WinTrace.Mod 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. MODULE WinTrace;
  2. IMPORT Kernel32, Modules,Trace,Commands;
  3. CONST
  4. none = 0; console = 1; file = 2;
  5. VAR
  6. hin-, hout-, herr-: Kernel32.HANDLE;
  7. mode: LONGINT; (* none, console or file *)
  8. traceChar0: PROCEDURE(ch: CHAR);
  9. (* Sender to be used with Stream.Writer *)
  10. PROCEDURE Send* (CONST buf: ARRAY OF CHAR; ofs, len: LONGINT; propagate: BOOLEAN; VAR res: WORD);
  11. VAR b: Kernel32.BOOL;
  12. BEGIN
  13. IF mode # none THEN
  14. b := Kernel32.WriteFile (hout, buf[ofs], len, len, NIL);
  15. Kernel32.FlushFileBuffers(hout);
  16. END;
  17. END Send;
  18. (* Sender to be used with Stream.Writer *)
  19. PROCEDURE SendError* (CONST buf: ARRAY OF CHAR; ofs, len: LONGINT; propagate: BOOLEAN; VAR res: WORD);
  20. VAR b: Kernel32.BOOL;
  21. BEGIN
  22. IF mode # none THEN
  23. b := Kernel32.WriteFile (herr, buf[ofs], len, len, NIL);
  24. Kernel32.FlushFileBuffers(herr);
  25. END;
  26. END SendError;
  27. (* Receiver to be used with Stream.Reader *)
  28. PROCEDURE Receive* (VAR buf: ARRAY OF CHAR; ofs, size, min: LONGINT; VAR len, res: LONGINT);
  29. VAR b: Kernel32.BOOL; tlen: LONGINT;
  30. BEGIN
  31. len := 0;
  32. b := Kernel32.ReadFile (hin, buf[ofs], size, len, NIL);
  33. DEC(size, len);
  34. WHILE (len < min) DO
  35. b := Kernel32.ReadFile (hin, buf[ofs], size, tlen, NIL);
  36. INC(len, tlen);
  37. DEC(size, tlen);
  38. END;
  39. res := 0;
  40. END Receive;
  41. PROCEDURE Init;
  42. BEGIN
  43. mode := none;
  44. END Init;
  45. PROCEDURE Close*;
  46. VAR res: WORD;
  47. BEGIN
  48. IF traceChar0 # NIL THEN
  49. Trace.Char := traceChar0;
  50. END;
  51. IF mode = console THEN
  52. Kernel32.CloseHandle(hout);
  53. #IF ~SHAREDLIB THEN
  54. res := Kernel32.FreeConsole ();
  55. #END;
  56. ELSIF mode = file THEN
  57. Kernel32.CloseHandle(hout);
  58. END;
  59. hout := Kernel32.InvalidHandleValue;
  60. mode := none;
  61. END Close;
  62. PROCEDURE OpenConsole*;
  63. VAR res: WORD;
  64. BEGIN
  65. IF mode = console THEN RETURN
  66. ELSIF mode = file THEN Close
  67. END;
  68. IF Kernel32.AttachConsole(-1) = Kernel32.False THEN
  69. res := Kernel32.AllocConsole ();
  70. END;
  71. hin := Kernel32.GetStdHandle (Kernel32.STDInput);
  72. ASSERT ((hin) # (Kernel32.InvalidHandleValue));
  73. hout := Kernel32.GetStdHandle (Kernel32.STDOutput);
  74. ASSERT ((hout) # (Kernel32.InvalidHandleValue));
  75. herr := Kernel32.GetStdHandle (Kernel32.STDError);
  76. ASSERT ((herr) # (Kernel32.InvalidHandleValue));
  77. traceChar0 := Trace.Char;
  78. Trace.Char := Char;
  79. mode := console;
  80. END OpenConsole;
  81. PROCEDURE OpenFile*(context: Commands.Context);
  82. VAR filename: ARRAY 256 OF CHAR;
  83. BEGIN
  84. Close;
  85. IF ~context.arg.GetString(filename) THEN filename := "WinTrace.Text" END;
  86. hout := Kernel32.CreateFile(filename, {Kernel32.GenericWrite}, {Kernel32.FileShareRead}, NIL, Kernel32.CreateAlways, {Kernel32.FileAttributeNormal}, Kernel32.NULL);
  87. ASSERT ((hout) # (Kernel32.InvalidHandleValue));
  88. herr := hout;
  89. traceChar0 := Trace.Char;
  90. Trace.Char := Char;
  91. mode := file;
  92. END OpenFile;
  93. PROCEDURE Terminate;
  94. BEGIN
  95. Close;
  96. END Terminate;
  97. PROCEDURE Char(c: CHAR);
  98. VAR len: LONGINT; b: Kernel32.BOOL;
  99. BEGIN
  100. len := 1;
  101. b := Kernel32.WriteFile(hout,c,len,len,NIL);
  102. END Char;
  103. BEGIN
  104. Init;
  105. Modules.InstallTermHandler (Terminate);
  106. END WinTrace.
  107. WinTrace.OpenFile ~
  108. WinTrace.OpenFile myTrace.Text ~
  109. WinTrace.OpenConsole
  110. WinTrace.Close