Subversion Repositories Kolibri OS

Rev

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