Out.ob07 1.8 KB

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