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
Former-commit-id: 606c23d096
This commit is contained in:
parent
5810271f0c
commit
f2e15511a0
4 changed files with 106 additions and 14 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*)
|
||||
|
||||
IMPORT S := SYSTEM;
|
||||
(*
|
||||
(* getting rid of ecvt -- noch
|
||||
PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT
|
||||
"(LONGINT)ecvt (x, ndigit, decpt, sign)";
|
||||
*)
|
||||
|
|
@ -56,26 +56,112 @@ MODULE Reals;
|
|||
S.PUT(S.ADR(x)+4, h)
|
||||
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);
|
||||
VAR i, k: LONGINT;
|
||||
BEGIN
|
||||
BEGIN IF x < 0 THEN x := -x END;
|
||||
i := ENTIER(x); k := 0;
|
||||
WHILE k < n DO
|
||||
d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k)
|
||||
END
|
||||
END Convert;
|
||||
|
||||
PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
||||
VAR i, k: LONGINT;
|
||||
(* experimental, -- noch
|
||||
PROCEDURE Convert0*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR);
|
||||
VAR i, j, k: LONGINT;
|
||||
str : ARRAY 32 OF CHAR;
|
||||
BEGIN
|
||||
i := ENTIER(x); k := 0;
|
||||
WHILE k < n DO
|
||||
d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k)
|
||||
END
|
||||
END ConvertL;
|
||||
(*
|
||||
(* 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 Convert0;
|
||||
*)
|
||||
(* this seem to work -- noch *)
|
||||
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
|
||||
(*x := x - 0.5; already rounded in ecvt*)
|
||||
buf := ecvt(x, n+2, S.ADR(decpt), S.ADR(sign));
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@ MODULE testTexts;
|
|||
|
||||
IMPORT Texts, Console;
|
||||
|
||||
CONST pi = -311.1415;
|
||||
|
||||
VAR W : Texts.Writer;
|
||||
T : Texts.Text;
|
||||
R : Texts.Reader;
|
||||
|
|
@ -16,7 +18,11 @@ Texts.OpenWriter (W);
|
|||
|
||||
Texts.WriteString(W, "aaa");
|
||||
Texts.WriteLn(W);
|
||||
Texts.WriteReal(W, pi, 7);
|
||||
Texts.WriteLn(W);
|
||||
Texts.WriteRealFix(W, pi, 0, 7);
|
||||
Texts.WriteLn(W);
|
||||
Texts.WriteLongReal(W, pi, 7);
|
||||
Texts.WriteLn(W);
|
||||
NEW(T); Texts.Open(T, "test.txt");
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
f550c8541ce96f1ac0d6abc73b1a4fa2025e878e
|
||||
7ce73aa13bfab8e21eda71e0e351d5d5395e6bd3
|
||||
|
|
@ -1 +1 @@
|
|||
4d768c90746d68b61cd2ee1294d42f21190a43e6
|
||||
7ce73aa13bfab8e21eda71e0e351d5d5395e6bd3
|
||||
Loading…
Add table
Add a link
Reference in a new issue