Out.ob07 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2020-2022, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE Out;
  7. IMPORT SYSTEM, API;
  8. CONST
  9. bit_depth = API.BIT_DEPTH;
  10. VAR
  11. hConsoleOutput: INTEGER;
  12. fmt: ARRAY 8 OF CHAR;
  13. PROCEDURE [ccall, "msvcrt.dll", "printf"] printf1 (fmt: INTEGER; x: INTEGER);
  14. PROCEDURE [ccall, "msvcrt.dll", "printf"] printf2 (fmt: INTEGER; width, x: INTEGER);
  15. PROCEDURE [ccall, "msvcrt.dll", "printf"] printf3 (fmt: INTEGER; width, precision: INTEGER; x: REAL);
  16. PROCEDURE [ccall, "msvcrt.dll", "printf"] printf4 (fmt: INTEGER; width, precision: INTEGER; x: INTEGER);
  17. PROCEDURE [windows, "kernel32.dll", ""]
  18. WriteConsoleW (hConsoleOutput, lpBuffer, nNumberOfCharsToWrite, lpNumberOfCharsWritten, lpReserved: INTEGER);
  19. PROCEDURE [windows, "kernel32.dll", ""]
  20. GetStdHandle (nStdHandle: INTEGER): INTEGER;
  21. PROCEDURE CharW* (c: WCHAR);
  22. BEGIN
  23. WriteConsoleW(hConsoleOutput, SYSTEM.ADR(c), 1, 0, 0)
  24. END CharW;
  25. PROCEDURE StringW* (s: ARRAY OF WCHAR);
  26. BEGIN
  27. WriteConsoleW(hConsoleOutput, SYSTEM.ADR(s[0]), LENGTH(s), 0, 0)
  28. END StringW;
  29. PROCEDURE Char* (c: CHAR);
  30. BEGIN
  31. printf1(SYSTEM.SADR("%c"), ORD(c))
  32. END Char;
  33. PROCEDURE String* (s: ARRAY OF CHAR);
  34. BEGIN
  35. printf2(SYSTEM.SADR("%.*s"), LENGTH(s), SYSTEM.ADR(s[0]))
  36. END String;
  37. PROCEDURE Ln*;
  38. BEGIN
  39. printf1(SYSTEM.SADR("%s"), SYSTEM.SADR(CHR(13) + CHR(10)))
  40. END Ln;
  41. PROCEDURE Int* (x, width: INTEGER);
  42. BEGIN
  43. printf2(SYSTEM.ADR(fmt[0]), width, x)
  44. END Int;
  45. PROCEDURE Real* (x: REAL; width: INTEGER);
  46. BEGIN
  47. IF bit_depth = 32 THEN
  48. printf3(SYSTEM.SADR("%*.*E"), width, MAX(MIN(width - 8, 15), 1), x)
  49. ELSE
  50. printf4(SYSTEM.SADR("%*.*E"), width, MAX(MIN(width - 8, 15), 1), SYSTEM.VAL(x, INTEGER))
  51. END
  52. END Real;
  53. PROCEDURE FixReal* (x: REAL; width, precision: INTEGER);
  54. BEGIN
  55. IF bit_depth = 32 THEN
  56. printf3(SYSTEM.SADR("%*.*f"), width, precision, x)
  57. ELSE
  58. printf4(SYSTEM.SADR("%*.*f"), width, precision, SYSTEM.VAL(x, INTEGER))
  59. END
  60. END FixReal;
  61. PROCEDURE Open*;
  62. BEGIN
  63. hConsoleOutput := GetStdHandle(-11)
  64. END Open;
  65. BEGIN
  66. IF bit_depth = 32 THEN
  67. fmt := "%*d"
  68. ELSE
  69. fmt := "%*lld"
  70. END
  71. END Out.