Selaa lähdekoodia

Fixed issues

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7619 8c9fc860-2736-0410-a75d-ab315db34111
eth.metacore 7 vuotta sitten
vanhempi
commit
e2ade2b4ca
4 muutettua tiedostoa jossa 170 lisäystä ja 170 poistoa
  1. 6 6
      source/FSTools64.Mod
  2. 139 139
      source/RelativeFiles64.Mod
  3. 1 1
      source/Streams64.Mod
  4. 24 24
      source/Win32.HostFiles64.Mod

+ 6 - 6
source/FSTools64.Mod

@@ -225,7 +225,7 @@ BEGIN
 END SetDefault;
 
 (* using the NIST standard for Kibi, Mebi & Gibi: http://physics.nist.gov/cuu/Units/binary.html *)
-PROCEDURE WriteK( k: LONGINT; out : Streams.Writer);
+PROCEDURE WriteK( k: HUGEINT; out : Streams.Writer);
 VAR suffix: ARRAY 3 OF CHAR;
 BEGIN
 	IF k < 10*1024 THEN COPY("Ki", suffix)
@@ -289,8 +289,8 @@ VAR
 	string, pattern : ARRAY 256 OF CHAR;
 	enum : Files.Enumerator;
 	flags, fileflags : SET;
-	count, total : LONGINT;
-	time, date, size : LONGINT;
+	count: LONGINT; total : HUGEINT;
+	time, date: LONGINT; size : HUGEINT;
 	name : ARRAY MaxNameLen OF CHAR;
 	dt : Dates.DateTime;
 BEGIN
@@ -344,7 +344,7 @@ PROCEDURE EnumerateDirectory(
 	CONST arguments : ARRAY OF CHAR);
 VAR
 	name : Files.FileName;
-	flags : SET; time, date, size : LONGINT;
+	flags : SET; time, date: LONGINT; size : HUGEINT;
 	subDirEnum : Files.Enumerator;
 
 	PROCEDURE PrepareContext(context : Commands.Context; CONST currentFile, arguments : ARRAY OF CHAR);
@@ -856,7 +856,7 @@ PROCEDURE InsertFiles(CONST mask : ARRAY OF CHAR; VAR filelist : FileList; VAR i
 VAR
 	enum : Files.Enumerator;
 	fileflags : SET;
-	time, date, size : LONGINT;
+	time, date: LONGINT; size : HUGEINT;
 	name : ARRAY MaxNameLen OF CHAR;
 BEGIN
 	NEW(enum); enum.Open(mask, {});
@@ -955,7 +955,7 @@ PROCEDURE InsertFilesAndFixDestination(context : Commands.Context; CONST sourceM
 VAR
 	enum : Files.Enumerator;
 	fileflags : SET;
-	time, date, size : LONGINT;
+	time, date: LONGINT; size : HUGEINT;
 	name : ARRAY MaxNameLen OF CHAR;
 BEGIN
 	IF ~IsValidTargetMask(context, targetMask) THEN RETURN FALSE; END;

+ 139 - 139
source/RelativeFiles64.Mod

@@ -1,140 +1,140 @@
-MODULE RelativeFiles64;	(**  AUTHOR "fof"; PURPOSE "";  **)
-
-IMPORT Files := Files64,UTF8Strings;
-TYPE PathName=ARRAY 272 OF CHAR;
-
-	FileSystem = OBJECT(Files.FileSystem)
-	VAR relTo: PathName; fs: Files.FileSystem;
-
-		PROCEDURE &InitFileSystem*( relTo: ARRAY OF CHAR; fs: Files.FileSystem);
-		VAR ch: CHAR;i: LONGINT;
-		BEGIN
-			SELF.fs := fs;
-			INCL(flags,Files.NeedsPrefix);
-			i :=0; ch := 0X;
-			WHILE(relTo[i] # 0X) DO
-				ch := relTo[i];
-				INC(i);
-			END;
-			IF (ch = "/") & (i>1)  THEN relTo[i-1] := 0X END; (* remove ending "/" *)
-
-			IF fs.prefix # "" THEN
-				RemovePrefix(relTo);
-			END;
-
-			COPY(relTo,SELF.relTo);
-		END InitFileSystem;
-
-		PROCEDURE MakeRel(VAR name,new: ARRAY OF CHAR);
-		BEGIN
-			COPY(relTo,new);
-			RemovePrefix(name);
-			IF name[0] # "/" THEN  UTF8Strings.Append("/",new); END;
-			UTF8Strings.Append(name,new);
-		END MakeRel;
-
-		PROCEDURE New0 (name: ARRAY OF CHAR): Files.File;
-		VAR new: PathName;
-		BEGIN
-			MakeRel(name,new); RETURN fs.New0(new);
-		END New0;
-
-		PROCEDURE Old0 (name: ARRAY OF CHAR): Files.File;
-		VAR new: PathName;
-		BEGIN
-			(* Out.String("Old0, called with:"); Out.String(name); Out.Ln; *)
-			MakeRel(name,new);
-			(* Out.String("Old0, calling with:"); Out.String(new); Out.Ln; *)
-			RETURN fs.Old0(new);
-		END Old0;
-
-		PROCEDURE CreateDirectory0 (name: ARRAY OF CHAR;     VAR res: LONGINT);
-		VAR new: PathName;
-		BEGIN
-			MakeRel(name,new); fs.CreateDirectory0(new,res);
-		END CreateDirectory0;
-
-		PROCEDURE Delete0 (name: ARRAY OF CHAR;     VAR key, res: LONGINT);
-		VAR new: PathName;
-		BEGIN
-			MakeRel(name,new); fs.Delete0(new,key,res);
-		END Delete0;
-
-		PROCEDURE Enumerate0 (mask: ARRAY OF CHAR;     flags: SET;     enum: Files.Enumerator);
-		VAR new: PathName;
-		BEGIN
-			MakeRel(mask,new); 
-			fs.Enumerate0(new,flags,enum);
-		END Enumerate0;
-
-		PROCEDURE FileKey (name: ARRAY OF CHAR): LONGINT;
-		VAR new: PathName;
-		BEGIN
-			(*Out.String("FileKey, called with:"); Out.String(name); Out.Ln; *)
-			MakeRel(name,new);
-			(*Out.String("FileKey, calling with:"); Out.String(new); Out.Ln;*)
-			RETURN fs.FileKey(new);
-		END FileKey;
-
-		PROCEDURE RemoveDirectory0 (name: ARRAY OF CHAR;     force: BOOLEAN;     VAR key, res: LONGINT);
-		VAR new: PathName;
-		BEGIN
-			MakeRel(name,new);  fs.RemoveDirectory0(new,force,key,res);
-		END RemoveDirectory0;
-
-		PROCEDURE Rename0 (old, new: ARRAY OF CHAR;     f: Files.File;      VAR res: LONGINT);
-		VAR old1,new1: PathName;
-		BEGIN
-			MakeRel(old,old1); MakeRel(new,new1);fs.Rename0(old1,new1,f,res);
-		END Rename0;
-
-	END FileSystem;
-
-	PROCEDURE RemovePrefix(VAR name: ARRAY OF CHAR);
-	VAR i,j: LONGINT;
-	BEGIN
-		WHILE(name[i] # 0X) & (name[i] # ":") DO
-			INC(i);
-		END;
-		IF name[i] = ":" THEN
-			j := 0; INC(i);
-			WHILE(name[i] # 0X) DO
-				name[j] := name[i]; INC(i);INC(j);
-			END;
-			name[j] := 0X;
-		END;
-	END RemovePrefix;
-
-	(** NewFS - Create a new filesystem relative to a Windows path. does not protect paths higher than relTo! (xyz:/../../.. could be used) *)
-	PROCEDURE NewFS*(context : Files.Parameters);
-	VAR str,prefix,name: ARRAY 256 OF CHAR; fs: FileSystem; rel: Files.FileSystem; ft: Files.FileSystemTable;
-	BEGIN
-		IF context.arg.GetString(str) THEN
-			Files.SplitName(str,prefix,name);
-			IF prefix # "" THEN
-				rel := Files.This(prefix);
-			ELSE
-				Files.GetList(ft);
-				rel := ft[0];
-			END;
-			IF rel # NIL THEN
-				NEW(fs,str,rel);
-				Files.Add(fs, context.prefix);
-			ELSE
-				context.out.String("file system could not be found: "); context.out.String(str); context.out.Ln;
-			END;
-		END;
-	END NewFS;
-
-
-END RelativeFiles64.
-
-SystemTools.Free RelativeFiles64 ~
-
-FSTools64.Mount Work RelativeFiles64  ./ ~
-FSTools64.Unmount Test ~
-
-
-
-
+MODULE RelativeFiles64;	(**  AUTHOR "fof"; PURPOSE "";  **)
+
+IMPORT Files := Files64,UTF8Strings;
+TYPE PathName=ARRAY 272 OF CHAR;
+
+	FileSystem = OBJECT(Files.FileSystem)
+	VAR relTo: PathName; fs: Files.FileSystem;
+
+		PROCEDURE &InitFileSystem*( relTo: ARRAY OF CHAR; fs: Files.FileSystem);
+		VAR ch: CHAR;i: LONGINT;
+		BEGIN
+			SELF.fs := fs;
+			INCL(flags,Files.NeedsPrefix);
+			i :=0; ch := 0X;
+			WHILE(relTo[i] # 0X) DO
+				ch := relTo[i];
+				INC(i);
+			END;
+			IF (ch = "/") & (i>1)  THEN relTo[i-1] := 0X END; (* remove ending "/" *)
+
+			IF fs.prefix # "" THEN
+				RemovePrefix(relTo);
+			END;
+
+			COPY(relTo,SELF.relTo);
+		END InitFileSystem;
+
+		PROCEDURE MakeRel(VAR name,new: ARRAY OF CHAR);
+		BEGIN
+			COPY(relTo,new);
+			RemovePrefix(name);
+			IF name[0] # "/" THEN  UTF8Strings.Append("/",new); END;
+			UTF8Strings.Append(name,new);
+		END MakeRel;
+
+		PROCEDURE New0* (name: ARRAY OF CHAR): Files.File;
+		VAR new: PathName;
+		BEGIN
+			MakeRel(name,new); RETURN fs.New0(new);
+		END New0;
+
+		PROCEDURE Old0* (name: ARRAY OF CHAR): Files.File;
+		VAR new: PathName;
+		BEGIN
+			(* Out.String("Old0, called with:"); Out.String(name); Out.Ln; *)
+			MakeRel(name,new);
+			(* Out.String("Old0, calling with:"); Out.String(new); Out.Ln; *)
+			RETURN fs.Old0(new);
+		END Old0;
+
+		PROCEDURE CreateDirectory0* (name: ARRAY OF CHAR;     VAR res: LONGINT);
+		VAR new: PathName;
+		BEGIN
+			MakeRel(name,new); fs.CreateDirectory0(new,res);
+		END CreateDirectory0;
+
+		PROCEDURE Delete0* (name: ARRAY OF CHAR;     VAR key, res: LONGINT);
+		VAR new: PathName;
+		BEGIN
+			MakeRel(name,new); fs.Delete0(new,key,res);
+		END Delete0;
+
+		PROCEDURE Enumerate0* (mask: ARRAY OF CHAR;     flags: SET;     enum: Files.Enumerator);
+		VAR new: PathName;
+		BEGIN
+			MakeRel(mask,new); 
+			fs.Enumerate0(new,flags,enum);
+		END Enumerate0;
+
+		PROCEDURE FileKey* (name: ARRAY OF CHAR): LONGINT;
+		VAR new: PathName;
+		BEGIN
+			(*Out.String("FileKey, called with:"); Out.String(name); Out.Ln; *)
+			MakeRel(name,new);
+			(*Out.String("FileKey, calling with:"); Out.String(new); Out.Ln;*)
+			RETURN fs.FileKey(new);
+		END FileKey;
+
+		PROCEDURE RemoveDirectory0* (name: ARRAY OF CHAR;     force: BOOLEAN;     VAR key, res: LONGINT);
+		VAR new: PathName;
+		BEGIN
+			MakeRel(name,new);  fs.RemoveDirectory0(new,force,key,res);
+		END RemoveDirectory0;
+
+		PROCEDURE Rename0* (old, new: ARRAY OF CHAR;     f: Files.File;      VAR res: LONGINT);
+		VAR old1,new1: PathName;
+		BEGIN
+			MakeRel(old,old1); MakeRel(new,new1);fs.Rename0(old1,new1,f,res);
+		END Rename0;
+
+	END FileSystem;
+
+	PROCEDURE RemovePrefix(VAR name: ARRAY OF CHAR);
+	VAR i,j: LONGINT;
+	BEGIN
+		WHILE(name[i] # 0X) & (name[i] # ":") DO
+			INC(i);
+		END;
+		IF name[i] = ":" THEN
+			j := 0; INC(i);
+			WHILE(name[i] # 0X) DO
+				name[j] := name[i]; INC(i);INC(j);
+			END;
+			name[j] := 0X;
+		END;
+	END RemovePrefix;
+
+	(** NewFS - Create a new filesystem relative to a Windows path. does not protect paths higher than relTo! (xyz:/../../.. could be used) *)
+	PROCEDURE NewFS*(context : Files.Parameters);
+	VAR str,prefix,name: ARRAY 256 OF CHAR; fs: FileSystem; rel: Files.FileSystem; ft: Files.FileSystemTable;
+	BEGIN
+		IF context.arg.GetString(str) THEN
+			Files.SplitName(str,prefix,name);
+			IF prefix # "" THEN
+				rel := Files.This(prefix);
+			ELSE
+				Files.GetList(ft);
+				rel := ft[0];
+			END;
+			IF rel # NIL THEN
+				NEW(fs,str,rel);
+				Files.Add(fs, context.prefix);
+			ELSE
+				context.out.String("file system could not be found: "); context.out.String(str); context.out.Ln;
+			END;
+		END;
+	END NewFS;
+
+
+END RelativeFiles64.
+
+SystemTools.Free RelativeFiles64 ~
+
+FSTools64.Mount Work RelativeFiles64  ./ ~
+FSTools64.Unmount Test ~
+
+
+
+
 System.Directory src:/*

+ 1 - 1
source/Streams64.Mod

@@ -508,7 +508,7 @@ TYPE
 			tail := LONGINT( pos );  sent := 0;  res := Ok;
 		END SetPos;
 
-		PROCEDURE Update;
+		PROCEDURE Update*;
 		(* nothing to do *)
 		END Update;
 

+ 24 - 24
source/Win32.HostFiles64.Mod

@@ -149,55 +149,55 @@ TYPE
 			SELF.fs := winFS;  useprefix := TRUE;  INCL( flags, Files.NeedsPrefix );
 		END Init;
 
-		PROCEDURE New0( name: ARRAY OF CHAR ): Files.File;
+		PROCEDURE New0*( name: ARRAY OF CHAR ): Files.File;
 		VAR fname: FileName;  f: Files.File;
 		BEGIN
 			Prefix( name, fname ); f := fs.New0( fname ); IF f # NIL THEN  f.fs := SELF; END;  RETURN f;
 		END New0;
 
-		PROCEDURE Old0( name: ARRAY OF CHAR ): Files.File;
+		PROCEDURE Old0*( name: ARRAY OF CHAR ): Files.File;
 		VAR fname: FileName;   f: Files.File;
 		BEGIN
 			Prefix( name, fname );  f :=  fs.Old0( fname ); IF f # NIL THEN  f.fs := SELF; END; RETURN f;
 		END Old0;
 
-		PROCEDURE Delete0( name: ARRAY OF CHAR;  VAR key, res: LONGINT );
+		PROCEDURE Delete0*( name: ARRAY OF CHAR;  VAR key, res: LONGINT );
 		VAR fname: FileName;
 		BEGIN
 			Prefix( name, fname );  fs.Delete0( fname, key, res );
 		END Delete0;
 
-		PROCEDURE Rename0( old, new: ARRAY OF CHAR;  fold: Files.File;  VAR res: LONGINT );
+		PROCEDURE Rename0*( old, new: ARRAY OF CHAR;  fold: Files.File;  VAR res: LONGINT );
 		VAR old0, new0: FileName;
 		BEGIN
 			Prefix( old, old0 );  Prefix( new, new0 );  fs.Rename0( old0, new0, fold, res );
 		END Rename0;
 
-		PROCEDURE Enumerate0( mask: ARRAY OF CHAR;  flags: SET;  enum: Files.Enumerator );
+		PROCEDURE Enumerate0*( mask: ARRAY OF CHAR;  flags: SET;  enum: Files.Enumerator );
 		VAR fmask: FileName;
 		BEGIN
 			Prefix( mask, fmask );  fs.Enumerate1( fmask, flags, enum, useprefix );
 		END Enumerate0;
 
-		PROCEDURE FileKey( name: ARRAY OF CHAR ): LONGINT;
+		PROCEDURE FileKey*( name: ARRAY OF CHAR ): LONGINT;
 		VAR fname: FileName;
 		BEGIN
 			Prefix( name, fname );  RETURN fs.FileKey( fname );
 		END FileKey;
 
-		PROCEDURE CreateDirectory0( name: ARRAY OF CHAR;  VAR res: LONGINT );
+		PROCEDURE CreateDirectory0*( name: ARRAY OF CHAR;  VAR res: LONGINT );
 		VAR fname: FileName;
 		BEGIN
 			Prefix( name, fname );  fs.CreateDirectory0( fname, res );
 		END CreateDirectory0;
 
-		PROCEDURE RemoveDirectory0( name: ARRAY OF CHAR;  force: BOOLEAN;  VAR key, res: LONGINT );
+		PROCEDURE RemoveDirectory0*( name: ARRAY OF CHAR;  force: BOOLEAN;  VAR key, res: LONGINT );
 		VAR fname: FileName;
 		BEGIN
 			Prefix( name, fname );  fs.RemoveDirectory0( fname, force, key, res );
 		END RemoveDirectory0;
 
-		PROCEDURE Has(CONST name: ARRAY OF CHAR; VAR fullName: ARRAY OF CHAR; VAR flags: SET): BOOLEAN;
+		PROCEDURE Has*(CONST name: ARRAY OF CHAR; VAR fullName: ARRAY OF CHAR; VAR flags: SET): BOOLEAN;
 		VAR fname: FileName;
 		BEGIN
 			Prefix(name, fname );  RETURN fs.Has(fname, fullName, flags);
@@ -463,7 +463,7 @@ TYPE
 			fileSystem := fs
 		END Init;
 
-		PROCEDURE Set( VAR r: Files.Rider;  pos: HUGEINT );
+		PROCEDURE Set*( VAR r: Files.Rider;  pos: HUGEINT );
 		VAR size: HUGEINT;
 		BEGIN {EXCLUSIVE}
 			IF hfile # Kernel32.InvalidHandleValue THEN
@@ -477,7 +477,7 @@ TYPE
 			r.apos := pos DIV BufferSize;  r.bpos := LONGINT( pos MOD BufferSize )
 		END Set;
 
-		PROCEDURE Pos( VAR r: Files.Rider ): HUGEINT;
+		PROCEDURE Pos*( VAR r: Files.Rider ): HUGEINT;
 		BEGIN
 			RETURN r.apos * BufferSize + r.bpos
 		END Pos;
@@ -523,7 +523,7 @@ TYPE
 			ASSERT( res # 0 );  INC( fpos, n );  buffer.apos := apos;  buffer.len := n
 		END ReadBuffer;
 
-		PROCEDURE Read( VAR r: Files.Rider;  VAR x: CHAR );
+		PROCEDURE Read*( VAR r: Files.Rider;  VAR x: CHAR );
 		VAR pos: HUGEINT;
 		BEGIN {EXCLUSIVE}
 			pos := r.apos * BufferSize + r.bpos;
@@ -535,7 +535,7 @@ TYPE
 			END
 		END Read;
 
-		PROCEDURE ReadBytes( VAR r: Files.Rider;  VAR x: ARRAY OF CHAR;  ofs, len: LONGINT );
+		PROCEDURE ReadBytes*( VAR r: Files.Rider;  VAR x: ARRAY OF CHAR;  ofs, len: LONGINT );
 		VAR pos: HUGEINT; n: LONGINT;
 		BEGIN {EXCLUSIVE}
 			ASSERT( (ofs + len) <= LEN( x ) );
@@ -555,7 +555,7 @@ TYPE
 			r.res := len; r.eof := (pos > fsize) OR ((pos = fsize) & (len > 0));
 		END ReadBytes;
 
-		PROCEDURE Write( VAR r: Files.Rider;  x: CHAR );
+		PROCEDURE Write*( VAR r: Files.Rider;  x: CHAR );
 		VAR pos: HUGEINT;
 		BEGIN {EXCLUSIVE}
 			pos := r.apos * BufferSize + r.bpos;
@@ -567,7 +567,7 @@ TYPE
 			buffer.dirty := TRUE;
 		END Write;
 
-		PROCEDURE WriteBytes( VAR r: Files.Rider;  CONST x: ARRAY OF CHAR;  ofs, len: LONGINT );
+		PROCEDURE WriteBytes*( VAR r: Files.Rider;  CONST x: ARRAY OF CHAR;  ofs, len: LONGINT );
 		VAR pos: HUGEINT; n: LONGINT;
 		BEGIN {EXCLUSIVE}
 			IF len = 0 THEN RETURN END;
@@ -584,12 +584,12 @@ TYPE
 			END
 		END WriteBytes;
 
-		PROCEDURE Length( ): HUGEINT;
+		PROCEDURE Length*( ): HUGEINT;
 		BEGIN {EXCLUSIVE}
 			RETURN fsize
 		END Length;
 
-		PROCEDURE GetDate( VAR t, d: LONGINT );
+		PROCEDURE GetDate*( VAR t, d: LONGINT );
 		VAR ft, lft: Kernel32.FileTime;  st: Kernel32.SystemTime;  res: Kernel32.BOOL;
 		BEGIN {EXCLUSIVE}
 			res := Kernel32.GetFileTime( hfile, NIL , NIL , ft );
@@ -600,7 +600,7 @@ TYPE
 			t := LONG( st.wHour ) * 1000H + LONG( st.wMinute ) * 40H + LONG( st.wSecond )
 		END GetDate;
 
-		PROCEDURE SetDate( t, d: LONGINT );
+		PROCEDURE SetDate*( t, d: LONGINT );
 		VAR ft, lft: Kernel32.FileTime;  st: Kernel32.SystemTime;  res: Kernel32.BOOL; err: LONGINT;
 		BEGIN {EXCLUSIVE}
 			st.wDay := SHORT( d MOD 20H );  d := ASH( d, -5 );  st.wMonth := SHORT( d MOD 10H );  d := ASH( d, -4 );  st.wYear := SHORT( d MOD 80H ) + 1900;  st.wMilliseconds := 0;
@@ -610,21 +610,21 @@ TYPE
 			ASSERT( res # 0 )
 		END SetDate;
 
-		PROCEDURE GetAttributes(): SET;
+		PROCEDURE GetAttributes*(): SET;
 		VAR s: SET;
 		BEGIN
 			s := ToSet(Kernel32.GetFileAttributes( fname ));
 			RETURN FileFlags(s);
 		END GetAttributes;
 
-		PROCEDURE SetAttributes(a: SET);
+		PROCEDURE SetAttributes*(a: SET);
 		VAR s: SET;
 		BEGIN
 			s:= WindowsFlags(a);
 			SetFileAttributes(fname,s);
 		END SetAttributes;
 
-		PROCEDURE GetName( VAR name: ARRAY OF CHAR );
+		PROCEDURE GetName*( VAR name: ARRAY OF CHAR );
 		VAR i: LONGINT;  ch: CHAR;
 		BEGIN {EXCLUSIVE}
 			COPY( fname, name );  i := 0;  ch := name[0];
@@ -670,7 +670,7 @@ TYPE
 			RETURN TRUE;
 		END ToTemp;
 
-		PROCEDURE Register0( VAR res: LONGINT );
+		PROCEDURE Register0*( VAR res: LONGINT );
 		VAR F: File;  ret: Kernel32.BOOL;
 			from, to: ARRAY 256 OF CHAR;
 		BEGIN {EXCLUSIVE}
@@ -698,7 +698,7 @@ TYPE
 			ASSERT( hfile # Kernel32.InvalidHandleValue );  winFS.collection.Register( SELF );  res := 0
 		END Register0;
 
-		PROCEDURE Update;
+		PROCEDURE Update*;
 		BEGIN {EXCLUSIVE}
 			IF buffer.dirty THEN WriteBuffer() END
 		END Update;
@@ -724,7 +724,7 @@ TYPE
 			END
 		END Finalize;
 
-		PROCEDURE Close;
+		PROCEDURE Close*;
 		BEGIN
 			Finalize;
 			fileSystem.collection.oldFiles.Remove(SELF);