浏览代码

revert to old version

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8357 8c9fc860-2736-0410-a75d-ab315db34111
eth.guenter 6 年之前
父节点
当前提交
743f5f4dfe
共有 1 个文件被更改,包括 9 次插入25 次删除
  1. 9 25
      source/Streams.Mod

+ 9 - 25
source/Streams.Mod

@@ -390,19 +390,12 @@ TYPE
 			END
 		END Date822;
 
-		PROCEDURE Append( VAR str: ARRAY OF CHAR; c: CHAR );
-		VAR i: LONGINT;
-		BEGIN
-			WHILE str[i] # 0X DO  INC( i )  END;
-			str[i] := c; str[i+1] := 0X
-		END Append;
 
 	(** Write LONGREAL x  using n character positions. *)
 		PROCEDURE Float*( x: LONGREAL;  n: WORD );
 		(* BM 1993.4.22. Do not simplify rounding! *)
-		VAR e, h, l, i, le, ndigits: LONGINT;  z: LONGREAL;
-			d, exp: ARRAY 24 OF CHAR;
-			neg: BOOLEAN;
+		VAR e, h, l, i: LONGINT;  z: LONGREAL;
+			d: ARRAY 16 OF CHAR;
 		BEGIN
 			e := ExpoL( x );
 			IF e = 2047 THEN
@@ -413,7 +406,9 @@ TYPE
 				ELSE String("  INF" )
 				END
 			ELSE
-				IF (e # 0) & (x < 0) THEN  x := -x; neg := TRUE  ELSE  neg := FALSE  END;
+				IF n <= 9 THEN n := 1 ELSE DEC( n, 8 ) END;
+				REPEAT Char( " " );  DEC( n ) UNTIL n <= 15;   (* 0 <= n <= 15 fraction digits *)
+				IF (e # 0) & (x < 0) THEN Char( "-" );  x := -x ELSE Char( " " ) END;
 				IF e = 0 THEN
 					h := 0;  l := 0 (* no denormals *)
 				ELSE
@@ -427,28 +422,17 @@ TYPE
 					END;
 					x := x * Ten( 7 );  h := ENTIER( x );  x := (x - h) * Ten( 8 );  l := ENTIER( x )
 				END;
-				IF e = 0 THEN  exp := "";  le := 0
-				ELSE
-					IF e < 0 THEN  exp := "E-";  e := -e  ELSE  exp := "E+"  END;  le := 2; 
-					IF e >= 100 THEN  Append( exp, CHR( e DIV 100 + ORD( '0' ) ) );  INC( le );  e := e MOD 100  END;
-					IF (le > 2) OR (e >= 10) THEN  Append( exp, CHR( e DIV 10 + ORD( '0' ) ) ); INC( le )  END;
-					Append( exp, CHR( e MOD 10 + ORD( '0' ) ) ); INC( le )
-				END;
-				IF neg THEN  INC( le )  END;
-				IF n < 10 THEN  ndigits := 7 ELSE  ndigits := 15  END;
-				WHILE n > ndigits+le+1 DO  Char( ' ' );  DEC( n ) END;	
-				IF neg THEN  Char( '-' )  END;
 				i := 15;
 				WHILE i > 7 DO d[i] := CHR( l MOD 10 + ORD( "0" ) );  l := l DIV 10;  DEC( i ) END;
 				WHILE i >= 0 DO d[i] := CHR( h MOD 10 + ORD( "0" ) );  h := h DIV 10;  DEC( i ) END;
 				Char( d[0] );  Char( "." );  i := 1;
-				WHILE i < ndigits DO  Char( d[i] );  INC( i )  END;
-				String( exp )
+				WHILE i <= n DO Char( d[i] );  INC( i ) END;
+				IF e < 0 THEN String( "E-" );  e := -e ELSE String( "E+" ) END;
+				Char( CHR( e DIV 100 + ORD( "0" ) ) );  e := e MOD 100;  Char( CHR( e DIV 10 + ORD( "0" ) ) );  Char( CHR( e MOD 10 + ORD( "0" ) ) )
 			END
 		END Float;
 
-	(** Write LONGREAL x in a fixed point notation. n is the overall minimal length for the output field, 
-		f the number of fraction digits following the decimal point, D the fixed exponent (printed only when D # 0). *)
+	(** Write LONGREAL x in a fixed point notation. n is the overall minimal length for the output field, f the number of fraction digits following the decimal point, D the fixed exponent (printed only when D # 0). *)
 		PROCEDURE FloatFix*( x: LONGREAL;  n, f, D: WORD );
 		(* BM 1993.4.22. Do not simplify rounding! / JG formatting adjusted *)
 		VAR e, h, l, i: LONGINT;  r, z: LONGREAL;