Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
8859 | leency | 1 | (* |
2 | BSD 2-Clause License |
||
3 | |||
4 | Copyright (c) 2016, 2018, 2020-2021 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 21 OF CHAR; |
||
35 | |||
36 | BEGIN |
||
37 | IF x = ROR(1, 1) THEN |
||
38 | str := "-9223372036854775808"; |
||
39 | DEC(width, 20) |
||
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 IsNan (x: REAL): BOOLEAN; |
||
74 | CONST |
||
75 | INF = LSR(ASR(ROR(1, 1), 10), 1); |
||
76 | NINF = ASR(ASR(ROR(1, 1), 10), 1); |
||
77 | |||
78 | VAR |
||
79 | a: INTEGER; |
||
80 | |||
81 | BEGIN |
||
82 | SYSTEM.GET(SYSTEM.ADR(x), a) |
||
83 | RETURN (a > INF) OR (a < 0) & (a > NINF) |
||
84 | END IsNan; |
||
85 | |||
86 | |||
87 | PROCEDURE Inf (x: REAL; width: INTEGER); |
||
88 | VAR |
||
89 | s: ARRAY 5 OF CHAR; |
||
90 | |||
91 | BEGIN |
||
92 | DEC(width, 4); |
||
93 | IF IsNan(x) THEN |
||
94 | s := " Nan" |
||
95 | ELSIF x = SYSTEM.INF() THEN |
||
96 | s := "+Inf" |
||
97 | ELSIF x = -SYSTEM.INF() THEN |
||
98 | s := "-Inf" |
||
99 | END; |
||
100 | |||
101 | WHILE width > 0 DO |
||
102 | Char(20X); |
||
103 | DEC(width) |
||
104 | END; |
||
105 | |||
106 | String(s) |
||
107 | END Inf; |
||
108 | |||
109 | |||
110 | PROCEDURE Ln*; |
||
111 | BEGIN |
||
112 | Char(0DX); |
||
113 | Char(0AX) |
||
114 | END Ln; |
||
115 | |||
116 | |||
117 | PROCEDURE unpk10 (VAR x: REAL; VAR n: INTEGER); |
||
118 | VAR |
||
119 | a, b: REAL; |
||
120 | |||
121 | BEGIN |
||
122 | ASSERT(x > 0.0); |
||
123 | n := 0; |
||
124 | WHILE x < 1.0 DO |
||
125 | x := x * 10.0; |
||
126 | DEC(n) |
||
127 | END; |
||
128 | |||
129 | a := 10.0; |
||
130 | b := 1.0; |
||
131 | |||
132 | WHILE a <= x DO |
||
133 | b := a; |
||
134 | a := a * 10.0; |
||
135 | INC(n) |
||
136 | END; |
||
137 | x := x / b |
||
138 | END unpk10; |
||
139 | |||
140 | |||
141 | PROCEDURE _Real (x: REAL; width: INTEGER); |
||
142 | VAR |
||
143 | n, k, p: INTEGER; |
||
144 | |||
145 | BEGIN |
||
146 | p := MIN(MAX(width - 8, 1), 15); |
||
147 | |||
148 | width := width - p - 8; |
||
149 | WHILE width > 0 DO |
||
150 | Char(20X); |
||
151 | DEC(width) |
||
152 | END; |
||
153 | |||
154 | IF x < 0.0 THEN |
||
155 | Char("-"); |
||
156 | x := -x |
||
157 | ELSE |
||
158 | Char(20X) |
||
159 | END; |
||
160 | |||
161 | unpk10(x, n); |
||
162 | |||
163 | k := FLOOR(x); |
||
164 | Char(CHR(k + 30H)); |
||
165 | Char("."); |
||
166 | |||
167 | WHILE p > 0 DO |
||
168 | x := (x - FLT(k)) * 10.0; |
||
169 | k := FLOOR(x); |
||
170 | Char(CHR(k + 30H)); |
||
171 | DEC(p) |
||
172 | END; |
||
173 | |||
174 | Char("E"); |
||
175 | IF n >= 0 THEN |
||
176 | Char("+") |
||
177 | ELSE |
||
178 | Char("-") |
||
179 | END; |
||
180 | n := ABS(n); |
||
181 | Char(CHR(n DIV 100 + 30H)); n := n MOD 100; |
||
182 | Char(CHR(n DIV 10 + 30H)); |
||
183 | Char(CHR(n MOD 10 + 30H)) |
||
184 | END _Real; |
||
185 | |||
186 | |||
187 | PROCEDURE Real* (x: REAL; width: INTEGER); |
||
188 | BEGIN |
||
189 | IF IsNan(x) OR (ABS(x) = SYSTEM.INF()) THEN |
||
190 | Inf(x, width) |
||
191 | ELSIF x = 0.0 THEN |
||
192 | WHILE width > 23 DO |
||
193 | Char(20X); |
||
194 | DEC(width) |
||
195 | END; |
||
196 | DEC(width, 9); |
||
197 | String(" 0.0"); |
||
198 | WHILE width > 0 DO |
||
199 | Char("0"); |
||
200 | DEC(width) |
||
201 | END; |
||
202 | String("E+000") |
||
203 | ELSE |
||
204 | _Real(x, width) |
||
205 | END |
||
206 | END Real; |
||
207 | |||
208 | |||
209 | PROCEDURE _FixReal (x: REAL; width, p: INTEGER); |
||
210 | VAR |
||
211 | n, k: INTEGER; |
||
212 | minus: BOOLEAN; |
||
213 | |||
214 | BEGIN |
||
215 | minus := x < 0.0; |
||
216 | IF minus THEN |
||
217 | x := -x |
||
218 | END; |
||
219 | |||
220 | unpk10(x, n); |
||
221 | |||
222 | DEC(width, 3 + MAX(p, 0) + MAX(n, 0)); |
||
223 | WHILE width > 0 DO |
||
224 | Char(20X); |
||
225 | DEC(width) |
||
226 | END; |
||
227 | |||
228 | IF minus THEN |
||
229 | Char("-") |
||
230 | ELSE |
||
231 | Char(20X) |
||
232 | END; |
||
233 | |||
234 | IF n < 0 THEN |
||
235 | INC(n); |
||
236 | Char("0"); |
||
237 | Char("."); |
||
238 | WHILE (n < 0) & (p > 0) DO |
||
239 | Char("0"); |
||
240 | INC(n); |
||
241 | DEC(p) |
||
242 | END |
||
243 | ELSE |
||
244 | WHILE n >= 0 DO |
||
245 | k := FLOOR(x); |
||
246 | Char(CHR(k + 30H)); |
||
247 | x := (x - FLT(k)) * 10.0; |
||
248 | DEC(n) |
||
249 | END; |
||
250 | Char(".") |
||
251 | END; |
||
252 | |||
253 | WHILE p > 0 DO |
||
254 | k := FLOOR(x); |
||
255 | Char(CHR(k + 30H)); |
||
256 | x := (x - FLT(k)) * 10.0; |
||
257 | DEC(p) |
||
258 | END |
||
259 | |||
260 | END _FixReal; |
||
261 | |||
262 | |||
263 | PROCEDURE FixReal* (x: REAL; width, p: INTEGER); |
||
264 | BEGIN |
||
265 | IF IsNan(x) OR (ABS(x) = SYSTEM.INF()) THEN |
||
266 | Inf(x, width) |
||
267 | ELSIF x = 0.0 THEN |
||
268 | DEC(width, 3 + MAX(p, 0)); |
||
269 | WHILE width > 0 DO |
||
270 | Char(20X); |
||
271 | DEC(width) |
||
272 | END; |
||
273 | String(" 0."); |
||
274 | WHILE p > 0 DO |
||
275 | Char("0"); |
||
276 | DEC(p) |
||
277 | END |
||
278 | ELSE |
||
279 | _FixReal(x, width, p) |
||
280 | END |
||
281 | END FixReal; |
||
282 | |||
283 | |||
284 | PROCEDURE Open*; |
||
285 | END Open; |
||
286 | |||
287 | |||
288 | END Out.>>>>=>>>> |