소스 검색

fixed File.CreateUnixFile()

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7643 8c9fc860-2736-0410-a75d-ab315db34111
eth.guenter 7 년 전
부모
커밋
aa7d6ed498
1개의 변경된 파일41개의 추가작업 그리고 43개의 파일을 삭제
  1. 41 43
      source/Unix.UnixFiles.Mod

+ 41 - 43
source/Unix.UnixFiles.Mod

@@ -227,13 +227,11 @@ TYPE
 
 				PROCEDURE New0*( name: ARRAY OF CHAR ): Files.File;
 				VAR f: File; stat: Unix.Status;		
-					  res,err: LONGINT;
-					  path,nameonly: ARRAY 512 OF CHAR;
-				BEGIN {EXCLUSIVE}
-					(*AwaitFinalizingDone;*)
-					
+					  res, err: LONGINT;
+					  path, nameonly: ARRAY 512 OF CHAR;
+				BEGIN {EXCLUSIVE}					
 					(*first check if the path actually exits first using fstat. fstat returns -1 and sets erno to ENOENT when a component of the path doesn't exist or the entire path is empty*)
-					Files.SplitPath(name,path, nameonly);
+					Files.SplitPath( name, path, nameonly );
 					res:=Unix.stat( ADDRESSOF( path ), stat ) ;
 					err:=Unix.errno();
 					IF (name="") OR (path="") OR (res>=0) OR (err#Unix.ENOENT) THEN
@@ -545,7 +543,7 @@ TYPE
 					SELF.fs := fs;  flags := {};
 				END Init;
 
-				PROCEDURE OpenUnixFile;
+				PROCEDURE CreateUnixFile;
 				VAR 
 					stat: Unix.Status;  r: LONGINT;
 				BEGIN				
@@ -553,9 +551,10 @@ TYPE
 						GetTempName( registerName, workName )
 					ELSIF state = Closed THEN
 						IF registerName # "" THEN
+							(* shortcut renaming in Register0 *)
 							workName := registerName;  registerName := ""
-						ELSIF tempFile THEN
-							Halt( SELF, FALSE, "UnixFiles.File.OpenUnixFile: cannot reopen closed tempfile" )
+						ELSE
+							(* file has been finally closed *)  RETURN
 						END
 					END;
 					r := Unix.unlink( ADDRESSOF( workName ) );
@@ -566,19 +565,19 @@ TYPE
 						r := Unix.fstat( fd, stat );  
 						dev := stat.dev;  ino := stat.ino;  mtime := stat.mtime.sec;
 						state := Open;  fpos := 0;
-						IncOpenFiles();
-						collection.AddNew(SELF);
+						IncOpenFiles( );
+						collection.AddNew( SELF );
 					ELSE  
-						Halt( SELF, TRUE, "UnixFiles.File.OpenUnixFile: open failed" );
+						Halt( SELF, TRUE, "UnixFiles.File.CreateUnixFile: open failed" );
 					END
-				END OpenUnixFile;
+				END CreateUnixFile;
 				
 						
 				PROCEDURE Flush( buf: Buffer );
 				VAR res: LONGINT;  stat: Unix.Status;
 				BEGIN
 					IF buf.chg THEN
-						IF fd = NoDesc THEN  OpenUnixFile  END;
+						IF fd = NoDesc THEN  CreateUnixFile  END;
 						IF buf.org # fpos THEN  
 							IF Unix.lseek( fd, buf.org, 0 ) = -1 THEN
 								Halt( SELF, TRUE, "UnixFiles.File.Flush: lseek failed" ) 
@@ -623,7 +622,7 @@ TYPE
 						IF org = fsize THEN  
 							buf.size := 0
 						ELSE
-							IF fd = NoDesc THEN  OpenUnixFile  END;
+							IF fd = NoDesc THEN  CreateUnixFile  END;
 							IF fpos # org THEN  
 								IF Unix.lseek( fd, org, 0 ) = -1 THEN
 									Halt( SELF, TRUE, "UnixFiles.File.Set: lseek failed" ) 
@@ -738,7 +737,7 @@ TYPE
 				PROCEDURE GetDate*( VAR t, d: LONGINT );
 				VAR stat: Unix.Status;   r: LONGINT;  time: Unix.TmPtr;				
 				BEGIN {EXCLUSIVE}
-					IF fd = NoDesc THEN  OpenUnixFile  END;  
+					IF fd = NoDesc THEN  CreateUnixFile  END;  
 					r := Unix.fstat( fd, stat );
 					time := Unix.localtime( stat.mtime );
 					t := time.sec + ASH( time.min, 6 ) + ASH( time.hour, 12 );
@@ -805,14 +804,14 @@ TYPE
 
 				PROCEDURE Update*;
 				BEGIN {EXCLUSIVE}
-					IF ~(Files.ReadOnly IN flags) THEN  FlushBuffers	 END
+					FlushBuffers
 				END Update;
 				
 				
 				PROCEDURE FlushBuffers;
 				VAR i: LONGINT; 
 				BEGIN 
-					IF fd = NoDesc THEN  OpenUnixFile  END;  
+					IF fd = NoDesc THEN  CreateUnixFile  END;  
 					FOR i := 0 TO NBufs - 1 DO
 						IF bufs[i] # NIL THEN  Flush( bufs[i] )  END
 					END;
@@ -823,25 +822,27 @@ TYPE
 				VAR r: LONGINT;
 				BEGIN {EXCLUSIVE}
 					IF tempFile THEN  
-						IF fd # NoDesc THEN  r := Unix.close( fd )  END;
+						IF fd # NoDesc THEN  
+							r := Unix.close( fd );
+							fd := NoDesc
+						END;
 						r := Unix.unlink( ADDRESSOF( workName ) );
-						fd := NoDesc;
 					ELSE  
-						IF ~(Files.ReadOnly IN flags)  THEN  FlushBuffers  END;
+						FlushBuffers;
 						IF fd # NoDesc THEN
 							r := Unix.close( fd );
 							fd := NoDesc;
 						END;
 					END;
-					DecOpenFiles();
 					state := Closed;
+					DecOpenFiles()
 				END Finalize;
 				
 				PROCEDURE Close;
 				BEGIN
 					Finalize;
-					collection.newFiles.Remove(SELF);
-					collection.oldFiles.Remove(SELF);
+					collection.newFiles.Remove( SELF );
+					collection.oldFiles.Remove( SELF );
 				END Close;
 				
 				PROCEDURE GetName*( VAR name: ARRAY OF CHAR );
@@ -1154,33 +1155,30 @@ TYPE
 	END UnixWrite;	
 	
 	
-	PROCEDURE AddSearchPath*(context: Commands.Context);
-	VAR name: Files.FileName; i,j: LONGINT; ch : CHAR;
+	PROCEDURE AddSearchPath*( context: Commands.Context );
+	VAR name: Files.FileName;  i, j: LONGINT;  ch : CHAR;
 	BEGIN
-		IF context.arg.GetString(name) THEN
-			CleanPath(name); 
-			i := 0; j := 0;
-			WHILE(searchPath[i] # 0X) DO
-				INC(i);
-			END;
-			searchPath[i] := " ";INC(i);
+		IF context.arg.GetString( name ) THEN
+			CleanPath( name ); 
+			i := 0;  j := 0;
+			WHILE searchPath[i] # 0X DO  INC( i )  END;
+			searchPath[i] := " ";  INC( i );
 			REPEAT
-				ch := name[j];
-				searchPath[i] := name[j];
-				INC(j);INC(i);
+				ch := name[j];  searchPath[i] := ch;
+				INC( j );  INC( i );
 			UNTIL ch = 0X;
 		END;
 	END AddSearchPath;
 	
-	PROCEDURE SetWorkPath*(context: Commands.Context);
+	PROCEDURE SetWorkPath*( context: Commands.Context );
 	VAR name: Files.FileName; done: BOOLEAN;
 	BEGIN
-		IF context.arg.GetString(name) THEN
-			ChangeDirectory(name, done); 
+		IF context.arg.GetString( name ) THEN
+			ChangeDirectory( name, done ); 
 			IF ~done THEN 
-				context.error.String("could not change directory to "); context.error.String(name); context.error.Ln; 
-			END;
-		END;
+				context.error.String( "could not change directory to " );  context.error.String( name );  context.error.Ln
+			END
+		END
 	END SetWorkPath;
 	
 	PROCEDURE Finalization;
@@ -1189,7 +1187,7 @@ TYPE
 		Files.GetList( ft );
 		IF ft # NIL THEN
 			FOR i := 0 TO LEN( ft^ ) - 1 DO
-				IF ft[i] IS AliasFileSystem THEN Files.Remove( ft[i] ) END
+				IF ft[i] IS AliasFileSystem THEN  Files.Remove( ft[i] )  END
 			END
 		END;
 		collection.Finalize;