implemented In.Real and In.LongReal, unless it'll be implemented better.

This commit is contained in:
norayr 2017-06-21 20:45:58 +04:00
parent 5c86750aed
commit b5c76a0ee3

View file

@ -1,6 +1,6 @@
MODULE In; MODULE In;
IMPORT Platform, SYSTEM, Out; IMPORT Platform, SYSTEM, Reals, Out;
VAR VAR
Done-: BOOLEAN; Done-: BOOLEAN;
@ -99,14 +99,6 @@ VAR h: HUGEINT;
BEGIN HugeInt(h); i := SYSTEM.VAL(LONGINT, h) BEGIN HugeInt(h); i := SYSTEM.VAL(LONGINT, h)
END LongInt; 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); PROCEDURE Line*(VAR line: ARRAY OF CHAR);
VAR i: INTEGER; VAR i: INTEGER;
BEGIN StartRead; i := 0; Done := readstate = ready; 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 *) BEGIN HALT(99) (* Not implemented *)
END Name; 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 BEGIN
nextch := 0X; nextch := 0X;
readstate := pending; readstate := pending;