Переглянути джерело

use SIZE

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8115 8c9fc860-2736-0410-a75d-ab315db34111
eth.metacore 7 роки тому
батько
коміт
a1637a20c5
2 змінених файлів з 33 додано та 17 видалено
  1. 13 13
      source/Files64.Mod
  2. 20 4
      source/Streams64.Mod

+ 13 - 13
source/Files64.Mod

@@ -465,7 +465,7 @@ END OpenWriter;
 (** Split fullname = ( prefix ":" name ) into prefix and name *)
 
 PROCEDURE SplitName*(fullname: ARRAY OF CHAR; VAR prefix, name: ARRAY OF CHAR);
-VAR i, j, len: LONGINT;
+VAR i, j, len: SIZE;
 BEGIN
 	i := 0; WHILE (fullname[i] # ":") & (fullname[i] # 0X) DO INC(i) END;
 	IF (fullname[i] # ":") OR (i >= LEN(prefix)) THEN
@@ -482,7 +482,7 @@ END SplitName;
 (** Join prefix and name to fullname = ( prefix ":" name ) *)
 
 PROCEDURE JoinName*(prefix, name: ARRAY OF CHAR; VAR fullname: ARRAY OF CHAR);
-VAR i, j, len: LONGINT;
+VAR i, j, len: SIZE;
 BEGIN
 	len := LEN(fullname)-1;
 	i := 0; WHILE (i < len) & (prefix[i] # 0X) DO fullname[i] := prefix[i]; INC(i) END;
@@ -494,7 +494,7 @@ END JoinName;
 (** Split a pathname at the last PathDelimiter or ":" into path and filename = ( {path (PathDelimiter|":")} filename ) *)
 
 PROCEDURE SplitPath*(pathname: ARRAY OF CHAR; VAR path, name: ARRAY OF CHAR);
-VAR i,j,len: LONGINT;
+VAR i, j, len: SIZE;
 BEGIN
 	i := 0; j := -1;
 	WHILE pathname[i] # 0X DO
@@ -514,7 +514,7 @@ END SplitPath;
 (** Join path and file name = ( path PathDelimiter name ) *)
 
 PROCEDURE JoinPath*(path, name: ARRAY OF CHAR; VAR pathname: ARRAY OF CHAR);
-VAR i,j,len: LONGINT;
+VAR i, j, len: SIZE;
 BEGIN
 	len := LEN(pathname)-1;
 	i := 0; WHILE (i < len) & (path[i] # 0X) DO pathname[i] := path[i]; INC(i) END;
@@ -526,14 +526,14 @@ END JoinPath;
 (** Split a filename at the last '.' into name and extension = ( name "." extension ) *)
 
 PROCEDURE SplitExtension*(filename: ARRAY OF CHAR; VAR name, extension: ARRAY OF CHAR);
-VAR i,j,len: LONGINT;
+VAR i, j, len: SIZE;
 BEGIN
-	i := 0; j := -1;
+	i := 0; j := 0;
 	WHILE filename[i] # 0X DO
 		IF filename[i] = "." THEN j := i END;
 		INC(i)
 	END;
-	IF (j = -1) THEN (* no extension *)
+	IF (j = 0) & (filename[0] # ".") THEN (* no extension *)
 		COPY(filename, name); COPY("", extension)
 	ELSE
 		i := 0; len := LEN(name)-1;
@@ -547,7 +547,7 @@ END SplitExtension;
 (** Join name and extension = ( name "." extension ) *)
 
 PROCEDURE JoinExtension*(name, extension: ARRAY OF CHAR; VAR filename: ARRAY OF CHAR);
-VAR i,j,len: LONGINT;
+VAR i,j,len: SIZE;
 BEGIN
 	len := LEN(filename)-1;
 	i := 0; WHILE (i < len) & (name[i] # 0X) DO filename[i] := name[i]; INC(i) END;
@@ -560,7 +560,7 @@ END JoinExtension;
 (** Append the path delimiter to path if path does not contain one *)
 
 PROCEDURE ForceTrailingDelimiter*(VAR path: ARRAY OF CHAR);
-VAR i: LONGINT;
+VAR i: SIZE;
 BEGIN
 	i := 0; WHILE path[i] # 0X DO INC(i) END;
 	IF (i = 0) OR (path[i-1] # PathDelimiter) THEN
@@ -1111,7 +1111,7 @@ BEGIN
 END ReadLReal;
 
 PROCEDURE ReadString*(VAR r: Rider; VAR x: ARRAY OF CHAR);
-VAR i: LONGWORD; ch: CHAR; f: File;
+VAR i: SIZE; ch: CHAR; f: File;
 BEGIN
 	i := 0; f := r.file;
 	LOOP
@@ -1214,7 +1214,7 @@ END WriteNum;
 (** Append first string to second string, truncating on overflow. *)
 
 PROCEDURE AppendStr*(from: ARRAY OF CHAR; VAR to: ARRAY OF CHAR);
-VAR i, j, m: LONGINT;
+VAR i, j, m: SIZE;
 BEGIN
 	j := 0; WHILE to[j] # 0X DO INC(j) END;
 	m := LEN(to)-1;
@@ -1225,7 +1225,7 @@ END AppendStr;
 (** Append unsigned integer to string in ASCII format. *)
 
 PROCEDURE AppendInt*(x: LONGINT; VAR to: ARRAY OF CHAR);
-VAR i, m: LONGINT;
+VAR i: SIZE; m: LONGINT;
 BEGIN
 	ASSERT(x >= 0);
 	i := 0; WHILE to[i] # 0X DO INC(i) END;
@@ -1244,7 +1244,7 @@ END AppendInt;
 
 (** Get the dev#part string from the stream *)
 PROCEDURE GetDevPart*(arg : Streams.Reader; VAR deviceName : ARRAY OF CHAR; VAR partition : LONGINT);
-VAR i : LONGINT; ch : CHAR;
+VAR i: SIZE; ch : CHAR;
 BEGIN
 	arg.SkipWhitespace;
 	deviceName := ""; partition := 0;

+ 20 - 4
source/Streams64.Mod

@@ -220,6 +220,13 @@ TYPE
 			Char( CHR( x MOD 128 ) )
 		END RawNum;
 
+	(** Write a size in a compressed format. *)
+		PROCEDURE RawSize*( x: SIZE );
+		BEGIN
+			WHILE (x < -64) OR (x > 63) DO Char( CHR( x MOD 128 + 128 ) );  x := x DIV 128 END;
+			Char( CHR( x MOD 128 ) )
+		END RawSize;
+
 		(** -- Write formatted data -- *)
 
 	(** Write an ASCII end-of-line (CR/LF). *)
@@ -381,7 +388,7 @@ TYPE
 
 
 	(** Write LONGREAL x  using n character positions. *)
-		PROCEDURE Float*( x: LONGREAL;  n: LONGINT );
+		PROCEDURE Float*( x: LONGREAL;  n: WORD );
 		(* BM 1993.4.22. Do not simplify rounding! *)
 		VAR e, h, l, i: LONGINT;  z: LONGREAL;
 			d: ARRAY 16 OF CHAR;
@@ -422,7 +429,7 @@ TYPE
 		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). *)
-		PROCEDURE FloatFix*( x: LONGREAL;  n, f, D: LONGINT );
+		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;
 			d: ARRAY 16 OF CHAR;
@@ -761,6 +768,15 @@ TYPE
 			x := ASH( LSH( LONGINT( ORD( ch ) ), 25 ), n - 25 ) + y
 		END RawNum;
 
+	(** Read a size in a compressed format. *)
+		PROCEDURE RawSize*( VAR x: SIZE );
+		VAR ch: CHAR;  n, y: SIZE;
+		BEGIN
+			n := 0;  y := 0;  ch := Get();
+			WHILE ch >= 80X DO INC( y, LSH( SIZE( ORD( ch ) ) - 128, n ) );  INC( n, 7 );  ch := Get() END;
+			x := ASH( LSH( SIZE( ORD( ch ) ), SIZE OF SIZE * 8 - 7 ), n - SIZE OF SIZE * 8 - 7 ) + y
+		END RawSize;
+
 		(** -- Read formatted data (uses Peek for one character lookahead) -- *)
 
 	 (** Read an integer value in decimal or hexadecimal.  If hex = TRUE, recognize the "H" postfix for hexadecimal numbers. *)
@@ -907,7 +923,7 @@ TYPE
 
 	(** Read a token, consisting of any string of characters terminated by space, TAB or EOLN. *)
 		PROCEDURE Token*( VAR token: ARRAY OF CHAR );
-		VAR j, max: LONGWORD;  ch: CHAR;
+		VAR j, max: SIZE;  ch: CHAR;
 		BEGIN
 			j := 0;  max := LEN( token ) - 1;
 			LOOP
@@ -921,7 +937,7 @@ TYPE
 
 	(** Read an optionally "" or '' enquoted string.  Will not read past the end of a line. *)
 		PROCEDURE String*( VAR string: ARRAY OF CHAR );
-		VAR c, delimiter: CHAR;  i, len: LONGWORD;
+		VAR c, delimiter: CHAR;  i, len: SIZE;
 		BEGIN
 			c := Peek();
 			IF (c # "'") & (c # '"') THEN Token( string )