     with CharAK ; use CharAK;
     with ConsAK ; use ConsAK;
     with ErroAK ; use ErroAK;
     with InteAK ;
     with StriAK ; use StriAK;
     with Text_IO; use Text_IO;

     package body FileAK is
     ----------------------------------------------------------------------
     -- Copyright (C) 1994 David Wallace Croft.  All rights reserved.
     ----------------------------------------------------------------------

     procedure Demo is
     ----------------------------------------------------------------------
     begin
       Put_Line ( FileAK.Copyright );
       New_Line;
       Put_Line ( "Text input/output to a file." );
       New_Line;
       declare
	 File_Name : string ( 1..12 ) := "AdaKit.Doc  ";
	 For_String : string ( 1..79 ) := ( others => ASCII.Nul );
	 Scan_Position : long_integer;
	 Case_Sensitive : boolean := true;
       begin
	 Put_Line ( "Demonstration of Scan function." );
	 New_Line;
	 Ask ( File_Name, "File to scan ", File_Name );
	 For_String ( 1..5 ) := "Croft";
	 Ask ( For_String, "String to search for ", For_String );
	 Ask ( Case_Sensitive, "Case Sensitive ", Case_Sensitive );
	 Scan_Position :=
	   Scan ( File_Name, Trim_White_Space ( For_String ),
	   Case_Sensitive );
	 Put_Line ( long_integer'image ( Scan_Position ) );
       end;
--     Put_Line ( "No demonstration is currently available." );
       Pause;
     end Demo;

     ----------------------------------------------------------------------
     -- File I/O
     ----------------------------------------------------------------------

     procedure Copy (
       From : in     string;
       To   : in     string ) is
     ----------------------------------------------------------------------
     -- Limited by length of Line_Type
     ----------------------------------------------------------------------
       Last   : natural;
       Line   : Line_Type;
       Copied : File_Type;
       Copy   : File_Type;
     begin
       Open   ( Copied, In_File , From );
       Create ( Copy  , Out_File, To   );
       loop
	 exit when End_Of_File ( Copied );
	 Get_Line ( Copied, Line, Last );
	 Put_Line ( Copy  , Line ( 1..Last ) );
       end loop;
       Close ( Copied );
       Close ( Copy   );
     end Copy;

     procedure Delete (
       File_Name : in    string ) is
     ----------------------------------------------------------------------
       File : File_Type;
     begin
       Open ( File, Out_File, File_Name );
       Delete ( File );
     end Delete;

     procedure Read (
       Path_File_Name : in    string ) is
     ----------------------------------------------------------------------
       Char : character;
       File : File_Type;
     begin
       Open ( File, In_File, Path_File_Name );
       loop
	 exit when End_Of_File ( File );
	 Get ( Char );
	 Put ( Char );
       end loop;
       Close ( File );
     exception
       when others =>
	 Close ( File );
	 raise;
     end Read;

     function Scan (
       File_Name      : string;
       For_String     : string;
       Case_Sensitive : boolean := true )
       return long_integer is
     ----------------------------------------------------------------------
       Temp : long_integer := 0;
       Window : string ( For_String'range ) := ( others => ASCII.Nul );
       For_String_Cased : string ( For_String'range ) := For_String;
       Position : long_integer := 0;
       File : File_Type;
     begin
       if not Case_Sensitive then
	 For_String_Cased := Upcase ( For_String );
       end if;
       Open ( File, In_File, Trim_White_Space ( File_Name ) );
       loop
	 exit when End_Of_File ( File );
	 Position := Position + 1;
	 begin
	   Get ( File, Window ( Window'last ) );
	 exception
     --  Does not detect End_Of_File when last character is ASCII.FF???
	   when End_Error => exit;
	 end;
	 if not Case_Sensitive then
	   Window ( Window'last ) := Upcase ( Window ( Window'last ) );
	 end if;
	 if ( Window = For_String_Cased ) and then
	   ( Position > For_String'length ) then
	     Temp := Position - Window'length + 1;
	     exit;
	 end if;
	 Window := Shift ( Window, Left => +1 );
       end loop;
       Close ( File );
       return Temp;
     exception
       when others =>
	 return -1;
     end Scan;

     ----------------------------------------------------------------------
     ----------------------------------------------------------------------
     end FileAK;
