-- PrintInUseFileNames.Mesa
-- Last Modified By Paul Rovner On June 21, 1982 2:57 pm

DIRECTORY
    RTTypesBasicPrivate USING[MapStiStd],
    DCSFileTypes USING [tLeaderPage],
    File USING [Capability, GetAttributes],
    FileIOPrivate USING [LeaderPage],
    Space USING [CopyIn, Create, Delete, Handle, LongPointer, Map, virtualMemory],
    SymbolTable USING [nullHandle],
    UserExec USING [GetExecHandle],
    IO USING[Handle, PutRope, PutChar];
    
PrintInUseFileNames: PROGRAM
  IMPORTS RTTypesBasicPrivate, IO, Space, File, UserExec
= BEGIN OPEN RTTypesBasicPrivate;

PrintFileName: PROC[file: File.Capability, out: IO.Handle] =
 {   IF File.GetAttributes[file].type # DCSFileTypes.tLeaderPage
      THEN out.PutRope["file with no leader page\n"]
      ELSE
        {leaderSpace: Space.Handle = Space.Create[1, Space.virtualMemory];
         leader: LONG POINTER TO FileIOPrivate.LeaderPage ← Space.LongPointer[leaderSpace];
         Space.Map[leaderSpace];
         Space.CopyIn[space: leaderSpace, window: [file, 0]];
         FOR i: NAT IN [0..leader.nameLength)
           DO out.PutChar[leader.name[i]]
          ENDLOOP;
         out.PutChar['\n];
         Space.Delete[leaderSpace];
        };
 };
 
 
DoIt: PROC =
{out: IO.Handle = UserExec.GetExecHandle[].out;
 FOR i: NAT IN [0..MapStiStd.length)
  DO IF MapStiStd[i] # NIL
        THEN IF MapStiStd[i].sth # SymbolTable.nullHandle
                 THEN PrintFileName[MapStiStd[i].sth.file, out];
 ENDLOOP};
 
-- START HERE

DoIt[];

END.