File : file_system.adb


------------------------------------------------------------------------------
--
--  package File_System (body)
--
------------------------------------------------------------------------------
--  Update information:
--
--  1996.05.17 (Jacob Sparre Andersen)
--    Written.
--
--  1996.10.31 (Jacob Sparre Andersen)
--    Using package Debugged. Modified error reporting.
--
--  1996.11.21 (Jacob Sparre Andersen)
--    Fixed a bug in procedure Exists.
--
--  1997.08.07 (Jacob Sparre Andersen)
--    Added procedure Copy.
--
--  1997.08.14 (Jacob Sparre Andersen)
--    Added procedure Delete.
--
--  1997.08.21 (Jacob Sparre Andersen)
--    Added function Size.
--
--  1998.04.15 (Jacob Sparre Andersen)
--    Dropped debugging messages.
--
--  (Insert additional update information above this line.)
------------------------------------------------------------------------------

with Ada.Streams.Stream_IO;
with Ada.Text_IO;

package body File_System is

   ---------------------------------------------------------------------------
   --  Exists:

   function Exists (File_Name : in String) return Boolean is

      use Ada.Text_IO;

      Dummy : File_Type;

   begin --  Exists
      Open  (File => Dummy, Name => File_Name, Mode => In_File);
      Close (File => Dummy);

      return True;
   exception
      when Name_Error =>
         return False;
      when others =>
         Put_Line
           (File => Ada.Text_IO.Current_Output,
            Item => "File_System.Exists: Unexpected exception.");
         raise;
   end Exists;

   ---------------------------------------------------------------------------
   --  procedure Copy:
   --
   --  Copies a file named From to a file named To.

   procedure Copy (From : in     String;
                   To   : in     String) is

      use Ada.Streams;
      use Ada.Streams.Stream_IO;

      Buffer         : Stream_Element_Array (0 .. 4095);
      Filled_To      : Stream_Element_Offset;
      Source, Target : File_Type;

   begin --  Copy
      Open (File => Source,
            Name => From,
            Mode => In_File);
      Create (File => Target,
              Name => To,
              Mode => Out_File);

      while not End_Of_File (File => Source) loop
         Read (File => Source,
               Item => Buffer,
               Last => Filled_To);
         Write (File => Target,
                Item => Buffer (Buffer'First .. Filled_To));
      end loop;

      Close (File => Source);
      Close (File => Target);
   end Copy;

   ---------------------------------------------------------------------------
   --  procedure Delete:
   --
   --  Deletes the file named Name.

   procedure Delete (Name : in     String) is

      use Ada.Streams.Stream_IO;

      File : File_Type;

   begin --  Delete
      Open (File => File,
            Name => Name,
            Mode => In_File);
      Delete (File => File);
   end Delete;

   ---------------------------------------------------------------------------
   --  function Size:
   --
   --  Returns the file size in bytes.

   function Size (Name : in     String) return Natural is

      use Ada.Streams;
      use Ada.Streams.Stream_IO;

      File   : File_Type;
      Result : Natural;

   begin --  Size
      Open (File => File,
            Name => Name,
            Mode => In_File);
      Result := Natural (Size (File => File)) * Stream_Element'Size / 8;
      Close (File => File);

      return Result;
   end Size;

   ---------------------------------------------------------------------------
   --  procedure Find_File:
   --
   --  Locates a file with the name File_Name in one of the catalogs in Path.
   --  If the file is found, File_Name is set to the full path and file name
   --  and Found_It is set to true.
   --  Otherwise Found_It is set to false, and File_Name is unchanged.

   procedure Find_File
     (File_Name : in out Ada.Strings.Unbounded.Unbounded_String;
      Path      : in     String_Arrays.String_Array_Reference;
      Found_It  :    out Boolean) is

      use Ada.Strings.Unbounded;

   begin --  Find_File
      for Index in Path'Range loop
         if Exists (To_String (Path (Index) & File_Name)) then
            File_Name := Path (Index) & File_Name;
            Found_It := True;
            return;
         elsif Exists (To_String (Path (Index) & "/" & File_Name)) then
            File_Name := Path (Index) & "/" & File_Name;
            Found_It := True;
            return;
         end if;
      end loop;

      Found_It := False;
   end Find_File;

   ---------------------------------------------------------------------------

end File_System;