| ------------------------------------------------------------------------------ |
| -- -- |
| -- GNAT RUN-TIME COMPONENTS -- |
| -- -- |
| -- ADA.STRINGS.TEXT_BUFFERS.UNBOUNDED -- |
| -- -- |
| -- S p e c -- |
| -- -- |
| -- This specification is derived from the Ada Reference Manual for use with -- |
| -- GNAT. In accordance with the copyright of that document, you can freely -- |
| -- copy and modify this specification, provided that if you redistribute a -- |
| -- modified version, any changes that you have made are clearly indicated. -- |
| -- -- |
| ------------------------------------------------------------------------------ |
| |
| with Ada.Finalization; |
| package Ada.Strings.Text_Buffers.Unbounded with |
| Preelaborate |
| -- , Nonblocking |
| -- , Global => null |
| is |
| |
| type Buffer_Type is new Root_Buffer_Type with private; |
| |
| function Get (Buffer : in out Buffer_Type) return String with |
| Post'Class => Get'Result'First = 1 and then Current_Indent (Buffer) = 0; |
| |
| function Wide_Get (Buffer : in out Buffer_Type) return Wide_String with |
| Post'Class => Wide_Get'Result'First = 1 |
| and then Current_Indent (Buffer) = 0; |
| |
| function Wide_Wide_Get |
| (Buffer : in out Buffer_Type) return Wide_Wide_String with |
| Post'Class => Wide_Wide_Get'Result'First = 1 |
| and then Current_Indent (Buffer) = 0; |
| |
| function Get_UTF_8 |
| (Buffer : in out Buffer_Type) return UTF_Encoding.UTF_8_String with |
| Post'Class => Get_UTF_8'Result'First = 1 |
| and then Current_Indent (Buffer) = 0; |
| |
| function Wide_Get_UTF_16 |
| (Buffer : in out Buffer_Type) return UTF_Encoding.UTF_16_Wide_String with |
| Post'Class => Wide_Get_UTF_16'Result'First = 1 |
| and then Current_Indent (Buffer) = 0; |
| |
| private |
| |
| procedure Put_UTF_8_Implementation |
| (Buffer : in out Root_Buffer_Type'Class; |
| Item : UTF_Encoding.UTF_8_String) |
| with Pre => Buffer in Buffer_Type'Class; |
| |
| package Mapping is new Output_Mapping (Put_UTF_8_Implementation); |
| |
| type Chunk; |
| type Chunk_Access is access all Chunk; |
| type Chunk (Length : Positive) is record |
| Next : Chunk_Access := null; |
| Chars : UTF_Encoding.UTF_8_String (1 .. Length); |
| end record; |
| |
| type Managed_Chunk_List is new Ada.Finalization.Limited_Controlled with |
| record |
| First_Chunk : aliased Chunk (64); |
| -- First chunk in list is not created by an allocator; it is |
| -- large enough to suffice for many common images. |
| |
| Current_Chunk : Chunk_Access; |
| -- Chunk we are currrently writing to. |
| -- Initialized to Managed_Chunk_List.First'Access. |
| end record; |
| |
| overriding procedure Initialize (List : in out Managed_Chunk_List); |
| -- List.Current_Chunk := List.First_Chunk'Unchecked_Access; |
| |
| overriding procedure Finalize (List : in out Managed_Chunk_List); |
| -- Free any allocated chunks. |
| |
| type Buffer_Type is new Mapping.Buffer_Type with record |
| List : Managed_Chunk_List; |
| |
| Last_Used : Natural := 0; |
| -- Index of last used char in List.Current_Chunk.all; 0 if none used. |
| end record; |
| |
| end Ada.Strings.Text_Buffers.Unbounded; |