54 lines
1.6 KiB
Ada
54 lines
1.6 KiB
Ada
with Ada.Streams; use Ada.Streams;
|
|
|
|
package body Opt41_Pkg is
|
|
|
|
type Wstream is new Root_Stream_Type with record
|
|
S : Unbounded_String;
|
|
end record;
|
|
|
|
procedure Read (Stream : in out Wstream;
|
|
Item : out Stream_Element_Array;
|
|
Last : out Stream_Element_Offset) is null;
|
|
|
|
procedure Write (Stream : in out Wstream; Item : Stream_Element_Array) is
|
|
begin
|
|
for J in Item'Range loop
|
|
Append (Stream.S, Character'Val (Item (J)));
|
|
end loop;
|
|
end Write;
|
|
|
|
function Rec_Write (R : Rec) return Unbounded_String is
|
|
S : aliased Wstream;
|
|
begin
|
|
Rec'Output (S'Access, R);
|
|
return S.S;
|
|
end Rec_Write;
|
|
|
|
type Rstream is new Root_Stream_Type with record
|
|
S : String_Access;
|
|
Idx : Integer := 1;
|
|
end record;
|
|
|
|
procedure Write (Stream : in out Rstream; Item : Stream_Element_Array) is null;
|
|
|
|
procedure Read (Stream : in out Rstream;
|
|
Item : out Stream_Element_Array;
|
|
Last : out Stream_Element_Offset) is
|
|
begin
|
|
Last := Stream_Element_Offset'Min
|
|
(Item'Last, Item'First + Stream_Element_Offset (Stream.S'Last - Stream.Idx));
|
|
for I in Item'First .. Last loop
|
|
Item (I) := Stream_Element (Character'Pos (Stream.S (Stream.Idx)));
|
|
Stream.Idx := Stream.Idx + 1;
|
|
end loop;
|
|
end Read;
|
|
|
|
function Rec_Read (Str : String_Access) return Rec is
|
|
S : aliased Rstream;
|
|
begin
|
|
S.S := Str;
|
|
return Rec'Input (S'Access);
|
|
end Rec_Read;
|
|
|
|
end Opt41_Pkg;
|