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: INTEGER; x: REAL);
  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("%*d"), width, x)
  41. END Int;
  42.  
  43.  
  44. PROCEDURE Real* (x: REAL; width: INTEGER);
  45. BEGIN
  46.     printf3(SYSTEM.SADR("%*.*E"), width, MAX(MIN(width - 8, 15), 1), x)
  47. END Real;
  48.  
  49.  
  50. PROCEDURE FixReal* (x: REAL; width, precision: INTEGER);
  51. BEGIN
  52.     printf3(SYSTEM.SADR("%*.*f"), width, precision, x)
  53. END FixReal;
  54.  
  55.  
  56. PROCEDURE Open*;
  57. END Open;
  58.  
  59.  
  60. PROCEDURE init;
  61. VAR
  62.     libc, printf: INTEGER;
  63.  
  64. BEGIN
  65.     libc := Libdl.open("libc.so.6", Libdl.LAZY);
  66.     ASSERT(libc # 0);
  67.     printf := Libdl.sym(libc, "printf");
  68.     ASSERT(printf # 0);
  69.     SYSTEM.PUT(SYSTEM.ADR(printf1), printf);
  70.     SYSTEM.PUT(SYSTEM.ADR(printf2), printf);
  71.     SYSTEM.PUT(SYSTEM.ADR(printf3), printf);
  72. END init;
  73.  
  74.  
  75. BEGIN
  76.     init
  77. END Out.