Subversion Repositories Kolibri OS

Rev

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

  1. (*
  2.     BSD 2-Clause License
  3.  
  4.     Copyright (c) 2016, 2018, 2020, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE Out;
  9.  
  10. IMPORT HOST, SYSTEM;
  11.  
  12.  
  13. PROCEDURE Char* (c: CHAR);
  14. BEGIN
  15.     HOST.OutChar(c)
  16. END Char;
  17.  
  18.  
  19. PROCEDURE String* (s: ARRAY OF CHAR);
  20. VAR
  21.     i, n: INTEGER;
  22.  
  23. BEGIN
  24.     n := LENGTH(s) - 1;
  25.     FOR i := 0 TO n DO
  26.         Char(s[i])
  27.     END
  28. END String;
  29.  
  30.  
  31. PROCEDURE Int* (x, width: INTEGER);
  32. VAR
  33.     i, a: INTEGER;
  34.     str: ARRAY 12 OF CHAR;
  35.  
  36. BEGIN
  37.     IF x = 80000000H THEN
  38.         COPY("-2147483648", str);
  39.         DEC(width, 11)
  40.     ELSE
  41.         i := 0;
  42.         IF x < 0 THEN
  43.             x := -x;
  44.             i := 1;
  45.             str[0] := "-"
  46.         END;
  47.  
  48.         a := x;
  49.         REPEAT
  50.             INC(i);
  51.             a := a DIV 10
  52.         UNTIL a = 0;
  53.  
  54.         str[i] := 0X;
  55.         DEC(width, i);
  56.  
  57.         REPEAT
  58.             DEC(i);
  59.             str[i] := CHR(x MOD 10 + ORD("0"));
  60.             x := x DIV 10
  61.         UNTIL x = 0
  62.     END;
  63.  
  64.     WHILE width > 0 DO
  65.         Char(20X);
  66.         DEC(width)
  67.     END;
  68.  
  69.     String(str)
  70. END Int;
  71.  
  72.  
  73. PROCEDURE Inf (x: REAL; width: INTEGER);
  74. VAR
  75.     s: ARRAY 5 OF CHAR;
  76.  
  77. BEGIN
  78.     DEC(width, 4);
  79.     IF x # x THEN
  80.         s := " Nan"
  81.     ELSIF x = SYSTEM.INF() THEN
  82.         s := "+Inf"
  83.     ELSIF x = -SYSTEM.INF() THEN
  84.         s := "-Inf"
  85.     END;
  86.  
  87.     WHILE width > 0 DO
  88.         Char(20X);
  89.         DEC(width)
  90.     END;
  91.  
  92.     String(s)
  93. END Inf;
  94.  
  95.  
  96. PROCEDURE Ln*;
  97. BEGIN
  98.     Char(0DX);
  99.     Char(0AX)
  100. END Ln;
  101.  
  102.  
  103. PROCEDURE unpk10 (VAR x: REAL; VAR n: INTEGER);
  104. VAR
  105.     a, b: REAL;
  106.  
  107. BEGIN
  108.     ASSERT(x > 0.0);
  109.     n := 0;
  110.     WHILE x < 1.0 DO
  111.         x := x * 10.0;
  112.         DEC(n)
  113.     END;
  114.  
  115.     a := 10.0;
  116.     b := 1.0;
  117.  
  118.     WHILE a <= x DO
  119.         b := a;
  120.         a := a * 10.0;
  121.         INC(n)
  122.     END;
  123.     x := x / b
  124. END unpk10;
  125.  
  126.  
  127. PROCEDURE _Real (x: REAL; width: INTEGER);
  128. VAR
  129.     n, k, p: INTEGER;
  130.  
  131. BEGIN
  132.     p := MIN(MAX(width - 7, 1), 10);
  133.  
  134.     width := width - p - 7;
  135.     WHILE width > 0 DO
  136.         Char(20X);
  137.         DEC(width)
  138.     END;
  139.  
  140.     IF x < 0.0 THEN
  141.         Char("-");
  142.         x := -x
  143.     ELSE
  144.         Char(20X)
  145.     END;
  146.  
  147.     unpk10(x, n);
  148.  
  149.     k := FLOOR(x);
  150.     Char(CHR(k + 30H));
  151.     Char(".");
  152.  
  153.     WHILE p > 0 DO
  154.         x := (x - FLT(k)) * 10.0;
  155.         k := FLOOR(x);
  156.         Char(CHR(k + 30H));
  157.         DEC(p)
  158.     END;
  159.  
  160.     Char("E");
  161.     IF n >= 0 THEN
  162.         Char("+")
  163.     ELSE
  164.         Char("-")
  165.     END;
  166.     n := ABS(n);
  167.     Char(CHR(n DIV 10 + 30H));
  168.     Char(CHR(n MOD 10 + 30H))
  169. END _Real;
  170.  
  171.  
  172. PROCEDURE Real* (x: REAL; width: INTEGER);
  173. BEGIN
  174.     IF (x # x) OR (ABS(x) = SYSTEM.INF()) THEN
  175.         Inf(x, width)
  176.     ELSIF x = 0.0 THEN
  177.         WHILE width > 17 DO
  178.             Char(20X);
  179.             DEC(width)
  180.         END;
  181.         DEC(width, 8);
  182.         String(" 0.0");
  183.         WHILE width > 0 DO
  184.             Char("0");
  185.             DEC(width)
  186.         END;
  187.         String("E+00")
  188.     ELSE
  189.         _Real(x, width)
  190.     END
  191. END Real;
  192.  
  193.  
  194. PROCEDURE _FixReal (x: REAL; width, p: INTEGER);
  195. VAR
  196.     n, k: INTEGER;
  197.     minus: BOOLEAN;
  198.  
  199. BEGIN
  200.     minus := x < 0.0;
  201.     IF minus THEN
  202.         x := -x
  203.     END;
  204.  
  205.     unpk10(x, n);
  206.  
  207.     DEC(width, 3 + MAX(p, 0) + MAX(n, 0));
  208.     WHILE width > 0 DO
  209.         Char(20X);
  210.         DEC(width)
  211.     END;
  212.  
  213.     IF minus THEN
  214.         Char("-")
  215.     ELSE
  216.         Char(20X)
  217.     END;
  218.  
  219.     IF n < 0 THEN
  220.         INC(n);
  221.         Char("0");
  222.         Char(".");
  223.         WHILE (n < 0) & (p > 0) DO
  224.             Char("0");
  225.             INC(n);
  226.             DEC(p)
  227.         END
  228.     ELSE
  229.         WHILE n >= 0 DO
  230.             k := FLOOR(x);
  231.             Char(CHR(k + 30H));
  232.             x := (x - FLT(k)) * 10.0;
  233.             DEC(n)
  234.         END;
  235.         Char(".")
  236.     END;
  237.  
  238.     WHILE p > 0 DO
  239.         k := FLOOR(x);
  240.         Char(CHR(k + 30H));
  241.         x := (x - FLT(k)) * 10.0;
  242.         DEC(p)
  243.     END
  244.  
  245. END _FixReal;
  246.  
  247.  
  248. PROCEDURE FixReal* (x: REAL; width, p: INTEGER);
  249. BEGIN
  250.     IF (x # x) OR (ABS(x) = SYSTEM.INF()) THEN
  251.         Inf(x, width)
  252.     ELSIF x = 0.0 THEN
  253.         DEC(width, 3 + MAX(p, 0));
  254.         WHILE width > 0 DO
  255.             Char(20X);
  256.             DEC(width)
  257.         END;
  258.         String(" 0.");
  259.         WHILE p > 0 DO
  260.             Char("0");
  261.             DEC(p)
  262.         END
  263.     ELSE
  264.         _FixReal(x, width, p)
  265.     END
  266. END FixReal;
  267.  
  268.  
  269. PROCEDURE Open*;
  270. END Open;
  271.  
  272.  
  273. END Out.