Win32.WinTrace.Mod 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. MODULE WinTrace;
  2. IMPORT Kernel32, Modules,Trace,Commands;
  3. CONST
  4. none = 0; console = 1; file = 2;
  5. VAR
  6. hin-, hout-: Kernel32.HANDLE;
  7. mode: LONGINT; (* none, console or file *)
  8. (* Sender to be used with Stream.Writer *)
  9. PROCEDURE Send* (CONST buf: ARRAY OF CHAR; ofs, len: LONGINT; propagate: BOOLEAN; VAR res: LONGINT);
  10. BEGIN
  11. IF mode # none THEN
  12. Kernel32.WriteFile (hout, buf[ofs], len, len, NIL);
  13. Kernel32.FlushFileBuffers(hout);
  14. END;
  15. END Send;
  16. (* Receiver to be used with Stream.Reader *)
  17. PROCEDURE Receive* (VAR buf: ARRAY OF CHAR; ofs, size, min: LONGINT; VAR len, res: LONGINT);
  18. BEGIN
  19. Kernel32.ReadFile (hin, buf[ofs], min, len, NIL);
  20. END Receive;
  21. PROCEDURE Init;
  22. BEGIN
  23. mode := none;
  24. END Init;
  25. PROCEDURE Close*;
  26. VAR res: LONGINT;
  27. BEGIN
  28. IF mode = console THEN
  29. Kernel32.CloseHandle(hout);
  30. res := Kernel32.FreeConsole ();
  31. ELSIF mode = file THEN
  32. Kernel32.CloseHandle(hout);
  33. END;
  34. hout := Kernel32.InvalidHandleValue;
  35. mode := none;
  36. END Close;
  37. PROCEDURE OpenConsole*;
  38. VAR res: LONGINT;
  39. BEGIN
  40. IF mode = console THEN RETURN
  41. ELSIF mode = file THEN Close
  42. END;
  43. IF Kernel32.AttachConsole(-1) = Kernel32.False THEN
  44. res := Kernel32.AllocConsole ();
  45. END;
  46. hin := Kernel32.GetStdHandle (Kernel32.STDInput);
  47. ASSERT ((hin) # (Kernel32.InvalidHandleValue));
  48. hout := Kernel32.GetStdHandle (Kernel32.STDOutput);
  49. ASSERT ((hout) # (Kernel32.InvalidHandleValue));
  50. Trace.Char := Char;
  51. mode := console;
  52. END OpenConsole;
  53. PROCEDURE OpenFile*(context: Commands.Context);
  54. VAR filename: ARRAY 256 OF CHAR;
  55. BEGIN
  56. Close;
  57. IF ~context.arg.GetString(filename) THEN filename := "WinTrace.Text" END;
  58. hout := Kernel32.CreateFile(filename, {Kernel32.GenericWrite}, {Kernel32.FileShareRead}, NIL, Kernel32.CreateAlways, {Kernel32.FileAttributeNormal}, Kernel32.NULL);
  59. ASSERT ((hout) # (Kernel32.InvalidHandleValue));
  60. Trace.Char := Char;
  61. mode := file;
  62. END OpenFile;
  63. PROCEDURE Terminate;
  64. BEGIN
  65. Close;
  66. END Terminate;
  67. PROCEDURE Char(c: CHAR);
  68. VAR len: LONGINT;
  69. BEGIN
  70. len := 1;
  71. Kernel32.WriteFile(hout,c,len,len,NIL);
  72. END Char;
  73. BEGIN
  74. Init;
  75. Modules.InstallTermHandler (Terminate);
  76. END WinTrace.
  77. WinTrace.OpenFile ~
  78. WinTrace.OpenFile myTrace.Text ~
  79. WinTrace.OpenConsole
  80. WinTrace.Close