--------------------------------------------------------------------------
MODULE FileSystem;
--------------------------------------------------------------------------
IMPORT Text, FileStatus, APN, RegularFile, Terminal,
File, OSError, Pathname;
IMPORT (* FSFixed AS *) FS;
--------------------------------------------------------------------------
PROCEDURE Lookup (p : APN.T) : FileStatus.T =
BEGIN
RETURN LookupS (p.denotation());
END Lookup;
--------------------------------------------------------------------------
PROCEDURE LookupS (p : Pathname.T) : FileStatus.T =
VAR res : FileStatus.T;
stat : File.Status;
BEGIN
res := NEW (FileStatus.T);
TRY
stat := FS.Status (p);
EXCEPT
OSError.E => res.exists := FALSE;
RETURN res
END;
res.exists := TRUE;
res.isFile := stat.type = RegularFile.FileType;
res.isDir := stat.type = FS.DirectoryFileType;
res.isTerm := stat.type = Terminal.FileType;
res.modified := stat.modificationTime;
res.size := stat.size;
RETURN res;
END LookupS;
--------------------------------------------------------------------------
REVEAL
Iterator = IteratorPublic BRANDED OBJECT
actualIterator : FS.Iterator
OVERRIDES
next := Next;
nextWithStatus := NextWithStatus;
nextWithStatusS := NextWithStatusS;
close := Close;
END;
--------------------------------------------------------------------------
PROCEDURE Next (sf : Iterator; VAR (*OUT*) n : Text.T) : BOOLEAN =
BEGIN
RETURN sf.actualIterator.next (n)
END Next;
--------------------------------------------------------------------------
PROCEDURE NextWithStatus (
sf : Iterator;
VAR (*OUT*) n : APN.T;
VAR (*OUT*) s : FileStatus.T) : BOOLEAN =
VAR
thereIsOne : BOOLEAN;
stat : File.Status;
t : TEXT;
BEGIN
TRY
thereIsOne := sf.actualIterator # NIL (*C*)AND
sf.actualIterator.nextWithStatus(t, stat) ;
EXCEPT
OSError.E => RETURN FALSE;
END;
IF thereIsOne THEN
n := APN.New(t);
s := NEW (FileStatus.T);
s.exists := TRUE;
s.isFile := stat.type = RegularFile.FileType;
s.isDir := stat.type = FS.DirectoryFileType;
s.isTerm := stat.type = Terminal.FileType;
s.modified := stat.modificationTime;
s.size := stat.size;
END;
RETURN thereIsOne
END NextWithStatus;
--------------------------------------------------------------------------
PROCEDURE NextWithStatusS (
sf : Iterator;
VAR (*OUT*) n : Pathname.T;
VAR (*OUT*) s : FileStatus.T) : BOOLEAN =
VAR
thereIsOne : BOOLEAN;
stat : File.Status;
BEGIN
TRY
thereIsOne := sf.actualIterator # NIL (*C*)AND
sf.actualIterator.nextWithStatus(n, stat) ;
EXCEPT
OSError.E => RETURN FALSE;
END;
IF thereIsOne THEN
s := NEW (FileStatus.T);
s.exists := TRUE;
s.isFile := stat.type = RegularFile.FileType;
s.isDir := stat.type = FS.DirectoryFileType;
s.isTerm := stat.type = Terminal.FileType;
s.modified := stat.modificationTime;
s.size := stat.size;
END;
RETURN thereIsOne
END NextWithStatusS;
--------------------------------------------------------------------------
PROCEDURE Close (sf : Iterator) =
BEGIN
IF sf.actualIterator # NIL THEN sf.actualIterator.close () END
END Close;
--------------------------------------------------------------------------
PROCEDURE GetIterator (p : APN.T) : Iterator =
BEGIN
RETURN GetIteratorS(p.denotation());
END GetIterator;
--------------------------------------------------------------------------
PROCEDURE GetIteratorS (p : Pathname.T) : Iterator =
VAR res : Iterator;
BEGIN
res := NEW (Iterator);
TRY
res.actualIterator := FS.Iterate (p)
EXCEPT
OSError.E => res.actualIterator := NIL
END;
RETURN res
END GetIteratorS;
--------------------------------------------------------------------------
BEGIN
END FileSystem.