Out.ob07 4.2 KB

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