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) |