with Ada.Streams.Stream_IO;
with Ada.Text_IO;
package body DirX.Examples is
----------
-- Hash --
----------
function Hash (Filename : String) return GNAT.SHA512.Message_Digest is
File : Ada.Streams.Stream_IO.File_Type;
Buffer : Ada.Streams.Stream_Element_Array (1 .. 1048576);
Last : Ada.Streams.Stream_Element_Offset;
Ctxt : aliased GNAT.SHA512.Context;
Hasher : GNAT.SHA512.Hash_Stream (Ctxt'Access);
use Ada.Streams.Stream_IO;
begin
Open (File, Mode => In_File, Name => Filename);
while not End_Of_File (File) loop
Read (File, Buffer, Last);
Hasher.Write (Buffer (1 .. Last));
end loop;
Close (File);
return GNAT.SHA512.Digest (Ctxt);
end Hash;
----------
-- Hash --
----------
function Hash (This : DirX.Directory_Entry) return Hashed_Entry is
use Ada.Directories;
Filename : constant String := Full_Name (This.Get_Entry);
begin
if Kind (Filename) = Directory then
return Hashed_Entry'(Name_Len => Filename'Length,
Is_File => False,
Name => Filename);
else
return Hashed_Entry'(Name_Len => Filename'Length,
Is_File => True,
Name => Filename,
Hash => Hash (Filename));
end if;
end Hash;
----------------
-- Print_Hash --
----------------
procedure Print_Hash (This : Hashed_Entry) is
use Ada.Text_IO;
begin
if This.Is_File then
Put_Line (This.Hash & " " & This.Name);
else
Put_Line (GNAT.SHA512.Message_Digest'(others => ' ') & " " & This.Name);
end if;
end Print_Hash;
end DirX.Examples;