From f2e15511a06bc9e7d2701523711e2e529e729ae3 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Wed, 18 Feb 2015 16:51:40 +0400 Subject: [PATCH] got rid of ecvt completely. reals.mod and texts test updated. -- noch Former-commit-id: 606c23d096d614f94f3bfa6cbccf11f073d1695b --- src/lib/v4/x86_64/Reals.Mod | 110 +++++++++++++++++++--- src/test/texts/testTexts.Mod | 6 ++ voc.REMOVED.git-id | 2 +- vocstatic.linux.gcc.x86_64.REMOVED.git-id | 2 +- 4 files changed, 106 insertions(+), 14 deletions(-) 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.REMOVED.git-id b/voc.REMOVED.git-id index 72555def..617b79d7 100644 --- a/voc.REMOVED.git-id +++ b/voc.REMOVED.git-id @@ -1 +1 @@ -f550c8541ce96f1ac0d6abc73b1a4fa2025e878e \ No newline at end of file +7ce73aa13bfab8e21eda71e0e351d5d5395e6bd3 \ No newline at end of file diff --git a/vocstatic.linux.gcc.x86_64.REMOVED.git-id b/vocstatic.linux.gcc.x86_64.REMOVED.git-id index 5a128c2e..617b79d7 100644 --- a/vocstatic.linux.gcc.x86_64.REMOVED.git-id +++ b/vocstatic.linux.gcc.x86_64.REMOVED.git-id @@ -1 +1 @@ -4d768c90746d68b61cd2ee1294d42f21190a43e6 \ No newline at end of file +7ce73aa13bfab8e21eda71e0e351d5d5395e6bd3 \ No newline at end of file