diff --git a/src/lib/v4/x86_64/Reals.Mod b/src/lib/v4/x86_64/Reals.Mod index 0cf886b9..e47d14ae 100644 --- a/src/lib/v4/x86_64/Reals.Mod +++ b/src/lib/v4/x86_64/Reals.Mod @@ -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)); diff --git a/src/test/texts/testTexts.Mod b/src/test/texts/testTexts.Mod index d492737e..e0499e1c 100644 --- a/src/test/texts/testTexts.Mod +++ b/src/test/texts/testTexts.Mod @@ -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"); diff --git a/voc b/voc index f550c854..7ce73aa1 100755 Binary files a/voc and b/voc differ diff --git a/vocstatic.linux.gcc.x86_64 b/vocstatic.linux.gcc.x86_64 index 4d768c90..7ce73aa1 100755 Binary files a/vocstatic.linux.gcc.x86_64 and b/vocstatic.linux.gcc.x86_64 differ