home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / dskutl / swp-ms10.ark / TRAMDF.IF2 < prev    next >
Text File  |  1989-09-27  |  9KB  |  300 lines

  1.  
  2. {* -------------------------------------------------------------------------
  3.  *                  F I L E   L I S T   M A N A G E M E N T
  4.  * ------------------------------------------------------------------------- *}
  5.  
  6. {*
  7.  * For the FileManger, a list of files on the source disk is maintained in
  8.  * memory.  It is a double-linked circular list containing one special entry
  9.  * which serves as the sentinel for the EnterFileInList sort procedure.
  10.  *
  11.  * Most of the procedures work on the 'current' (file) list entry.  It is the
  12.  * entry pointed to by the global variable FileEntry.
  13.  *}
  14.  
  15. function GetFileEntryName: FullFileNames ;
  16. {*
  17.  * Fetch the name of the current (file) entry and insert the separator
  18.  * between the primary file name and the extension.
  19.  *}
  20. begin
  21.    with FileEntry^ do
  22.      GetFileEntryName:= Copy( Name, 1, 8 ) + '.' + Copy( Name, 9, 3 ) ;
  23. end ;  { of GetFileEntryName }
  24.  
  25. function IsDirectory: Boolean ;
  26. {*
  27.  * Determine whether the current file list entry contains a subdirectoryname,
  28.  * thus not a filename or a volumename.
  29.  *}
  30. begin
  31.    IsDirectory:= ( SubDirectory in FileEntry^.Attr ) ;
  32. end ;  { of IsDirectory }
  33.  
  34. function IsFile: Boolean ;
  35. {*
  36.  * Determine whether the current file list entry contains a filename, and
  37.  * thus not a volumename or a subdirectoryname.
  38.  *}
  39. begin
  40.    IsFile:= ( FileEntry^.Attr*[Volume,SubDirectory] = [] ) ;
  41. end ;  { of IsFile }
  42.  
  43. procedure AdvanceFileEntry ;
  44. {*
  45.  * Advance the pointer FileEntry to the next (file) entry in the list.  If
  46.  * at the end of the list, wrap to the first entry in the list.
  47.  *}
  48. begin
  49.    FileEntry:= FileEntry^.Next ;
  50.    FileIndex:= Succ( FileIndex ) ;
  51.    if FileEntry=TailFileList then
  52.     begin
  53.      FileEntry:= HeadFileList ;
  54.      FileIndex:=            1 ;
  55.      WriteLn ;
  56.     end ;  { of if }
  57. end ;  { of AdvanceFileEntry }
  58.  
  59. procedure BackupFileEntry ;
  60. {*
  61.  * Set the pointer FileEntry to the preceding entry in the filelist.  If
  62.  * at the beginning of the list, wrap to the last entry in the list.
  63.  *}
  64. begin
  65.    FileEntry:= FileEntry^.Prev ;
  66.    FileIndex:= Pred( FileIndex ) ;
  67.    if FileEntry=TailFileList then
  68.     begin
  69.      FileEntry:= FileEntry^.Prev ;
  70.      FileIndex:= SizeFileList ;
  71.      WriteLn ;
  72.     end ;  { of if }
  73. end ;  { of BackupFileEntry }
  74.  
  75. procedure DeleteFileEntry ;
  76. {*
  77.  * Remove the current entry from the filelist and select the logical next
  78.  * entry as the current entry.  If the entry is marked, an implicit and
  79.  * silent UntagFileEntry is performed.
  80.  *}
  81. var
  82.    FreeEntry: FileEntryPtr ;  { Entry to be released }
  83. begin
  84.    if FileEntry^.Mark then
  85.      SizeTaggedFiles:= SizeTaggedFiles - FileEntry^.Size ;
  86. {*
  87.  * If the first entry in the list is to be deleted, move the head pointer
  88.  * to the next entry in the list.
  89.  *}
  90.    if HeadFileList=FileEntry then
  91.      HeadFileList:= HeadFileList^.Next ;
  92. {*
  93.  * Detach the entry to be deleted from the filelist.
  94.  *}
  95.    FileEntry^.Prev^.Next:= FileEntry^.Next ;
  96.    FileEntry^.Next^.Prev:= FileEntry^.Prev ;
  97.    SizeFileList:= Pred( SizeFileList ) ;
  98. {*
  99.  * Set the 'current' entry to the logical next entry in the list.
  100.  *}
  101.    FreeEntry:= FileEntry ;         { Save pointer to the former entry }
  102.    FileEntry:= FileEntry^.Next ;
  103.    if FileEntry=TailFileList then
  104.     begin
  105.      FileEntry:= HeadFileList ;
  106.      FileIndex:=            1 ;
  107.     end ;  { of if }
  108.  
  109.    Dispose( FreeEntry ) ;  { Finally, release the file entry }
  110. end ;  { of DeleteFileEntry }
  111.  
  112. procedure DisplayFileEntry ;
  113. {*
  114.  * Display the name and the attributes of the current (file) entry.
  115.  *}
  116. begin
  117.    with FileEntry^ do
  118.     begin
  119.      WriteLn ;
  120.      Write( FileIndex:3, ' : ', GetFileEntryName, ' ' ) ;
  121.      if ReadOnly     in Attr then  Write( 'R' )  else  Write( '-' ) ;
  122.      if Hidden       in Attr then  Write( 'H' )  else  Write( '-' ) ;
  123.      if System       in Attr then  Write( 'S' )  else  Write( '-' ) ;
  124.      if Volume       in Attr then  Write( 'V' )  else  Write( '-' ) ;
  125.      if SubDirectory in Attr then  Write( 'D' )  else  Write( '-' ) ;
  126.      if Archive      in Attr then  Write( 'A' )  else  Write( '-' ) ;
  127.      Write( ' ', Size:5, 'K :' ) ;
  128.      if Mark                 then  Write( '*' )  else  Write( ' ' ) ;
  129.     end ;  { of with }
  130. end ;  { of DisplayFileEntry }
  131.  
  132. procedure EnterFileInList ;
  133. {*
  134.  * Enter the file, specified in FileEntry, in the filelist.  If the
  135.  * filename is already in the list, the filesize is set to the larger
  136.  * of the two.
  137.  *
  138.  * Note that the last entry of the file list is a sentinel, containing
  139.  * the greatest possible file name.
  140.  *}
  141. var
  142.    NextEntry: FileEntryPtr ;  { Pointer to next element in list }
  143. begin
  144.    NextEntry:= HeadFileList ;
  145.    while NextEntry<>Nil do
  146.     begin
  147.      if NextEntry^.Name=FileEntry^.Name then
  148. {*
  149.  * The file name is already entered in the file list.  This can happen
  150.  * in CP/M only.  Save the biggest of the two file sizes and release the
  151.  * file-entry.
  152.  *}
  153.       begin
  154.        if NextEntry^.Size<FileEntry^.Size then
  155.          NextEntry^.Size:= FileEntry^.Size ;
  156.        NextEntry:= Nil ;  { Terminate loop }
  157.        Dispose( FileEntry ) ;
  158.       end
  159.      else
  160.        if NextEntry^.Name>FileEntry^.Name then
  161. {*
  162.  * The file name is not in the file list right now.  Enter it in the list.
  163.  * Adjust the head pointer if necessary.
  164.  *}
  165.         begin
  166.          FileEntry^.Next      := NextEntry ;
  167.          FileEntry^.Prev      := NextEntry^.Prev ;
  168.          NextEntry^.Prev      := FileEntry ;
  169.          FileEntry^.Prev^.Next:= FileEntry ;
  170.  
  171.          if NextEntry=HeadFileList then
  172.            HeadFileList:= FileEntry ;
  173.          SizeFileList:= Succ( SizeFileList ) ;
  174.  
  175.          NextEntry:= Nil ;  { Terminate loop }
  176.         end
  177.        else
  178. {*
  179.  * If the file name is in the list, it must after the entry in the list
  180.  * pointed to by NextEntry.
  181.  *}
  182.          NextEntry:= NextEntry^.Next ;
  183.     end ;  { of while }
  184. end ;  { of EnterFileInList }
  185.  
  186. procedure PresetFileList ;
  187. {*
  188.  * Remove all entries, if any, from the filelist and make sure that the
  189.  * filelist contains only the sentinel entry.
  190.  *}
  191. var
  192.    NextEntry: FileEntryPtr ;  { Next entry in filelist }
  193. begin
  194. {*
  195.  * Remove all but the sentinel entry in the filelist.
  196.  *}
  197.    NextEntry:= HeadFileList ;
  198.    while NextEntry<>Nil do
  199.      if NextEntry=TailFileList then
  200.       begin
  201.        HeadFileList:= NextEntry ;  { Save ptr to sentinel entry }
  202.        NextEntry   :=       Nil ;  { Terminate loop }
  203.       end
  204.      else
  205.       begin
  206.        NextEntry:= NextEntry^.Next ;  { Address of successor }
  207.        Dispose( NextEntry^.Prev )  ;  { Release preceding entry }
  208.       end ;  { of if/while }
  209. {*
  210.  * The list contains now either zero or one entry.  In the former case a
  211.  * sentinel entry is added to the list.
  212.  *}
  213.    if HeadFileList=Nil then
  214.     begin
  215.      New( HeadFileList ) ;
  216.      TailFileList:= HeadFileList ;
  217.     end ;  { of if }
  218.  
  219.    FileIndex      := 0 ;
  220.    SizeFileList   := 0 ;
  221.    SizeTaggedFiles:= 0 ;
  222.    with HeadFileList^ do
  223.     begin
  224.      Next:= HeadFileList ;
  225.      Prev:= HeadFileList ;
  226.      Name:= #$FF#$FF#$FF#$FF#$FF#$FF#$FF#$FF#$FF#$FF#$FF ;
  227.      Attr:=    [] ;
  228.      Size:=     0 ;
  229.      Mark:= False ;
  230.     end ;  { of with }
  231. end ;  { of PresetFileList }
  232.  
  233. procedure TagFileEntry ;
  234. {*
  235.  * Mark the current (file) entry to be used in one of the 'mass' operations
  236.  * of the file manager.  The aggregate size of the tagged files is displayed.
  237.  * An entry which does not correspond to a file cannot be marked!
  238.  *}
  239. begin
  240.    if IsFile then
  241.      if not FileEntry^.Mark then
  242.       begin
  243.        FileEntry^.Mark:= True ;
  244.        SizeTaggedFiles:= SizeTaggedFiles + FileEntry^.Size ;
  245.        Write( 'Tagged size =', SizeTaggedFiles:4, 'K' ) ;
  246.       end ;  { of if/if }
  247. end ;  { of TagFileEntry }
  248.  
  249. procedure TagMultipleFileEntries ;
  250. {*
  251.  * Tag those file entries in the file list which match a user-specified
  252.  * wildcard mask.
  253.  *}
  254. var
  255.    SavedFileEntry:    FileEntryPtr ;  { Save area for current file }
  256.    RawFileName   :   FullFileNames ;  { Wildcard mask / file name }
  257.    FileNameMask  : FileDescriptors ;  { Expanded file name mask }
  258.    FileName      : FileDescriptors ;  { Filename to check against mask }
  259. begin
  260.    SavedFileEntry:= FileEntry ;
  261.  
  262.    Write( ' Enter mask : ' ) ;
  263.    ReadLn( RawFileName ) ;
  264.    SplitFileName( FileNameMask, RawFileName ) ;
  265.  
  266.    FileEntry:= HeadFileList ;
  267.    while FileEntry<>TailFileList do
  268.     begin
  269.      if IsFile then
  270.       begin
  271.        RawFileName:= GetFileEntryName ;
  272.        SplitFileName( FileName, RawFileName ) ;
  273.        if SameName( FileName, FileNameMask, NE_Format ) then
  274.         begin
  275.          WriteLn ;
  276.          Write( 'Tagging  --> ', RawFileName, ' : ' ) ;
  277.          TagFileEntry ;
  278.         end ;  { of if }
  279.       end ;  { of if }
  280.      FileEntry:= FileEntry^.Next ;
  281.     end ;  { of while }
  282.  
  283.    FileEntry:= SavedFileEntry ;
  284. end ;  { of TagMultipleFileEntries }
  285.  
  286. procedure UntagFileEntry ;
  287. {*
  288.  * Remove the mark from the current (file) entry.  The updated aggregate
  289.  * size of the remaining tagged files is displayed.
  290.  *}
  291. begin
  292.    if FileEntry^.Mark then
  293.     begin
  294.      FileEntry^.Mark:= False ;
  295.      SizeTaggedFiles:= SizeTaggedFiles - FileEntry^.Size ;
  296.      Write( 'Tagged size =', SizeTaggedFiles:4, 'K' ) ;
  297.     end ;  { of if }
  298. end ;  { of UntagFileEntry }
  299.  
  300.