Rev 7696 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7696 | Rev 7983 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | Copyright (c) 2018-2019, Anton Krotov |
4 | Copyright (c) 2018-2020, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
Line 6... | Line 6... | ||
6 | *) |
6 | *) |
Line 73... | Line 73... | ||
73 | 73 | ||
74 | RETURN v.float |
74 | RETURN v.float |
Line -... | Line 75... | ||
- | 75 | END Float; |
|
- | 76 | ||
- | 77 | ||
- | 78 | PROCEDURE range* (i: VALUE; a, b: INTEGER): BOOLEAN; |
|
- | 79 | RETURN (a <= i.int) & (i.int <= b) |
|
75 | END Float; |
80 | END range; |
76 | 81 | ||
77 | 82 | ||
Line 78... | Line 83... | ||
78 | PROCEDURE check* (v: VALUE): BOOLEAN; |
83 | PROCEDURE check* (v: VALUE): BOOLEAN; |
79 | VAR |
84 | VAR |
80 | res: BOOLEAN; |
85 | res: BOOLEAN; |
81 | 86 | ||
82 | BEGIN |
87 | BEGIN |
83 | CASE v.typ OF |
88 | CASE v.typ OF |
84 | |tINTEGER: res := (UTILS.target.minInt <= v.int) & (v.int <= UTILS.target.maxInt) |
89 | |tINTEGER: res := range(v, UTILS.target.minInt, UTILS.target.maxInt) |
Line 85... | Line 90... | ||
85 | |tCHAR: res := (0 <= v.int) & (v.int <= 255) |
90 | |tCHAR: res := range(v, 0, 255) |
86 | |tWCHAR: res := (0 <= v.int) & (v.int <= 65535) |
91 | |tWCHAR: res := range(v, 0, 65535) |
Line 194... | Line 199... | ||
194 | 199 | ||
Line 195... | Line 200... | ||
195 | END hconv; |
200 | END hconv; |
196 | - | ||
197 | - | ||
198 | PROCEDURE opFloat2 (VAR a: REAL; b: REAL; op: CHAR): BOOLEAN; |
- | |
199 | VAR |
- | |
200 | max: REAL; |
201 | |
201 | res: BOOLEAN; |
- | |
202 | - | ||
203 | BEGIN |
202 | |
204 | max := UTILS.maxreal; |
- | |
205 | - | ||
206 | CASE op OF |
203 | PROCEDURE opFloat2 (VAR a: REAL; b: REAL; op: CHAR): BOOLEAN; |
207 | |"+": |
- | |
208 | IF (a < 0.0) & (b < 0.0) THEN |
204 | BEGIN |
209 | res := a > -max - b |
- | |
210 | ELSIF (a > 0.0) & (b > 0.0) THEN |
205 | CASE op OF |
211 | res := a < max - b |
- | |
212 | ELSE |
- | |
213 | res := TRUE |
206 | |"+": a := a + b |
214 | END; |
207 | |"-": a := a - b |
Line 215... | Line -... | ||
215 | IF res THEN |
- | |
216 | a := a + b |
- | |
217 | END |
- | |
218 | - | ||
219 | |"-": |
- | |
220 | IF (a < 0.0) & (b > 0.0) THEN |
- | |
221 | res := a > b - max |
- | |
222 | ELSIF (a > 0.0) & (b < 0.0) THEN |
- | |
223 | res := a < b + max |
- | |
224 | ELSE |
- | |
225 | res := TRUE |
- | |
226 | END; |
- | |
227 | IF res THEN |
- | |
228 | a := a - b |
208 | |"*": a := a * b |
229 | END |
- | |
230 | - | ||
231 | |"*": |
- | |
232 | IF (ABS(a) > 1.0) & (ABS(b) > 1.0) THEN |
- | |
233 | res := ABS(a) < max / ABS(b) |
- | |
234 | ELSE |
- | |
235 | res := TRUE |
- | |
236 | END; |
- | |
237 | IF res THEN |
- | |
238 | a := a * b |
- | |
239 | END |
- | |
240 | - | ||
241 | |"/": |
- | |
242 | IF ABS(b) < 1.0 THEN |
- | |
243 | res := ABS(a) < max * ABS(b) |
- | |
244 | ELSE |
- | |
245 | res := TRUE |
- | |
246 | END; |
- | |
247 | IF res THEN |
- | |
248 | a := a / b |
- | |
249 | END |
- | |
250 | 209 | |"/": a := a / b |
|
Line 251... | Line 210... | ||
251 | END |
210 | END |
252 | 211 | ||
Line 405... | Line 364... | ||
405 | n: INTEGER; |
364 | n: INTEGER; |
Line 406... | Line 365... | ||
406 | 365 | ||
407 | BEGIN |
366 | BEGIN |
Line 408... | Line -... | ||
408 | ASSERT(x > 0); |
- | |
409 | - | ||
410 | n := 0; |
367 | ASSERT(x > 0); |
411 | WHILE ~ODD(x) DO |
- | |
412 | x := x DIV 2; |
- | |
413 | INC(n) |
- | |
414 | END; |
368 | |
415 | 369 | n := UTILS.Log2(x); |
|
416 | IF x # 1 THEN |
370 | IF n = -1 THEN |
Line 417... | Line 371... | ||
417 | n := 255 |
371 | n := 255 |
418 | END |
372 | END |
Line 519... | Line 473... | ||
519 | CASE op OF |
473 | CASE op OF |
520 | |"+": success := addInt(a.int, b.int) |
474 | |"+": success := addInt(a.int, b.int) |
521 | |"-": success := subInt(a.int, b.int) |
475 | |"-": success := subInt(a.int, b.int) |
522 | |"*": success := mulInt(a.int, b.int) |
476 | |"*": success := mulInt(a.int, b.int) |
523 | |"/": success := FALSE |
477 | |"/": success := FALSE |
524 | |"D": IF (b.int # -1) OR (a.int # UTILS.minint) THEN a.int := a.int DIV b.int ELSE success := FALSE END |
478 | |"D": a.int := a.int DIV b.int |
525 | |"M": a.int := a.int MOD b.int |
479 | |"M": a.int := a.int MOD b.int |
526 | |"L": a.int := _LSL(a.int, b.int) |
480 | |"L": a.int := _LSL(a.int, b.int) |
527 | |"A": a.int := _ASR(a.int, b.int) |
481 | |"A": a.int := _ASR(a.int, b.int) |
528 | |"O": a.int := _ROR(a.int, b.int) |
482 | |"O": a.int := _ROR(a.int, b.int) |
529 | |"R": a.int := _LSR(a.int, b.int) |
483 | |"R": a.int := _LSR(a.int, b.int) |
Line 668... | Line 622... | ||
668 | END; |
622 | END; |
669 | a.typ := tBOOLEAN |
623 | a.typ := tBOOLEAN |
670 | END opBoolean; |
624 | END opBoolean; |
Line 671... | Line -... | ||
671 | - | ||
672 | - | ||
673 | PROCEDURE range* (i: VALUE; a, b: INTEGER): BOOLEAN; |
- | |
674 | RETURN (a <= i.int) & (i.int <= b) |
- | |
675 | END range; |
- | |
676 | 625 | ||
677 | 626 | ||
678 | PROCEDURE less (v, v2: VALUE; VAR error: INTEGER): BOOLEAN; |
627 | PROCEDURE less (v, v2: VALUE; VAR error: INTEGER): BOOLEAN; |
Line 679... | Line 628... | ||
679 | VAR |
628 | VAR |