Back to... PDF Writer

Source file : gid-buffering.adb



with Ada.IO_Exceptions;

package body GID.Buffering is

  procedure Fill_Buffer (b : in out Input_buffer);
  --  ^ Spec here to avoid warning by 'Get_Byte' below (GNAT 2009):
  --  warning: call to subprogram with no separate spec prevents inlining

  procedure Fill_Buffer (b : in out Input_buffer)
  is
    --
    procedure BlockRead (
      buffer       :    out Byte_array;
      actually_read :    out Natural
    )
    is
      use Ada.Streams;
      Last_Read : Stream_Element_Offset;
    begin
      if is_mapping_possible then
        declare
          SE_Buffer_mapped : Stream_Element_Array (1 .. buffer'Length);
          --  direct mapping: buffer = SE_Buffer_mapped
          for SE_Buffer_mapped'Address use buffer'Address;
          pragma Import (Ada, SE_Buffer_mapped);
        begin
          Read (b.stream.all, SE_Buffer_mapped, Last_Read);
        end;
      else
        declare
          SE_Buffer : Stream_Element_Array (1 .. buffer'Length);
          --  need to copy array (slightly slower)
        begin
          Read (b.stream.all, SE_Buffer, Last_Read);
          for i in buffer'Range loop
            buffer (i) := U8 (SE_Buffer (Stream_Element_Offset (i - buffer'First) + SE_Buffer'First));
          end loop;
        end;
      end if;
      actually_read := Natural (Last_Read);
    end BlockRead;
    --
  begin
    BlockRead (
      buffer        => b.data,
      actually_read => b.MaxInBufIdx
    );
    b.InputEoF := b.MaxInBufIdx = 0;
    b.InBufIdx := 1;
  end Fill_Buffer;

  procedure Attach_Stream (
    b   :    out Input_buffer;
    stm : in     Stream_Access
  )
  is
  begin
    b.stream := stm;
    --  Fill_Buffer(b) will be performed on first call of Get_Byte
  end Attach_Stream;

  function Is_stream_attached (b : Input_buffer) return Boolean is
  begin
    return b.stream /= null;
  end Is_stream_attached;

  procedure Get_Byte (b : in out Input_buffer; byte : out U8) is
  begin
    if b.InBufIdx > b.MaxInBufIdx then
      Fill_Buffer (b);
      if b.InputEoF then
        raise Ada.IO_Exceptions.End_Error;
      end if;
    end if;
    byte := b.data (b.InBufIdx);
    b.InBufIdx := b.InBufIdx + 1;
  end Get_Byte;

end GID.Buffering;


Ada PDF Writer: Ada package for writing PDF files (.pdf). Ada programming.
Some news about Ada PDF Writer and other Ada projects on Gautier's blog.