From: ceriel Date: Mon, 29 Jun 1987 12:27:50 +0000 (+0000) Subject: fixes X-Git-Tag: release-5-5~4063 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=b93c1cb093d0f685a6045ae904e758f8f695ad5e;p=ack.git fixes --- diff --git a/lang/m2/libm2/PascalIO.def b/lang/m2/libm2/PascalIO.def index 9664d6b74..87c500762 100644 --- a/lang/m2/libm2/PascalIO.def +++ b/lang/m2/libm2/PascalIO.def @@ -82,7 +82,7 @@ DEFINITION MODULE PascalIo; result in "card". Syntax: real --> [(+|-)] digit {digit} [. digit {digit}] - [ (e|E) [(+|-)] digit {digit} ] + [ E [(+|-)] digit {digit} ] If no real is read, or when overflow/underflow occurs, a runtime error results. Input stops at the character following the integer. diff --git a/lang/m2/libm2/PascalIO.mod b/lang/m2/libm2/PascalIO.mod index 72abf1dd6..ce859a27a 100644 --- a/lang/m2/libm2/PascalIO.mod +++ b/lang/m2/libm2/PascalIO.mod @@ -143,7 +143,8 @@ IMPLEMENTATION MODULE PascalIo; chk(inputtext, reading); WITH inputtext^ DO IF eof THEN - (* ??? trap here ??? *) + Traps.Message("unexpected EOF"); + HALT; END; IF cnt > maxcnt THEN dummy := FillBuf(inputtext); @@ -312,6 +313,15 @@ IMPLEMENTATION MODULE PascalIo; ch: CHAR; ok: BOOLEAN; index: INTEGER; + + PROCEDURE inch(): CHAR; + BEGIN + buf[index] := ch; + INC(index); + Get(inputtext); + RETURN NextCHAR(inputtext); + END inch; + BEGIN index := 0; WHILE NextCHAR(inputtext) IN spaces DO @@ -319,45 +329,30 @@ IMPLEMENTATION MODULE PascalIo; END; ch := NextCHAR(inputtext); IF (ch ='+') OR (ch = '-') THEN - buf[index] := ch; - INC(index); - Get(inputtext); - ch := NextCHAR(inputtext); + ch := inch(); END; IF (ch >= '0') AND (ch <= '9') THEN WHILE (ch >= '0') AND (ch <= '9') DO - buf[index] := ch; - INC(index); - Get(inputtext); - ch := NextCHAR(inputtext); + ch := inch(); END; IF (ch = '.') THEN + ch := inch(); IF (ch >= '0') AND (ch <= '9') THEN WHILE (ch >= '0') AND (ch <= '9') DO - buf[index] := ch; - INC(index); - Get(inputtext); - ch := NextCHAR(inputtext); + ch := inch(); END; ELSE ok := FALSE; END; END; IF ok AND (ch = 'E') THEN - Get(inputtext); - ch := NextCHAR(inputtext); + ch := inch(); IF (ch ='+') OR (ch = '-') THEN - buf[index] := ch; - INC(index); - Get(inputtext); - ch := NextCHAR(inputtext); + ch := inch(); END; IF (ch >= '0') AND (ch <= '9') THEN WHILE (ch >= '0') AND (ch <= '9') DO - buf[index] := ch; - INC(index); - Get(inputtext); - ch := NextCHAR(inputtext); + ch := inch(); END; ELSE ok := FALSE; @@ -411,7 +406,7 @@ IMPLEMENTATION MODULE PascalIo; width := SIZE(buf); END; IF nfrac > 0 THEN - RealConversions.RealToString(real, nfrac, width, buf, ok); + RealConversions.RealToString(real, width, nfrac, buf, ok); ELSE IF width < 9 THEN width := 9; END; IF real < 0.0 THEN @@ -419,7 +414,7 @@ IMPLEMENTATION MODULE PascalIo; ELSE digits := 6 - INTEGER(width); END; - RealConversions.RealToString(real, digits, width, buf, ok); + RealConversions.RealToString(real, width, digits, buf, ok); END; WriteSTRING(outputtext, buf, 0); END WriteREAL; diff --git a/lang/m2/libm2/RealConver.mod b/lang/m2/libm2/RealConver.mod index 063c52aeb..9c0522e74 100644 --- a/lang/m2/libm2/RealConver.mod +++ b/lang/m2/libm2/RealConver.mod @@ -26,7 +26,6 @@ IMPLEMENTATION MODULE RealConversions; BEGIN r := arg; - DEC(width); IF digits < 0 THEN ecvtflag := TRUE; ndigits := -digits; @@ -34,7 +33,9 @@ IMPLEMENTATION MODULE RealConversions; ecvtflag := FALSE; ndigits := digits; END; - IF HIGH(str) < ndigits + 3 THEN str[0] := 0C; ok := FALSE; RETURN END; + IF (HIGH(str) < ndigits + 3) THEN + str[0] := 0C; ok := FALSE; RETURN + END; pointpos := 0; sign := r < 0.0D; IF sign THEN r := -r END; @@ -124,7 +125,6 @@ IMPLEMENTATION MODULE RealConversions; END; END; END; - str[ind1] := 0C; IF ecvtflag THEN FOR i := ind1 TO 2 BY -1 DO str[i] := str[i-1]; @@ -185,11 +185,15 @@ IMPLEMENTATION MODULE RealConversions; INC(ind1); END; END; - IF ind1 > CARDINAL(width) THEN + IF (ind1+1) <= HIGH(str) THEN str[ind1+1] := 0C; END; + IF ind1 >= CARDINAL(width) THEN ok := FALSE; RETURN; END; - IF ind1 < CARDINAL(width) THEN + IF width > 0 THEN + DEC(width); + END; + IF (width > 0) AND (ind1 < CARDINAL(width)) THEN FOR i := ind1 TO 0 BY -1 DO str[i + CARDINAL(width) - ind1] := str[i]; END; @@ -197,8 +201,8 @@ IMPLEMENTATION MODULE RealConversions; str[i] := ' '; END; ind1 := CARDINAL(width); + IF (ind1+1) <= HIGH(str) THEN str[ind1+1] := 0C; END; END; - IF (ind1+1) <= HIGH(str) THEN str[ind1+1] := 0C; END; END LongRealToString;