Subversion Repositories Kolibri OS

Rev

Rev 7983 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. (*
  2.     BSD 2-Clause License
  3.  
  4.     Copyright (c) 2020, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE Out;
  9.  
  10. IMPORT SYSTEM, Libdl;
  11.  
  12.  
  13. VAR
  14.  
  15.     printf1: PROCEDURE [linux] (fmt: INTEGER; x: INTEGER);
  16.     printf2: PROCEDURE [linux] (fmt: INTEGER; width, x: INTEGER);
  17.     printf3: PROCEDURE [linux] (fmt: INTEGER; width, precision, x: INTEGER);
  18.  
  19.  
  20. PROCEDURE Char* (x: CHAR);
  21. BEGIN
  22.     printf1(SYSTEM.SADR("%c"), ORD(x))
  23. END Char;
  24.  
  25.  
  26. PROCEDURE String* (s: ARRAY OF CHAR);
  27. BEGIN
  28.     printf2(SYSTEM.SADR("%.*s"), LENGTH(s), SYSTEM.ADR(s[0]))
  29. END String;
  30.  
  31.  
  32. PROCEDURE Ln*;
  33. BEGIN
  34.     printf1(SYSTEM.SADR("%s"), SYSTEM.SADR(0AX))
  35. END Ln;
  36.  
  37.  
  38. PROCEDURE Int* (x, width: INTEGER);
  39. BEGIN
  40.     printf2(SYSTEM.SADR("%*lld"), width, x)
  41. END Int;
  42.  
  43.  
  44. PROCEDURE intval (x: REAL): INTEGER;
  45. VAR
  46.     i: INTEGER;
  47.  
  48. BEGIN
  49.     SYSTEM.GET(SYSTEM.ADR(x), i)
  50.     RETURN i
  51. END intval;
  52.  
  53.  
  54. PROCEDURE Real* (x: REAL; width: INTEGER);
  55. BEGIN
  56.     printf3(SYSTEM.SADR("%*.*E"), width, MAX(MIN(width - 8, 15), 1), intval(x))
  57. END Real;
  58.  
  59.  
  60. PROCEDURE FixReal* (x: REAL; width, precision: INTEGER);
  61. BEGIN
  62.     printf3(SYSTEM.SADR("%*.*f"), width, precision, intval(x))
  63. END FixReal;
  64.  
  65.  
  66. PROCEDURE Open*;
  67. END Open;
  68.  
  69.  
  70. PROCEDURE init;
  71. VAR
  72.     libc, printf: INTEGER;
  73.  
  74. BEGIN
  75.     libc := Libdl.open("libc.so.6", Libdl.LAZY);
  76.     ASSERT(libc # 0);
  77.     printf := Libdl.sym(libc, "printf");
  78.     ASSERT(printf # 0);
  79.     SYSTEM.PUT(SYSTEM.ADR(printf1), printf);
  80.     SYSTEM.PUT(SYSTEM.ADR(printf2), printf);
  81.     SYSTEM.PUT(SYSTEM.ADR(printf3), printf);
  82. END init;
  83.  
  84.  
  85. BEGIN
  86.     init
  87. END Out.