diff --git a/lang/m2/libm2/PascalIO.def b/lang/m2/libm2/PascalIO.def index a913466e3..e9db8a3ec 100644 --- a/lang/m2/libm2/PascalIO.def +++ b/lang/m2/libm2/PascalIO.def @@ -102,6 +102,9 @@ DEFINITION MODULE PascalIO; Input stops at the character following the real. *) + PROCEDURE ReadLongReal(InputText: Text; VAR Real: LONGREAL); + (* Like ReadReal, but for LONGREAL *) + (*************************************************************************** Output routines; All these routines result in a runtime error when not called with either @@ -149,4 +152,7 @@ DEFINITION MODULE PascalIO; Always use at least "Width" places, blank-padding to the left if needed. *) + PROCEDURE WriteLongReal(OutputText: Text; Real: LONGREAL; + Width, Nfrac: CARDINAL); + (* Like WriteReal, but for LONGREAL *) END PascalIO. diff --git a/lang/m2/libm2/PascalIO.mod b/lang/m2/libm2/PascalIO.mod index cbd99ddcc..07c11dbaf 100644 --- a/lang/m2/libm2/PascalIO.mod +++ b/lang/m2/libm2/PascalIO.mod @@ -272,6 +272,13 @@ IMPLEMENTATION MODULE PascalIO; END ReadCardinal; PROCEDURE ReadReal(InputText: Text; VAR real: REAL); + VAR x1: LONGREAL; + BEGIN + ReadLongReal(InputText, x1); + real := x1 + END ReadReal; + + PROCEDURE ReadLongReal(InputText: Text; VAR real: LONGREAL); VAR buf: numbuf; ch: CHAR; @@ -328,13 +335,13 @@ IMPLEMENTATION MODULE PascalIO; END; IF ok THEN buf[index] := 0C; - RealConversions.StringToReal(buf, real, ok); + RealConversions.StringToLongReal(buf, real, ok); END; IF NOT ok THEN Traps.Message("Illegal real"); HALT; END; - END ReadReal; + END ReadLongReal; PROCEDURE WriteCardinal(OutputText: Text; card: CARDINAL; width: CARDINAL); VAR @@ -362,6 +369,11 @@ IMPLEMENTATION MODULE PascalIO; END WriteBoolean; PROCEDURE WriteReal(OutputText: Text; real: REAL; width, nfrac: CARDINAL); + BEGIN + WriteLongReal(OutputText, LONG(real), width, nfrac) + END WriteReal; + + PROCEDURE WriteLongReal(OutputText: Text; real: LONGREAL; width, nfrac: CARDINAL); VAR buf: numbuf; ok: BOOLEAN; @@ -371,18 +383,18 @@ IMPLEMENTATION MODULE PascalIO; width := SIZE(buf); END; IF nfrac > 0 THEN - RealConversions.RealToString(real, width, nfrac, buf, ok); + RealConversions.LongRealToString(real, width, nfrac, buf, ok); ELSE IF width < 9 THEN width := 9; END; - IF real < 0.0 THEN + IF real < 0.0D THEN digits := 7 - INTEGER(width); ELSE digits := 6 - INTEGER(width); END; - RealConversions.RealToString(real, width, digits, buf, ok); + RealConversions.LongRealToString(real, width, digits, buf, ok); END; WriteString(OutputText, buf, 0); - END WriteReal; + END WriteLongReal; PROCEDURE WriteString(OutputText: Text; str: ARRAY OF CHAR; width: CARDINAL); VAR index: CARDINAL; diff --git a/lang/m2/libm2/RealInOut.def b/lang/m2/libm2/RealInOut.def index 5ab39ced8..b508d307c 100644 --- a/lang/m2/libm2/RealInOut.def +++ b/lang/m2/libm2/RealInOut.def @@ -19,18 +19,30 @@ DEFINITION MODULE RealInOut; DEL or BACKSPACE, depending on the implementation of ReadString. *) + PROCEDURE ReadLongReal(VAR x: LONGREAL); + (* Like ReadReal, but for LONGREAL *) + PROCEDURE WriteReal(x: REAL; n: CARDINAL); (* Write x using n characters. If fewer than n characters are needed, leading blanks are inserted. *) + PROCEDURE WriteLongReal(x: LONGREAL; n: CARDINAL); + (* Like WriteReal, but for LONGREAL *) + PROCEDURE WriteFixPt(x: REAL; n, k: CARDINAL); (* Write x in fixed-point notation usign n characters with k digits after the decimal point. If fewer than n characters are needed, leading blanks are inserted. *) + PROCEDURE WriteLongFixPt(x: LONGREAL; n, k: CARDINAL); + (* Like WriteFixPt, but for LONGREAL *) + PROCEDURE WriteRealOct(x: REAL); (* Write x in octal words. *) + + PROCEDURE WriteLongRealOct(x: LONGREAL); + (* Like WriteRealOct, but for LONGREAL *) END RealInOut. diff --git a/lang/m2/libm2/RealInOut.mod b/lang/m2/libm2/RealInOut.mod index 28ed945f6..3a09cf306 100644 --- a/lang/m2/libm2/RealInOut.mod +++ b/lang/m2/libm2/RealInOut.mod @@ -21,39 +21,56 @@ IMPLEMENTATION MODULE RealInOut; TYPE RBUF = ARRAY [0..MAXWIDTH+1] OF CHAR; PROCEDURE WriteReal(arg: REAL; ndigits: CARDINAL); + BEGIN + WriteLongReal(LONG(arg), ndigits) + END WriteReal; + + PROCEDURE WriteLongReal(arg: LONGREAL; ndigits: CARDINAL); VAR buf : RBUF; ok : BOOLEAN; BEGIN IF ndigits > MAXWIDTH THEN ndigits := MAXWIDTH; END; IF ndigits < 10 THEN ndigits := 10; END; - RealConversions.RealToString(arg, ndigits, -INTEGER(ndigits - 7), buf, ok); + RealConversions.LongRealToString(arg, ndigits, -INTEGER(ndigits - 7), buf, ok); InOut.WriteString(buf); - END WriteReal; + END WriteLongReal; PROCEDURE WriteFixPt(arg: REAL; n, k: CARDINAL); + BEGIN + WriteLongFixPt(LONG(arg), n, k) + END WriteFixPt; + + PROCEDURE WriteLongFixPt(arg: LONGREAL; n, k: CARDINAL); VAR buf: RBUF; ok : BOOLEAN; BEGIN IF n > MAXWIDTH THEN n := MAXWIDTH END; - RealConversions.RealToString(arg, n, k, buf, ok); + RealConversions.LongRealToString(arg, n, k, buf, ok); InOut.WriteString(buf); - END WriteFixPt; + END WriteLongFixPt; PROCEDURE ReadReal(VAR x: REAL); + VAR x1: LONGREAL; + BEGIN + ReadLongReal(x1); + x := x1 + END ReadReal; + + PROCEDURE ReadLongReal(VAR x: LONGREAL); VAR Buf: ARRAY[0..512] OF CHAR; ok: BOOLEAN; BEGIN InOut.ReadString(Buf); - RealConversions.StringToReal(Buf, x, ok); + RealConversions.StringToLongReal(Buf, x, ok); IF NOT ok THEN Traps.Message("real expected"); HALT; END; Done := TRUE; - END ReadReal; + END ReadLongReal; PROCEDURE wroct(x: ARRAY OF WORD); VAR i: CARDINAL; @@ -69,6 +86,11 @@ IMPLEMENTATION MODULE RealInOut; wroct(x); END WriteRealOct; + PROCEDURE WriteLongRealOct(x: LONGREAL); + BEGIN + wroct(x); + END WriteLongRealOct; + BEGIN Done := FALSE; END RealInOut.