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

with Ada.Text_IO;

package body UTMP_Buffer is
   use Ada.Streams;
   use Ada.Streams.Stream_IO;

   Buffer_Size : constant Positive := 16;

   Buffer        : array (1 .. Buffer_Size) of EUP.UTMP.Instance;
   Stream_Buffer : Stream_Element_Array
                     (1 .. Buffer'Size / Stream_Element'Size);
   for Stream_Buffer'Address use Buffer'Address;

   File  : File_Type;
   First : Positive := 1;
   Last  : Natural := 0;

   procedure Open (Name : in     String) is
   begin
      Open (File => File,
            Name => Name,
            Mode => In_File);
   end Open;

   procedure Close is
   begin
      Close (File => File);
   end Close;

   function End_Of_File return Boolean is
   begin
      return Last < First and then End_Of_File (File);
   end End_Of_File;

   function Next return EUP.UTMP.Instance is
   begin
      if Last < First then
         declare
            Last_Element : Stream_Element_Offset;
         begin
            Read (File   => File,
                  Item   => Stream_Buffer,
                  Last   => Last_Element);
            First := Buffer'First;
            Last := First - 1 + Natural (Last_Element * Stream_Element'Size)
              / EUP.UTMP.Instance'Size;
         end;

         if Last < First then
            raise End_Error;
         end if;
      end if;

      First := First + 1;
      return Buffer (First - 1);
   end Next;

end UTMP_Buffer;

