blob: 39144a6b2fe9cbfc7bfbea4749d8ea95d835262b [file] [log] [blame]
------------------------------------------------------------------------------
-- --
-- GNAT RUN-TIME COMPONENTS --
-- --
-- ADA.STRINGS.TEXT_BUFFERS --
-- --
-- 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.Strings.UTF_Encoding;
package Ada.Strings.Text_Buffers with
Pure
is
type Text_Buffer_Count is range 0 .. Integer'Last;
New_Line_Count : constant Text_Buffer_Count := 1;
-- There is no support for two-character CR/LF line endings.
type Root_Buffer_Type is abstract tagged limited private with
Default_Initial_Condition => Current_Indent (Root_Buffer_Type) = 0;
procedure Put (Buffer : in out Root_Buffer_Type; Item : String) is abstract;
procedure Wide_Put
(Buffer : in out Root_Buffer_Type; Item : Wide_String) is abstract;
procedure Wide_Wide_Put
(Buffer : in out Root_Buffer_Type; Item : Wide_Wide_String) is abstract;
procedure Put_UTF_8
(Buffer : in out Root_Buffer_Type;
Item : UTF_Encoding.UTF_8_String) is abstract;
procedure Wide_Put_UTF_16
(Buffer : in out Root_Buffer_Type;
Item : UTF_Encoding.UTF_16_Wide_String) is abstract;
procedure New_Line (Buffer : in out Root_Buffer_Type) is abstract;
Standard_Indent : constant Text_Buffer_Count := 3;
function Current_Indent
(Buffer : Root_Buffer_Type) return Text_Buffer_Count;
procedure Increase_Indent
(Buffer : in out Root_Buffer_Type;
Amount : Text_Buffer_Count := Standard_Indent) with
Post'Class => Current_Indent (Buffer) =
Current_Indent (Buffer)'Old + Amount;
procedure Decrease_Indent
(Buffer : in out Root_Buffer_Type;
Amount : Text_Buffer_Count := Standard_Indent) with
Pre'Class => Current_Indent (Buffer) >= Amount
-- or else raise Constraint_Error,
or else Boolean'Val (Current_Indent (Buffer) - Amount),
Post'Class => Current_Indent (Buffer) =
Current_Indent (Buffer)'Old - Amount;
private
type Root_Buffer_Type is abstract tagged limited record
Indentation : Natural := 0;
-- Current indentation
Indent_Pending : Boolean := True;
-- Set by calls to New_Line, cleared when indentation emitted.
UTF_8_Length : Natural := 0;
-- Count of UTF_8 characters in the buffer
UTF_8_Column : Positive := 1;
-- Column in which next character will be written.
-- Calling New_Line resets to 1.
All_7_Bits : Boolean := True;
-- True if all characters seen so far fit in 7 bits
All_8_Bits : Boolean := True;
-- True if all characters seen so far fit in 8 bits
end record;
generic
-- This generic allows a client to extend Root_Buffer_Type without
-- having to implement any of the abstract subprograms other than
-- Put_UTF_8 (i.e., Put, Wide_Put, Wide_Wide_Put, Wide_Put_UTF_16,
-- and New_Line). Without this generic, each client would have to
-- duplicate the implementations of those 5 subprograms.
-- This generic also takes care of handling indentation, thereby
-- avoiding further code duplication. The name "Output_Mapping" isn't
-- wonderful, but it refers to the idea that this package knows how
-- to implement all the other output operations in terms of
-- just Put_UTF_8.
--
-- The classwide parameter type here is somewhat tricky;
-- there are no dispatching calls associated with this parameter.
-- It would be more accurate to say that the parameter is of type
-- Output_Mapping.Buffer_Type'Class, but that type hasn't been declared
-- yet. Instantiators will typically declare a non-abstract extension,
-- B2, of the buffer type, B1, declared in their instantiation. The
-- actual Put_UTF_8_Implementation parameter may then have a
-- precondition "Buffer in B2'Class" and that subprogram can safely
-- access components declared as part of the declaration of B2.
with procedure Put_UTF_8_Implementation
(Buffer : in out Root_Buffer_Type'Class;
Item : UTF_Encoding.UTF_8_String);
package Output_Mapping is
type Buffer_Type is abstract new Root_Buffer_Type with null record;
overriding procedure Put (Buffer : in out Buffer_Type; Item : String);
overriding procedure Wide_Put
(Buffer : in out Buffer_Type; Item : Wide_String);
overriding procedure Wide_Wide_Put
(Buffer : in out Buffer_Type; Item : Wide_Wide_String);
overriding procedure Put_UTF_8
(Buffer : in out Buffer_Type;
Item : UTF_Encoding.UTF_8_String);
overriding procedure Wide_Put_UTF_16
(Buffer : in out Buffer_Type; Item : UTF_Encoding.UTF_16_Wide_String);
overriding procedure New_Line (Buffer : in out Buffer_Type);
end Output_Mapping;
end Ada.Strings.Text_Buffers;