mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 00:32:24 +00:00
implemented In.Real and In.LongReal, unless it'll be implemented better.
This commit is contained in:
parent
5c86750aed
commit
b5c76a0ee3
1 changed files with 89 additions and 9 deletions
|
|
@ -1,6 +1,6 @@
|
|||
MODULE In;
|
||||
|
||||
IMPORT Platform, SYSTEM, Out;
|
||||
IMPORT Platform, SYSTEM, Reals, Out;
|
||||
|
||||
VAR
|
||||
Done-: BOOLEAN;
|
||||
|
|
@ -99,14 +99,6 @@ VAR h: HUGEINT;
|
|||
BEGIN HugeInt(h); i := SYSTEM.VAL(LONGINT, h)
|
||||
END LongInt;
|
||||
|
||||
PROCEDURE Real*(VAR x: REAL);
|
||||
BEGIN HALT(99) (* Not implemented *)
|
||||
END Real;
|
||||
|
||||
PROCEDURE LongReal*(VAR y: LONGREAL);
|
||||
BEGIN HALT(99) (* Not implemented *)
|
||||
END LongReal;
|
||||
|
||||
PROCEDURE Line*(VAR line: ARRAY OF CHAR);
|
||||
VAR i: INTEGER;
|
||||
BEGIN StartRead; i := 0; Done := readstate = ready;
|
||||
|
|
@ -144,6 +136,94 @@ PROCEDURE Name*(VAR name: ARRAY OF CHAR); (* Read filename. Presumably using she
|
|||
BEGIN HALT(99) (* Not implemented *)
|
||||
END Name;
|
||||
|
||||
PROCEDURE StrToReal(s: ARRAY OF CHAR; VAR r: REAL);
|
||||
VAR p, e: INTEGER; y, g: REAL; neg, negE: BOOLEAN;
|
||||
BEGIN
|
||||
p := 0;
|
||||
WHILE (s[p] = " ") OR (s[p] = "0") DO INC(p) END;
|
||||
IF s[p] = "-" THEN neg := TRUE; INC(p) ELSE neg := FALSE END;
|
||||
WHILE (s[p] = " ") OR (s[p] = "0") DO INC(p) END;
|
||||
|
||||
y := 0;
|
||||
WHILE ("0" <= s[p]) & (s[p] <= "9") DO
|
||||
y := y * 10 + (ORD(s[p]) - 30H);
|
||||
INC(p);
|
||||
END;
|
||||
IF s[p] = "." THEN
|
||||
INC(p); g := 1;
|
||||
WHILE ("0" <= s[p]) & (s[p] <= "9") DO
|
||||
g := g / 10; y := y + g * (ORD(s[p]) - 30H);
|
||||
INC(p);
|
||||
END;
|
||||
END;
|
||||
IF (s[p] = "D") OR (s[p] = "E") THEN
|
||||
INC(p); e := 0;
|
||||
IF s[p] = "-" THEN negE := TRUE; INC(p) ELSE negE := FALSE END;
|
||||
WHILE (s[p] = "0") DO INC(p) END;
|
||||
WHILE ("0" <= s[p]) & (s[p] <= "9") DO
|
||||
e := e * 10 + (ORD(s[p]) - 30H);
|
||||
INC(p);
|
||||
END;
|
||||
IF negE THEN y := y / Reals.Ten(e)
|
||||
ELSE y := y * Reals.Ten(e) END;
|
||||
END;
|
||||
IF neg THEN y := -y END;
|
||||
r := y;
|
||||
END StrToReal;
|
||||
|
||||
PROCEDURE StrToLongReal(s: ARRAY OF CHAR; VAR r: LONGREAL);
|
||||
VAR p, e: INTEGER; y, g: LONGREAL; neg, negE: BOOLEAN;
|
||||
BEGIN
|
||||
p := 0;
|
||||
WHILE (s[p] = " ") OR (s[p] = "0") DO INC(p) END;
|
||||
IF s[p] = "-" THEN neg := TRUE; INC(p) ELSE neg := FALSE END;
|
||||
WHILE (s[p] = " ") OR (s[p] = "0") DO INC(p) END;
|
||||
|
||||
y := 0;
|
||||
WHILE ("0" <= s[p]) & (s[p] <= "9") DO
|
||||
y := y * 10 + (ORD(s[p]) - 30H);
|
||||
INC(p);
|
||||
END;
|
||||
IF s[p] = "." THEN
|
||||
INC(p); g := 1;
|
||||
WHILE ("0" <= s[p]) & (s[p] <= "9") DO
|
||||
g := g / 10; y := y + g * (ORD(s[p]) - 30H);
|
||||
INC(p);
|
||||
END;
|
||||
END;
|
||||
IF (s[p] = "D") OR (s[p] = "E") THEN
|
||||
INC(p); e := 0;
|
||||
IF s[p] = "-" THEN negE := TRUE; INC(p) ELSE negE := FALSE END;
|
||||
WHILE (s[p] = "0") DO INC(p) END;
|
||||
WHILE ("0" <= s[p]) & (s[p] <= "9") DO
|
||||
e := e * 10 + (ORD(s[p]) - 30H);
|
||||
INC(p);
|
||||
END;
|
||||
IF negE THEN y := y / Reals.Ten(e)
|
||||
ELSE y := y * Reals.Ten(e) END;
|
||||
END;
|
||||
IF neg THEN y := -y END;
|
||||
r := y;
|
||||
END StrToLongReal;
|
||||
|
||||
PROCEDURE Real*(VAR x: REAL);
|
||||
VAR
|
||||
str: ARRAY 16 OF CHAR;
|
||||
BEGIN
|
||||
Line(str);
|
||||
StrToReal(str, x);
|
||||
END Real;
|
||||
|
||||
PROCEDURE LongReal*(VAR y: LONGREAL);
|
||||
VAR
|
||||
str: ARRAY 16 OF CHAR;
|
||||
BEGIN
|
||||
Line(str);
|
||||
StrToLongReal(str, y);
|
||||
END LongReal;
|
||||
|
||||
|
||||
|
||||
BEGIN
|
||||
nextch := 0X;
|
||||
readstate := pending;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue