Subversion Repositories Kolibri OS

Rev

Rev 8097 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 8097 Rev 8859
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-2020, Anton Krotov
4
    Copyright (c) 2018-2021, Anton Krotov
5
    All rights reserved.
5
    All rights reserved.
Line 6... Line 6...
6
*)
6
*)
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
MODULE ARITH;
8
MODULE ARITH;
Line 9... Line 9...
9
 
9
 
Line 29... Line 29...
29
        int:       INTEGER;
29
        int:       INTEGER;
30
        float:     REAL;
30
        float:     REAL;
31
        set:       SET;
31
        set:       SET;
32
        bool:      BOOLEAN;
32
        bool:      BOOLEAN;
Line 33... Line 33...
33
 
33
 
Line 34... Line 34...
34
        string*:   AVLTREES.DATA
34
        string*:   LISTS.ITEM
Line 35... Line 35...
35
 
35
 
Line 156... Line 156...
156
    error := 0;
156
    error := 0;
157
    value := 0;
157
    value := 0;
Line 158... Line 158...
158
 
158
 
159
    n := -1;
159
    n := -1;
160
    i := 0;
160
    i := 0;
Line 161... Line 161...
161
    WHILE (s[i] # "H") & (s[i] # "X") & (error = 0) DO
161
    WHILE (s[i] # "H") & (s[i] # "X") & (s[i] # "h") & (s[i] # "x") & (error = 0) DO
162
 
162
 
163
        d := digit[ORD(s[i])];
163
        d := digit[ORD(s[i])];
164
        IF (n = -1) & (d # 0) THEN
164
        IF (n = -1) & (d # 0) THEN
Line 174... Line 174...
174
 
174
 
Line 175... Line 175...
175
    END;
175
    END;
Line 176... Line 176...
176
 
176
 
177
    value := UTILS.Long(value);
177
    value := UTILS.Long(value);
178
 
178
 
Line 179... Line 179...
179
    IF (s[i] = "X") & (n # -1) & (i - n > 4) THEN
179
    IF ((s[i] = "X") OR (s[i] = "x")) & (n # -1) & (i - n > 4) THEN
180
        error := 3
180
        error := 3
181
    END;
181
    END;
182
 
182
 
183
    IF error = 0 THEN
183
    IF error = 0 THEN
184
        v.int := value;
184
        v.int := value;
185
        IF s[i] = "X" THEN
185
        IF (s[i] = "X") OR (s[i] = "x") THEN
186
            v.typ := tCHAR;
186
            v.typ := tCHAR;
Line 215... Line 215...
215
 
215
 
216
 
216
 
217
PROCEDURE fconv* (s: ARRAY OF CHAR; VAR v: VALUE; VAR error: INTEGER);
217
PROCEDURE fconv* (s: ARRAY OF CHAR; VAR v: VALUE; VAR error: INTEGER);
-
 
218
VAR
218
VAR
219
    value:    REAL;
219
    value:    REAL;
220
    frac:     REAL;
220
    exp10:    REAL;
221
    exp10:    REAL;
Line 221... Line 222...
221
    i, n, d:  INTEGER;
222
    i, n, d:  INTEGER;
222
    minus:    BOOLEAN;
223
    minus:    BOOLEAN;
223
 
224
 
-
 
225
BEGIN
224
BEGIN
226
    error := 0;
225
    error := 0;
227
    value := 0.0;
226
    value := 0.0;
228
    frac  := 0.0;
Line 227... Line 229...
227
    exp10 := 10.0;
229
    exp10 := 1.0;
228
    minus := FALSE;
230
    minus := FALSE;
Line 238... Line 240...
238
    END;
240
    END;
Line 239... Line 241...
239
 
241
 
Line 240... Line 242...
240
    INC(i);
242
    INC(i);
241
 
243
 
-
 
244
    WHILE (error = 0) & STRINGS.digit(s[i]) DO
242
    WHILE (error = 0) & STRINGS.digit(s[i]) DO
245
        IF opFloat2(frac, 10.0, "*") & opFloat2(frac, FLT(digit[ORD(s[i])]), "+") THEN
243
        IF opFloat2(value, FLT(digit[ORD(s[i])]) / exp10, "+") & opFloat2(exp10, 10.0, "*") THEN
246
            exp10 := exp10 * 10.0;
244
            INC(i)
247
            INC(i)
245
        ELSE
248
        ELSE
246
            error := 4
249
            error := 4
Line -... Line 250...
-
 
250
        END
-
 
251
    END;
-
 
252
 
-
 
253
    IF ~opFloat2(value, frac / exp10, "+") THEN
247
        END
254
        error := 4
248
    END;
255
    END;
249
 
256
 
Line 250... Line 257...
250
    IF s[i] = "E" THEN
257
    IF (s[i] = "E") OR (s[i] = "e") THEN
251
        INC(i)
258
        INC(i)