mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 20:22:24 +00:00
got rid of ecvt completely. reals.mod and texts test updated. -- noch
This commit is contained in:
parent
6865671d76
commit
606c23d096
4 changed files with 104 additions and 12 deletions
|
|
@ -2,7 +2,7 @@ MODULE Reals;
|
||||||
(* JT, 5.2.90 / RC 9.12.91 conversion between reals and strings for HP-700, MB 9.12.91, JT for Ofront, 16.3. 95*)
|
(* JT, 5.2.90 / RC 9.12.91 conversion between reals and strings for HP-700, MB 9.12.91, JT for Ofront, 16.3. 95*)
|
||||||
|
|
||||||
IMPORT S := SYSTEM;
|
IMPORT S := SYSTEM;
|
||||||
(*
|
(* getting rid of ecvt -- noch
|
||||||
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
||||||
"(LONGINT)ecvt (x, ndigit, decpt, sign)";
|
"(LONGINT)ecvt (x, ndigit, decpt, sign)";
|
||||||
*)
|
*)
|
||||||
|
|
@ -56,26 +56,112 @@ MODULE Reals;
|
||||||
S.PUT(S.ADR(x)+4, h)
|
S.PUT(S.ADR(x)+4, h)
|
||||||
END SetExpoL;
|
END SetExpoL;
|
||||||
|
|
||||||
|
PROCEDURE Reverse0 (VAR str : ARRAY OF CHAR; start, end : INTEGER);
|
||||||
|
(* Reverses order of characters in the interval [start..end]. *)
|
||||||
|
VAR
|
||||||
|
h : CHAR;
|
||||||
|
BEGIN
|
||||||
|
WHILE start < end DO
|
||||||
|
h := str[start]; str[start] := str[end]; str[end] := h;
|
||||||
|
INC(start); DEC(end)
|
||||||
|
END
|
||||||
|
END Reverse0;
|
||||||
|
(* these functions ⇅ necessary to get rid of ecvt -- noch *)
|
||||||
|
PROCEDURE IntToStr*(int: LONGINT; VAR str: ARRAY OF CHAR);
|
||||||
|
(* Converts the value of `int' to string form and copies the possibly truncated
|
||||||
|
result to `str'. *)
|
||||||
|
VAR
|
||||||
|
b : ARRAY 21 OF CHAR;
|
||||||
|
s, e: INTEGER;
|
||||||
|
maxLength : SHORTINT; (* maximum number of digits representing a LONGINT value *)
|
||||||
|
BEGIN
|
||||||
|
IF SIZE(LONGINT) = 4 THEN maxLength := 11 END;
|
||||||
|
IF SIZE(LONGINT) = 8 THEN maxLength := 20 END;
|
||||||
|
(* build representation in string 'b' *)
|
||||||
|
IF int = MIN(LONGINT) THEN (* smallest LONGINT, -int is an overflow *)
|
||||||
|
IF SIZE(LONGINT) = 4 THEN
|
||||||
|
b := "-2147483648";
|
||||||
|
e := 11
|
||||||
|
ELSE (* SIZE(LONGINT) = 8 *)
|
||||||
|
b := "-9223372036854775808";
|
||||||
|
e := 20
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
IF int < 0 THEN (* negative sign *)
|
||||||
|
b[0] := "-"; int := -int; s := 1
|
||||||
|
ELSE (* no sign *)
|
||||||
|
s := 0
|
||||||
|
END;
|
||||||
|
e := s; (* 's' holds starting position of string *)
|
||||||
|
REPEAT
|
||||||
|
b[e] := CHR(int MOD 10+ORD("0"));
|
||||||
|
int := int DIV 10;
|
||||||
|
INC(e)
|
||||||
|
UNTIL int = 0;
|
||||||
|
b[e] := 0X;
|
||||||
|
Reverse0(b, s, e-1);
|
||||||
|
END;
|
||||||
|
COPY(b, str) (* truncate output if necessary *)
|
||||||
|
END IntToStr;
|
||||||
|
|
||||||
PROCEDURE Convert*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
PROCEDURE Convert*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
||||||
VAR i, k: LONGINT;
|
VAR i, k: LONGINT;
|
||||||
BEGIN
|
BEGIN IF x < 0 THEN x := -x END;
|
||||||
i := ENTIER(x); k := 0;
|
i := ENTIER(x); k := 0;
|
||||||
WHILE k < n DO
|
WHILE k < n DO
|
||||||
d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k)
|
d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k)
|
||||||
END
|
END
|
||||||
END Convert;
|
END Convert;
|
||||||
|
(* experimental, -- noch
|
||||||
PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
PROCEDURE Convert0*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
||||||
VAR i, k: LONGINT;
|
VAR i, j, k: LONGINT;
|
||||||
|
str : ARRAY 32 OF CHAR;
|
||||||
BEGIN
|
BEGIN
|
||||||
i := ENTIER(x); k := 0;
|
(* IF x = MIN(LONGREAL) THEN x := MAX(LONGREAL) END;*)
|
||||||
WHILE k < n DO
|
IF x < 0 THEN x := -x END;
|
||||||
d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k)
|
i := ENTIER(x);
|
||||||
END
|
IF i < 0 THEN i := -i END;
|
||||||
END ConvertL;
|
IntToStr(i, str);
|
||||||
(*
|
IF n >= LEN(d) THEN n := SHORT(LEN(d)) - 1 END;
|
||||||
|
d[n] := 0X;
|
||||||
|
j := n - 1 ;
|
||||||
|
IF j < 0 THEN j := 0 END;
|
||||||
|
k := 0;
|
||||||
|
REPEAT
|
||||||
|
d[j] := str[k];
|
||||||
|
DEC(j);
|
||||||
|
INC(k);
|
||||||
|
UNTIL (str[k] = 0X) OR (j < 0);
|
||||||
|
|
||||||
|
WHILE j >= 0 DO d[j] := "0"; DEC(j) END ;
|
||||||
|
END Convert0;
|
||||||
|
*)
|
||||||
|
(* this seem to work -- noch *)
|
||||||
PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
||||||
VAR decpt, sign, i: LONGINT; buf: LONGINT;
|
VAR i, j, k: LONGINT;
|
||||||
|
str : ARRAY 32 OF CHAR;
|
||||||
|
BEGIN
|
||||||
|
(* IF x = MIN(LONGREAL) THEN x := MAX(LONGREAL) END;*)
|
||||||
|
IF x < 0 THEN x := -x END;
|
||||||
|
i := ENTIER(x);
|
||||||
|
IF i < 0 THEN i := -i END;
|
||||||
|
IntToStr(i, str);
|
||||||
|
IF n >= LEN(d) THEN n := SHORT(LEN(d)) - 1 END;
|
||||||
|
d[n] := 0X;
|
||||||
|
j := n - 1 ;
|
||||||
|
IF j < 0 THEN j := 0 END;
|
||||||
|
k := 0;
|
||||||
|
REPEAT
|
||||||
|
d[j] := str[k];
|
||||||
|
DEC(j);
|
||||||
|
INC(k);
|
||||||
|
UNTIL (str[k] = 0X) OR (j < 0);
|
||||||
|
|
||||||
|
WHILE j >= 0 DO d[j] := "0"; DEC(j) END ;
|
||||||
|
END ConvertL;
|
||||||
|
(* getting rid of ecvt -- noch
|
||||||
|
PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
||||||
|
VAR decpt, sign: INTEGER; i: LONGINT; buf: LONGINT;
|
||||||
BEGIN
|
BEGIN
|
||||||
(*x := x - 0.5; already rounded in ecvt*)
|
(*x := x - 0.5; already rounded in ecvt*)
|
||||||
buf := ecvt(x, n+2, S.ADR(decpt), S.ADR(sign));
|
buf := ecvt(x, n+2, S.ADR(decpt), S.ADR(sign));
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,8 @@ MODULE testTexts;
|
||||||
|
|
||||||
IMPORT Texts, Console;
|
IMPORT Texts, Console;
|
||||||
|
|
||||||
|
CONST pi = -311.1415;
|
||||||
|
|
||||||
VAR W : Texts.Writer;
|
VAR W : Texts.Writer;
|
||||||
T : Texts.Text;
|
T : Texts.Text;
|
||||||
R : Texts.Reader;
|
R : Texts.Reader;
|
||||||
|
|
@ -16,7 +18,11 @@ Texts.OpenWriter (W);
|
||||||
|
|
||||||
Texts.WriteString(W, "aaa");
|
Texts.WriteString(W, "aaa");
|
||||||
Texts.WriteLn(W);
|
Texts.WriteLn(W);
|
||||||
|
Texts.WriteReal(W, pi, 7);
|
||||||
Texts.WriteLn(W);
|
Texts.WriteLn(W);
|
||||||
|
Texts.WriteRealFix(W, pi, 0, 7);
|
||||||
|
Texts.WriteLn(W);
|
||||||
|
Texts.WriteLongReal(W, pi, 7);
|
||||||
Texts.WriteLn(W);
|
Texts.WriteLn(W);
|
||||||
NEW(T); Texts.Open(T, "test.txt");
|
NEW(T); Texts.Open(T, "test.txt");
|
||||||
|
|
||||||
|
|
|
||||||
BIN
voc
BIN
voc
Binary file not shown.
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue