mirror of git://gcc.gnu.org/git/gcc.git
[multiple changes]
2013-10-14 Robert Dewar <dewar@adacore.com> * exp_attr.adb (Find_Stream_Subprogram): Optimize Storage_Array stream handling. (Find_Stream_Subprogram): Optimize Stream_Element_Array stream handling * rtsfind.ads: Add entry for Stream_Element_Array Add entries for RE_Storage_Array subprograms Add entries for RE_Stream_Element_Array subprograms * s-ststop.ads, s-ststop.adb: Add processing for System.Storage_Array. Add processing for Ada.Stream_Element_Array. 2013-10-14 Tristan Gingold <gingold@adacore.com> * a-except-2005.ads, a-except-2005.adb: (Get_Exception_Machine_Occurrence): New function. * raise-gcc.c (__gnat_unwind_exception_size): New constant. From-SVN: r203560
This commit is contained in:
parent
2590ef129b
commit
161c5cc509
|
|
@ -1,3 +1,20 @@
|
||||||
|
2013-10-14 Robert Dewar <dewar@adacore.com>
|
||||||
|
|
||||||
|
* exp_attr.adb (Find_Stream_Subprogram): Optimize
|
||||||
|
Storage_Array stream handling.
|
||||||
|
(Find_Stream_Subprogram): Optimize Stream_Element_Array stream handling
|
||||||
|
* rtsfind.ads: Add entry for Stream_Element_Array Add
|
||||||
|
entries for RE_Storage_Array subprograms Add entries for
|
||||||
|
RE_Stream_Element_Array subprograms
|
||||||
|
* s-ststop.ads, s-ststop.adb: Add processing for System.Storage_Array.
|
||||||
|
Add processing for Ada.Stream_Element_Array.
|
||||||
|
|
||||||
|
2013-10-14 Tristan Gingold <gingold@adacore.com>
|
||||||
|
|
||||||
|
* a-except-2005.ads, a-except-2005.adb:
|
||||||
|
(Get_Exception_Machine_Occurrence): New function.
|
||||||
|
* raise-gcc.c (__gnat_unwind_exception_size): New constant.
|
||||||
|
|
||||||
2013-10-14 Robert Dewar <dewar@adacore.com>
|
2013-10-14 Robert Dewar <dewar@adacore.com>
|
||||||
|
|
||||||
* sem_res.adb: Minor fix to error message text.
|
* sem_res.adb: Minor fix to error message text.
|
||||||
|
|
|
||||||
|
|
@ -861,6 +861,16 @@ package body Ada.Exceptions is
|
||||||
-- in case we do not want any exception tracing support. This is
|
-- in case we do not want any exception tracing support. This is
|
||||||
-- why this package is separated.
|
-- why this package is separated.
|
||||||
|
|
||||||
|
--------------------------------------
|
||||||
|
-- Get_Exception_Machine_Occurrence --
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
function Get_Exception_Machine_Occurrence (X : Exception_Occurrence)
|
||||||
|
return System.Address is
|
||||||
|
begin
|
||||||
|
return X.Machine_Occurrence;
|
||||||
|
end Get_Exception_Machine_Occurrence;
|
||||||
|
|
||||||
-----------
|
-----------
|
||||||
-- Image --
|
-- Image --
|
||||||
-----------
|
-----------
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
-- --
|
-- --
|
||||||
-- S p e c --
|
-- S p e c --
|
||||||
-- --
|
-- --
|
||||||
-- Copyright (C) 1992-2012, Free Software Foundation, Inc. --
|
-- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
|
||||||
-- --
|
-- --
|
||||||
-- This specification is derived from the Ada Reference Manual for use with --
|
-- This specification is derived from the Ada Reference Manual for use with --
|
||||||
-- GNAT. The copyright notice above, and the license provisions that follow --
|
-- GNAT. The copyright notice above, and the license provisions that follow --
|
||||||
|
|
@ -51,12 +51,8 @@ with System.Standard_Library;
|
||||||
with System.Traceback_Entries;
|
with System.Traceback_Entries;
|
||||||
|
|
||||||
package Ada.Exceptions is
|
package Ada.Exceptions is
|
||||||
pragma Warnings (Off);
|
|
||||||
pragma Preelaborate_05;
|
pragma Preelaborate_05;
|
||||||
pragma Warnings (On);
|
-- In accordance with Ada 2005 AI-362.
|
||||||
-- In accordance with Ada 2005 AI-362. The warnings pragmas are so that we
|
|
||||||
-- can compile this using older compiler versions, which will ignore the
|
|
||||||
-- pragma, which is fine for the bootstrap.
|
|
||||||
|
|
||||||
type Exception_Id is private;
|
type Exception_Id is private;
|
||||||
pragma Preelaborable_Initialization (Exception_Id);
|
pragma Preelaborable_Initialization (Exception_Id);
|
||||||
|
|
@ -337,6 +333,15 @@ private
|
||||||
-- this, and it would not work right, because of the Msg and Tracebacks
|
-- this, and it would not work right, because of the Msg and Tracebacks
|
||||||
-- fields which have unused entries not copied by Save_Occurrence.
|
-- fields which have unused entries not copied by Save_Occurrence.
|
||||||
|
|
||||||
|
function Get_Exception_Machine_Occurrence (X : Exception_Occurrence)
|
||||||
|
return System.Address;
|
||||||
|
pragma Export (Ada, Get_Exception_Machine_Occurrence,
|
||||||
|
"__gnat_get_exception_machine_occurrence");
|
||||||
|
-- Get the machine occurrence corresponding to an exception occurrence.
|
||||||
|
-- It is Null_Address if there is no machine occurrence (in runtimes that
|
||||||
|
-- doesn't use GCC mechanism) or if it has been lost (Save_Occurrence
|
||||||
|
-- doesn't save the machine occurrence).
|
||||||
|
|
||||||
function EO_To_String (X : Exception_Occurrence) return String;
|
function EO_To_String (X : Exception_Occurrence) return String;
|
||||||
function String_To_EO (S : String) return Exception_Occurrence;
|
function String_To_EO (S : String) return Exception_Occurrence;
|
||||||
pragma Stream_Convert (Exception_Occurrence, String_To_EO, EO_To_String);
|
pragma Stream_Convert (Exception_Occurrence, String_To_EO, EO_To_String);
|
||||||
|
|
|
||||||
|
|
@ -6885,7 +6885,7 @@ package body Exp_Attr is
|
||||||
-- Function to check whether the specified run-time call is available
|
-- Function to check whether the specified run-time call is available
|
||||||
-- in the run time used. In the case of a configurable run time, it
|
-- in the run time used. In the case of a configurable run time, it
|
||||||
-- is normal that some subprograms are not there.
|
-- is normal that some subprograms are not there.
|
||||||
|
--
|
||||||
-- I don't understand this routine at all, why is this not just a
|
-- I don't understand this routine at all, why is this not just a
|
||||||
-- call to RTE_Available? And if for some reason we need a different
|
-- call to RTE_Available? And if for some reason we need a different
|
||||||
-- routine with different semantics, why is not in Rtsfind ???
|
-- routine with different semantics, why is not in Rtsfind ???
|
||||||
|
|
@ -6899,8 +6899,7 @@ package body Exp_Attr is
|
||||||
-- Assume that the unit will always be available when using a
|
-- Assume that the unit will always be available when using a
|
||||||
-- "normal" (not configurable) run time.
|
-- "normal" (not configurable) run time.
|
||||||
|
|
||||||
return not Configurable_Run_Time_Mode
|
return not Configurable_Run_Time_Mode or else RTE_Available (Entity);
|
||||||
or else RTE_Available (Entity);
|
|
||||||
end Is_Available;
|
end Is_Available;
|
||||||
|
|
||||||
-- Start of processing for Find_Stream_Subprogram
|
-- Start of processing for Find_Stream_Subprogram
|
||||||
|
|
@ -6935,9 +6934,148 @@ package body Exp_Attr is
|
||||||
and then
|
and then
|
||||||
not Is_Predefined_File_Name (Unit_File_Name (Current_Sem_Unit))
|
not Is_Predefined_File_Name (Unit_File_Name (Current_Sem_Unit))
|
||||||
then
|
then
|
||||||
|
-- Storage_Array as defined in package System.Storage_Elements
|
||||||
|
|
||||||
|
if Is_RTE (Base_Typ, RE_Storage_Array) then
|
||||||
|
|
||||||
|
-- Case of No_Stream_Optimizations restriction active
|
||||||
|
|
||||||
|
if Restriction_Active (No_Stream_Optimizations) then
|
||||||
|
if Nam = TSS_Stream_Input
|
||||||
|
and then Is_Available (RE_Storage_Array_Input)
|
||||||
|
then
|
||||||
|
return RTE (RE_Storage_Array_Input);
|
||||||
|
|
||||||
|
elsif Nam = TSS_Stream_Output
|
||||||
|
and then Is_Available (RE_Storage_Array_Output)
|
||||||
|
then
|
||||||
|
return RTE (RE_Storage_Array_Output);
|
||||||
|
|
||||||
|
elsif Nam = TSS_Stream_Read
|
||||||
|
and then Is_Available (RE_Storage_Array_Read)
|
||||||
|
then
|
||||||
|
return RTE (RE_Storage_Array_Read);
|
||||||
|
|
||||||
|
elsif Nam = TSS_Stream_Write
|
||||||
|
and then Is_Available (RE_Storage_Array_Write)
|
||||||
|
then
|
||||||
|
return RTE (RE_Storage_Array_Write);
|
||||||
|
|
||||||
|
elsif Nam /= TSS_Stream_Input and then
|
||||||
|
Nam /= TSS_Stream_Output and then
|
||||||
|
Nam /= TSS_Stream_Read and then
|
||||||
|
Nam /= TSS_Stream_Write
|
||||||
|
then
|
||||||
|
raise Program_Error;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- Restriction No_Stream_Optimizations is not set, so we can go
|
||||||
|
-- ahead and optimize using the block IO forms of the routines.
|
||||||
|
|
||||||
|
else
|
||||||
|
if Nam = TSS_Stream_Input
|
||||||
|
and then Is_Available (RE_Storage_Array_Input_Blk_IO)
|
||||||
|
then
|
||||||
|
return RTE (RE_Storage_Array_Input_Blk_IO);
|
||||||
|
|
||||||
|
elsif Nam = TSS_Stream_Output
|
||||||
|
and then Is_Available (RE_Storage_Array_Output_Blk_IO)
|
||||||
|
then
|
||||||
|
return RTE (RE_Storage_Array_Output_Blk_IO);
|
||||||
|
|
||||||
|
elsif Nam = TSS_Stream_Read
|
||||||
|
and then Is_Available (RE_Storage_Array_Read_Blk_IO)
|
||||||
|
then
|
||||||
|
return RTE (RE_Storage_Array_Read_Blk_IO);
|
||||||
|
|
||||||
|
elsif Nam = TSS_Stream_Write
|
||||||
|
and then Is_Available (RE_Storage_Array_Write_Blk_IO)
|
||||||
|
then
|
||||||
|
return RTE (RE_Storage_Array_Write_Blk_IO);
|
||||||
|
|
||||||
|
elsif Nam /= TSS_Stream_Input and then
|
||||||
|
Nam /= TSS_Stream_Output and then
|
||||||
|
Nam /= TSS_Stream_Read and then
|
||||||
|
Nam /= TSS_Stream_Write
|
||||||
|
then
|
||||||
|
raise Program_Error;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- Stream_Element_Array as defined in package Ada.Streams
|
||||||
|
|
||||||
|
elsif Is_RTE (Base_Typ, RE_Stream_Element_Array) then
|
||||||
|
|
||||||
|
-- Case of No_Stream_Optimizations restriction active
|
||||||
|
|
||||||
|
if Restriction_Active (No_Stream_Optimizations) then
|
||||||
|
if Nam = TSS_Stream_Input
|
||||||
|
and then Is_Available (RE_Stream_Element_Array_Input)
|
||||||
|
then
|
||||||
|
return RTE (RE_Stream_Element_Array_Input);
|
||||||
|
|
||||||
|
elsif Nam = TSS_Stream_Output
|
||||||
|
and then Is_Available (RE_Stream_Element_Array_Output)
|
||||||
|
then
|
||||||
|
return RTE (RE_Stream_Element_Array_Output);
|
||||||
|
|
||||||
|
elsif Nam = TSS_Stream_Read
|
||||||
|
and then Is_Available (RE_Stream_Element_Array_Read)
|
||||||
|
then
|
||||||
|
return RTE (RE_Stream_Element_Array_Read);
|
||||||
|
|
||||||
|
elsif Nam = TSS_Stream_Write
|
||||||
|
and then Is_Available (RE_Stream_Element_Array_Write)
|
||||||
|
then
|
||||||
|
return RTE (RE_Stream_Element_Array_Write);
|
||||||
|
|
||||||
|
elsif Nam /= TSS_Stream_Input and then
|
||||||
|
Nam /= TSS_Stream_Output and then
|
||||||
|
Nam /= TSS_Stream_Read and then
|
||||||
|
Nam /= TSS_Stream_Write
|
||||||
|
then
|
||||||
|
raise Program_Error;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- Restriction No_Stream_Optimizations is not set, so we can go
|
||||||
|
-- ahead and optimize using the block IO forms of the routines.
|
||||||
|
|
||||||
|
else
|
||||||
|
if Nam = TSS_Stream_Input
|
||||||
|
and then Is_Available (RE_Stream_Element_Array_Input_Blk_IO)
|
||||||
|
then
|
||||||
|
return RTE (RE_Stream_Element_Array_Input_Blk_IO);
|
||||||
|
|
||||||
|
elsif Nam = TSS_Stream_Output
|
||||||
|
and then Is_Available (RE_Stream_Element_Array_Output_Blk_IO)
|
||||||
|
then
|
||||||
|
return RTE (RE_Stream_Element_Array_Output_Blk_IO);
|
||||||
|
|
||||||
|
elsif Nam = TSS_Stream_Read
|
||||||
|
and then Is_Available (RE_Stream_Element_Array_Read_Blk_IO)
|
||||||
|
then
|
||||||
|
return RTE (RE_Stream_Element_Array_Read_Blk_IO);
|
||||||
|
|
||||||
|
elsif Nam = TSS_Stream_Write
|
||||||
|
and then Is_Available (RE_Stream_Element_Array_Write_Blk_IO)
|
||||||
|
then
|
||||||
|
return RTE (RE_Stream_Element_Array_Write_Blk_IO);
|
||||||
|
|
||||||
|
elsif Nam /= TSS_Stream_Input and then
|
||||||
|
Nam /= TSS_Stream_Output and then
|
||||||
|
Nam /= TSS_Stream_Read and then
|
||||||
|
Nam /= TSS_Stream_Write
|
||||||
|
then
|
||||||
|
raise Program_Error;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
|
||||||
-- String as defined in package Ada
|
-- String as defined in package Ada
|
||||||
|
|
||||||
if Base_Typ = Standard_String then
|
elsif Base_Typ = Standard_String then
|
||||||
|
|
||||||
|
-- Case of No_Stream_Optimizations restriction active
|
||||||
|
|
||||||
if Restriction_Active (No_Stream_Optimizations) then
|
if Restriction_Active (No_Stream_Optimizations) then
|
||||||
if Nam = TSS_Stream_Input
|
if Nam = TSS_Stream_Input
|
||||||
and then Is_Available (RE_String_Input)
|
and then Is_Available (RE_String_Input)
|
||||||
|
|
@ -6967,6 +7105,9 @@ package body Exp_Attr is
|
||||||
raise Program_Error;
|
raise Program_Error;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
|
-- Restriction No_Stream_Optimizations is not set, so we can go
|
||||||
|
-- ahead and optimize using the block IO forms of the routines.
|
||||||
|
|
||||||
else
|
else
|
||||||
if Nam = TSS_Stream_Input
|
if Nam = TSS_Stream_Input
|
||||||
and then Is_Available (RE_String_Input_Blk_IO)
|
and then Is_Available (RE_String_Input_Blk_IO)
|
||||||
|
|
@ -7000,6 +7141,9 @@ package body Exp_Attr is
|
||||||
-- Wide_String as defined in package Ada
|
-- Wide_String as defined in package Ada
|
||||||
|
|
||||||
elsif Base_Typ = Standard_Wide_String then
|
elsif Base_Typ = Standard_Wide_String then
|
||||||
|
|
||||||
|
-- Case of No_Stream_Optimizations restriction active
|
||||||
|
|
||||||
if Restriction_Active (No_Stream_Optimizations) then
|
if Restriction_Active (No_Stream_Optimizations) then
|
||||||
if Nam = TSS_Stream_Input
|
if Nam = TSS_Stream_Input
|
||||||
and then Is_Available (RE_Wide_String_Input)
|
and then Is_Available (RE_Wide_String_Input)
|
||||||
|
|
@ -7029,6 +7173,9 @@ package body Exp_Attr is
|
||||||
raise Program_Error;
|
raise Program_Error;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
|
-- Restriction No_Stream_Optimizations is not set, so we can go
|
||||||
|
-- ahead and optimize using the block IO forms of the routines.
|
||||||
|
|
||||||
else
|
else
|
||||||
if Nam = TSS_Stream_Input
|
if Nam = TSS_Stream_Input
|
||||||
and then Is_Available (RE_Wide_String_Input_Blk_IO)
|
and then Is_Available (RE_Wide_String_Input_Blk_IO)
|
||||||
|
|
@ -7062,6 +7209,9 @@ package body Exp_Attr is
|
||||||
-- Wide_Wide_String as defined in package Ada
|
-- Wide_Wide_String as defined in package Ada
|
||||||
|
|
||||||
elsif Base_Typ = Standard_Wide_Wide_String then
|
elsif Base_Typ = Standard_Wide_Wide_String then
|
||||||
|
|
||||||
|
-- Case of No_Stream_Optimizations restriction active
|
||||||
|
|
||||||
if Restriction_Active (No_Stream_Optimizations) then
|
if Restriction_Active (No_Stream_Optimizations) then
|
||||||
if Nam = TSS_Stream_Input
|
if Nam = TSS_Stream_Input
|
||||||
and then Is_Available (RE_Wide_Wide_String_Input)
|
and then Is_Available (RE_Wide_Wide_String_Input)
|
||||||
|
|
@ -7091,6 +7241,9 @@ package body Exp_Attr is
|
||||||
raise Program_Error;
|
raise Program_Error;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
|
-- Restriction No_Stream_Optimizations is not set, so we can go
|
||||||
|
-- ahead and optimize using the block IO forms of the routines.
|
||||||
|
|
||||||
else
|
else
|
||||||
if Nam = TSS_Stream_Input
|
if Nam = TSS_Stream_Input
|
||||||
and then Is_Available (RE_Wide_Wide_String_Input_Blk_IO)
|
and then Is_Available (RE_Wide_Wide_String_Input_Blk_IO)
|
||||||
|
|
@ -7123,9 +7276,7 @@ package body Exp_Attr is
|
||||||
end if;
|
end if;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
if Is_Tagged_Type (Typ)
|
if Is_Tagged_Type (Typ) and then Is_Derived_Type (Typ) then
|
||||||
and then Is_Derived_Type (Typ)
|
|
||||||
then
|
|
||||||
return Find_Prim_Op (Typ, Nam);
|
return Find_Prim_Op (Typ, Nam);
|
||||||
else
|
else
|
||||||
return Find_Inherited_TSS (Typ, Nam);
|
return Find_Inherited_TSS (Typ, Nam);
|
||||||
|
|
|
||||||
|
|
@ -1463,3 +1463,10 @@ __gnat_personality_seh0 (PEXCEPTION_RECORD ms_exc, void *this_frame,
|
||||||
ms_disp, __gnat_personality_imp);
|
ms_disp, __gnat_personality_imp);
|
||||||
}
|
}
|
||||||
#endif /* SEH */
|
#endif /* SEH */
|
||||||
|
|
||||||
|
#if !defined (__USING_SJLJ_EXCEPTIONS__)
|
||||||
|
/* Size of the _Unwind_Exception structure. This is used by g-cppexc to get
|
||||||
|
the offset to the C++ object. */
|
||||||
|
|
||||||
|
const int __gnat_unwind_exception_size = sizeof (_Unwind_Exception);
|
||||||
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -591,6 +591,7 @@ package Rtsfind is
|
||||||
|
|
||||||
RE_Root_Stream_Type, -- Ada.Streams
|
RE_Root_Stream_Type, -- Ada.Streams
|
||||||
RE_Stream_Element, -- Ada.Streams
|
RE_Stream_Element, -- Ada.Streams
|
||||||
|
RE_Stream_Element_Array, -- Ada.Streams
|
||||||
RE_Stream_Element_Offset, -- Ada.Streams
|
RE_Stream_Element_Offset, -- Ada.Streams
|
||||||
|
|
||||||
RE_Stream_Access, -- Ada.Streams.Stream_IO
|
RE_Stream_Access, -- Ada.Streams.Stream_IO
|
||||||
|
|
@ -1477,6 +1478,24 @@ package Rtsfind is
|
||||||
RE_W_WC, -- System.Stream_Attributes
|
RE_W_WC, -- System.Stream_Attributes
|
||||||
RE_W_WWC, -- System.Stream_Attributes
|
RE_W_WWC, -- System.Stream_Attributes
|
||||||
|
|
||||||
|
RE_Storage_Array_Input, -- System.Strings.Stream_Ops
|
||||||
|
RE_Storage_Array_Input_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
|
RE_Storage_Array_Output, -- System.Strings.Stream_Ops
|
||||||
|
RE_Storage_Array_Output_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
|
RE_Storage_Array_Read, -- System.Strings.Stream_Ops
|
||||||
|
RE_Storage_Array_Read_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
|
RE_Storage_Array_Write, -- System.Strings.Stream_Ops
|
||||||
|
RE_Storage_Array_Write_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
|
|
||||||
|
RE_Stream_Element_Array_Input, -- System.Strings.Stream_Ops
|
||||||
|
RE_Stream_Element_Array_Input_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
|
RE_Stream_Element_Array_Output, -- System.Strings.Stream_Ops
|
||||||
|
RE_Stream_Element_Array_Output_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
|
RE_Stream_Element_Array_Read, -- System.Strings.Stream_Ops
|
||||||
|
RE_Stream_Element_Array_Read_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
|
RE_Stream_Element_Array_Write, -- System.Strings.Stream_Ops
|
||||||
|
RE_Stream_Element_Array_Write_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
|
|
||||||
RE_String_Input, -- System.Strings.Stream_Ops
|
RE_String_Input, -- System.Strings.Stream_Ops
|
||||||
RE_String_Input_Blk_IO, -- System.Strings.Stream_Ops
|
RE_String_Input_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
RE_String_Output, -- System.Strings.Stream_Ops
|
RE_String_Output, -- System.Strings.Stream_Ops
|
||||||
|
|
@ -1485,6 +1504,7 @@ package Rtsfind is
|
||||||
RE_String_Read_Blk_IO, -- System.Strings.Stream_Ops
|
RE_String_Read_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
RE_String_Write, -- System.Strings.Stream_Ops
|
RE_String_Write, -- System.Strings.Stream_Ops
|
||||||
RE_String_Write_Blk_IO, -- System.Strings.Stream_Ops
|
RE_String_Write_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
|
|
||||||
RE_Wide_String_Input, -- System.Strings.Stream_Ops
|
RE_Wide_String_Input, -- System.Strings.Stream_Ops
|
||||||
RE_Wide_String_Input_Blk_IO, -- System.Strings.Stream_Ops
|
RE_Wide_String_Input_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
RE_Wide_String_Output, -- System.Strings.Stream_Ops
|
RE_Wide_String_Output, -- System.Strings.Stream_Ops
|
||||||
|
|
@ -1493,6 +1513,7 @@ package Rtsfind is
|
||||||
RE_Wide_String_Read_Blk_IO, -- System.Strings.Stream_Ops
|
RE_Wide_String_Read_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
RE_Wide_String_Write, -- System.Strings.Stream_Ops
|
RE_Wide_String_Write, -- System.Strings.Stream_Ops
|
||||||
RE_Wide_String_Write_Blk_IO, -- System.Strings.Stream_Ops
|
RE_Wide_String_Write_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
|
|
||||||
RE_Wide_Wide_String_Input, -- System.Strings.Stream_Ops
|
RE_Wide_Wide_String_Input, -- System.Strings.Stream_Ops
|
||||||
RE_Wide_Wide_String_Input_Blk_IO, -- System.Strings.Stream_Ops
|
RE_Wide_Wide_String_Input_Blk_IO, -- System.Strings.Stream_Ops
|
||||||
RE_Wide_Wide_String_Output, -- System.Strings.Stream_Ops
|
RE_Wide_Wide_String_Output, -- System.Strings.Stream_Ops
|
||||||
|
|
@ -1844,6 +1865,7 @@ package Rtsfind is
|
||||||
|
|
||||||
RE_Root_Stream_Type => Ada_Streams,
|
RE_Root_Stream_Type => Ada_Streams,
|
||||||
RE_Stream_Element => Ada_Streams,
|
RE_Stream_Element => Ada_Streams,
|
||||||
|
RE_Stream_Element_Array => Ada_Streams,
|
||||||
RE_Stream_Element_Offset => Ada_Streams,
|
RE_Stream_Element_Offset => Ada_Streams,
|
||||||
|
|
||||||
RE_Stream_Access => Ada_Streams_Stream_IO,
|
RE_Stream_Access => Ada_Streams_Stream_IO,
|
||||||
|
|
@ -2734,6 +2756,24 @@ package Rtsfind is
|
||||||
RE_W_WC => System_Stream_Attributes,
|
RE_W_WC => System_Stream_Attributes,
|
||||||
RE_W_WWC => System_Stream_Attributes,
|
RE_W_WWC => System_Stream_Attributes,
|
||||||
|
|
||||||
|
RE_Storage_Array_Input => System_Strings_Stream_Ops,
|
||||||
|
RE_Storage_Array_Input_Blk_IO => System_Strings_Stream_Ops,
|
||||||
|
RE_Storage_Array_Output => System_Strings_Stream_Ops,
|
||||||
|
RE_Storage_Array_Output_Blk_IO => System_Strings_Stream_Ops,
|
||||||
|
RE_Storage_Array_Read => System_Strings_Stream_Ops,
|
||||||
|
RE_Storage_Array_Read_Blk_IO => System_Strings_Stream_Ops,
|
||||||
|
RE_Storage_Array_Write => System_Strings_Stream_Ops,
|
||||||
|
RE_Storage_Array_Write_Blk_IO => System_Strings_Stream_Ops,
|
||||||
|
|
||||||
|
RE_Stream_Element_Array_Input => System_Strings_Stream_Ops,
|
||||||
|
RE_Stream_Element_Array_Input_Blk_IO => System_Strings_Stream_Ops,
|
||||||
|
RE_Stream_Element_Array_Output => System_Strings_Stream_Ops,
|
||||||
|
RE_Stream_Element_Array_Output_Blk_IO => System_Strings_Stream_Ops,
|
||||||
|
RE_Stream_Element_Array_Read => System_Strings_Stream_Ops,
|
||||||
|
RE_Stream_Element_Array_Read_Blk_IO => System_Strings_Stream_Ops,
|
||||||
|
RE_Stream_Element_Array_Write => System_Strings_Stream_Ops,
|
||||||
|
RE_Stream_Element_Array_Write_Blk_IO => System_Strings_Stream_Ops,
|
||||||
|
|
||||||
RE_String_Input => System_Strings_Stream_Ops,
|
RE_String_Input => System_Strings_Stream_Ops,
|
||||||
RE_String_Input_Blk_IO => System_Strings_Stream_Ops,
|
RE_String_Input_Blk_IO => System_Strings_Stream_Ops,
|
||||||
RE_String_Output => System_Strings_Stream_Ops,
|
RE_String_Output => System_Strings_Stream_Ops,
|
||||||
|
|
@ -2742,6 +2782,7 @@ package Rtsfind is
|
||||||
RE_String_Read_Blk_IO => System_Strings_Stream_Ops,
|
RE_String_Read_Blk_IO => System_Strings_Stream_Ops,
|
||||||
RE_String_Write => System_Strings_Stream_Ops,
|
RE_String_Write => System_Strings_Stream_Ops,
|
||||||
RE_String_Write_Blk_IO => System_Strings_Stream_Ops,
|
RE_String_Write_Blk_IO => System_Strings_Stream_Ops,
|
||||||
|
|
||||||
RE_Wide_String_Input => System_Strings_Stream_Ops,
|
RE_Wide_String_Input => System_Strings_Stream_Ops,
|
||||||
RE_Wide_String_Input_Blk_IO => System_Strings_Stream_Ops,
|
RE_Wide_String_Input_Blk_IO => System_Strings_Stream_Ops,
|
||||||
RE_Wide_String_Output => System_Strings_Stream_Ops,
|
RE_Wide_String_Output => System_Strings_Stream_Ops,
|
||||||
|
|
@ -2749,6 +2790,7 @@ package Rtsfind is
|
||||||
RE_Wide_String_Read => System_Strings_Stream_Ops,
|
RE_Wide_String_Read => System_Strings_Stream_Ops,
|
||||||
RE_Wide_String_Read_Blk_IO => System_Strings_Stream_Ops,
|
RE_Wide_String_Read_Blk_IO => System_Strings_Stream_Ops,
|
||||||
RE_Wide_String_Write => System_Strings_Stream_Ops,
|
RE_Wide_String_Write => System_Strings_Stream_Ops,
|
||||||
|
|
||||||
RE_Wide_String_Write_Blk_IO => System_Strings_Stream_Ops,
|
RE_Wide_String_Write_Blk_IO => System_Strings_Stream_Ops,
|
||||||
RE_Wide_Wide_String_Input => System_Strings_Stream_Ops,
|
RE_Wide_Wide_String_Input => System_Strings_Stream_Ops,
|
||||||
RE_Wide_Wide_String_Input_Blk_IO => System_Strings_Stream_Ops,
|
RE_Wide_Wide_String_Input_Blk_IO => System_Strings_Stream_Ops,
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
-- --
|
-- --
|
||||||
-- B o d y --
|
-- B o d y --
|
||||||
-- --
|
-- --
|
||||||
-- Copyright (C) 2008-2010, Free Software Foundation, Inc. --
|
-- Copyright (C) 2008-2013, Free Software Foundation, Inc. --
|
||||||
-- --
|
-- --
|
||||||
-- GNAT is free software; you can redistribute it and/or modify it under --
|
-- GNAT is free software; you can redistribute it and/or modify it under --
|
||||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||||
|
|
@ -35,7 +35,9 @@ with Ada.Streams; use Ada.Streams;
|
||||||
with Ada.Streams.Stream_IO; use Ada.Streams.Stream_IO;
|
with Ada.Streams.Stream_IO; use Ada.Streams.Stream_IO;
|
||||||
with Ada.Unchecked_Conversion;
|
with Ada.Unchecked_Conversion;
|
||||||
|
|
||||||
with System.Stream_Attributes; use System;
|
with System; use System;
|
||||||
|
with System.Storage_Elements; use System.Storage_Elements;
|
||||||
|
with System.Stream_Attributes;
|
||||||
|
|
||||||
package body System.Strings.Stream_Ops is
|
package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
|
|
@ -46,31 +48,32 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
-- The following package provides an IO framework for strings. Depending
|
-- The following package provides an IO framework for strings. Depending
|
||||||
-- on the version of System.Stream_Attributes as well as the size of
|
-- on the version of System.Stream_Attributes as well as the size of
|
||||||
-- formal parameter Character_Type, the package will either utilize block
|
-- formal parameter Element_Type, the package will either utilize block
|
||||||
-- IO or character-by-character IO.
|
-- IO or element-by-element IO.
|
||||||
|
|
||||||
generic
|
generic
|
||||||
type Character_Type is private;
|
type Element_Type is private;
|
||||||
type String_Type is array (Positive range <>) of Character_Type;
|
type Index_Type is range <>;
|
||||||
|
type Array_Type is array (Index_Type range <>) of Element_Type;
|
||||||
|
|
||||||
package Stream_Ops_Internal is
|
package Stream_Ops_Internal is
|
||||||
function Input
|
function Input
|
||||||
(Strm : access Root_Stream_Type'Class;
|
(Strm : access Root_Stream_Type'Class;
|
||||||
IO : IO_Kind) return String_Type;
|
IO : IO_Kind) return Array_Type;
|
||||||
|
|
||||||
procedure Output
|
procedure Output
|
||||||
(Strm : access Root_Stream_Type'Class;
|
(Strm : access Root_Stream_Type'Class;
|
||||||
Item : String_Type;
|
Item : Array_Type;
|
||||||
IO : IO_Kind);
|
IO : IO_Kind);
|
||||||
|
|
||||||
procedure Read
|
procedure Read
|
||||||
(Strm : access Root_Stream_Type'Class;
|
(Strm : access Root_Stream_Type'Class;
|
||||||
Item : out String_Type;
|
Item : out Array_Type;
|
||||||
IO : IO_Kind);
|
IO : IO_Kind);
|
||||||
|
|
||||||
procedure Write
|
procedure Write
|
||||||
(Strm : access Root_Stream_Type'Class;
|
(Strm : access Root_Stream_Type'Class;
|
||||||
Item : String_Type;
|
Item : Array_Type;
|
||||||
IO : IO_Kind);
|
IO : IO_Kind);
|
||||||
end Stream_Ops_Internal;
|
end Stream_Ops_Internal;
|
||||||
|
|
||||||
|
|
@ -86,31 +89,36 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
Default_Block_Size : constant := 512 * 8;
|
Default_Block_Size : constant := 512 * 8;
|
||||||
|
|
||||||
-- Shorthand notation for stream element and character sizes
|
-- Shorthand notation for stream element and element type sizes
|
||||||
|
|
||||||
C_Size : constant Integer := Character_Type'Size;
|
ET_Size : constant Integer := Element_Type'Size;
|
||||||
SE_Size : constant Integer := Stream_Element'Size;
|
SE_Size : constant Integer := Stream_Element'Size;
|
||||||
|
|
||||||
-- The following constants describe the number of stream elements or
|
-- The following constants describe the number of array elements or
|
||||||
-- characters that can fit into a default block.
|
-- stream elements that can fit into a default block.
|
||||||
|
|
||||||
|
AE_In_Default_Block : constant Index_Type :=
|
||||||
|
Index_Type (Default_Block_Size / ET_Size);
|
||||||
|
-- Number of array elements in a default block
|
||||||
|
|
||||||
C_In_Default_Block : constant Integer := Default_Block_Size / C_Size;
|
|
||||||
SE_In_Default_Block : constant Integer := Default_Block_Size / SE_Size;
|
SE_In_Default_Block : constant Integer := Default_Block_Size / SE_Size;
|
||||||
|
-- Number of storage elements in a default block
|
||||||
|
|
||||||
-- Buffer types
|
-- Buffer types
|
||||||
|
|
||||||
subtype Default_Block is Stream_Element_Array
|
subtype Default_Block is Stream_Element_Array
|
||||||
(1 .. Stream_Element_Offset (SE_In_Default_Block));
|
(1 .. Stream_Element_Offset (SE_In_Default_Block));
|
||||||
|
|
||||||
subtype String_Block is String_Type (1 .. C_In_Default_Block);
|
subtype Array_Block is
|
||||||
|
Array_Type (Index_Type range 1 .. AE_In_Default_Block);
|
||||||
|
|
||||||
-- Conversions to and from Default_Block
|
-- Conversions to and from Default_Block
|
||||||
|
|
||||||
function To_Default_Block is
|
function To_Default_Block is
|
||||||
new Ada.Unchecked_Conversion (String_Block, Default_Block);
|
new Ada.Unchecked_Conversion (Array_Block, Default_Block);
|
||||||
|
|
||||||
function To_String_Block is
|
function To_Array_Block is
|
||||||
new Ada.Unchecked_Conversion (Default_Block, String_Block);
|
new Ada.Unchecked_Conversion (Default_Block, Array_Block);
|
||||||
|
|
||||||
-----------
|
-----------
|
||||||
-- Input --
|
-- Input --
|
||||||
|
|
@ -118,7 +126,7 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
function Input
|
function Input
|
||||||
(Strm : access Root_Stream_Type'Class;
|
(Strm : access Root_Stream_Type'Class;
|
||||||
IO : IO_Kind) return String_Type
|
IO : IO_Kind) return Array_Type
|
||||||
is
|
is
|
||||||
begin
|
begin
|
||||||
if Strm = null then
|
if Strm = null then
|
||||||
|
|
@ -126,23 +134,21 @@ package body System.Strings.Stream_Ops is
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
declare
|
declare
|
||||||
Low : Positive;
|
Low : Index_Type;
|
||||||
High : Positive;
|
High : Index_Type;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
-- Read the bounds of the string
|
-- Read the bounds of the string
|
||||||
|
|
||||||
Positive'Read (Strm, Low);
|
Index_Type'Read (Strm, Low);
|
||||||
Positive'Read (Strm, High);
|
Index_Type'Read (Strm, High);
|
||||||
|
|
||||||
declare
|
|
||||||
Item : String_Type (Low .. High);
|
|
||||||
|
|
||||||
begin
|
|
||||||
-- Read the character content of the string
|
-- Read the character content of the string
|
||||||
|
|
||||||
|
declare
|
||||||
|
Item : Array_Type (Low .. High);
|
||||||
|
begin
|
||||||
Read (Strm, Item, IO);
|
Read (Strm, Item, IO);
|
||||||
|
|
||||||
return Item;
|
return Item;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
@ -154,7 +160,7 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
procedure Output
|
procedure Output
|
||||||
(Strm : access Root_Stream_Type'Class;
|
(Strm : access Root_Stream_Type'Class;
|
||||||
Item : String_Type;
|
Item : Array_Type;
|
||||||
IO : IO_Kind)
|
IO : IO_Kind)
|
||||||
is
|
is
|
||||||
begin
|
begin
|
||||||
|
|
@ -164,8 +170,8 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
-- Write the bounds of the string
|
-- Write the bounds of the string
|
||||||
|
|
||||||
Positive'Write (Strm, Item'First);
|
Index_Type'Write (Strm, Item'First);
|
||||||
Positive'Write (Strm, Item'Last);
|
Index_Type'Write (Strm, Item'Last);
|
||||||
|
|
||||||
-- Write the character content of the string
|
-- Write the character content of the string
|
||||||
|
|
||||||
|
|
@ -178,7 +184,7 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
procedure Read
|
procedure Read
|
||||||
(Strm : access Root_Stream_Type'Class;
|
(Strm : access Root_Stream_Type'Class;
|
||||||
Item : out String_Type;
|
Item : out Array_Type;
|
||||||
IO : IO_Kind)
|
IO : IO_Kind)
|
||||||
is
|
is
|
||||||
begin
|
begin
|
||||||
|
|
@ -194,15 +200,13 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
-- Block IO
|
-- Block IO
|
||||||
|
|
||||||
if IO = Block_IO
|
if IO = Block_IO and then Stream_Attributes.Block_IO_OK then
|
||||||
and then Stream_Attributes.Block_IO_OK
|
|
||||||
then
|
|
||||||
declare
|
declare
|
||||||
-- Determine the size in BITS of the block necessary to contain
|
-- Determine the size in BITS of the block necessary to contain
|
||||||
-- the whole string.
|
-- the whole string.
|
||||||
|
|
||||||
Block_Size : constant Natural :=
|
Block_Size : constant Natural :=
|
||||||
(Item'Last - Item'First + 1) * C_Size;
|
Integer (Item'Last - Item'First + 1) * ET_Size;
|
||||||
|
|
||||||
-- Item can be larger than what the default block can store,
|
-- Item can be larger than what the default block can store,
|
||||||
-- determine the number of whole reads necessary to read the
|
-- determine the number of whole reads necessary to read the
|
||||||
|
|
@ -218,8 +222,8 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
-- String indexes
|
-- String indexes
|
||||||
|
|
||||||
Low : Positive := Item'First;
|
Low : Index_Type := Item'First;
|
||||||
High : Positive := Low + C_In_Default_Block - 1;
|
High : Index_Type := Low + AE_In_Default_Block - 1;
|
||||||
|
|
||||||
-- End of stream error detection
|
-- End of stream error detection
|
||||||
|
|
||||||
|
|
@ -237,10 +241,10 @@ package body System.Strings.Stream_Ops is
|
||||||
begin
|
begin
|
||||||
for Counter in 1 .. Blocks loop
|
for Counter in 1 .. Blocks loop
|
||||||
Read (Strm.all, Block, Last);
|
Read (Strm.all, Block, Last);
|
||||||
Item (Low .. High) := To_String_Block (Block);
|
Item (Low .. High) := To_Array_Block (Block);
|
||||||
|
|
||||||
Low := High + 1;
|
Low := High + 1;
|
||||||
High := Low + C_In_Default_Block - 1;
|
High := Low + AE_In_Default_Block - 1;
|
||||||
Sum := Sum + Last;
|
Sum := Sum + Last;
|
||||||
Last := 0;
|
Last := 0;
|
||||||
end loop;
|
end loop;
|
||||||
|
|
@ -254,17 +258,18 @@ package body System.Strings.Stream_Ops is
|
||||||
subtype Rem_Block is Stream_Element_Array
|
subtype Rem_Block is Stream_Element_Array
|
||||||
(1 .. Stream_Element_Offset (Rem_Size / SE_Size));
|
(1 .. Stream_Element_Offset (Rem_Size / SE_Size));
|
||||||
|
|
||||||
subtype Rem_String_Block is
|
subtype Rem_Array_Block is
|
||||||
String_Type (1 .. Rem_Size / C_Size);
|
Array_Type (Index_Type range
|
||||||
|
1 .. Index_Type (Rem_Size / ET_Size));
|
||||||
|
|
||||||
function To_Rem_String_Block is new
|
function To_Rem_Array_Block is new
|
||||||
Ada.Unchecked_Conversion (Rem_Block, Rem_String_Block);
|
Ada.Unchecked_Conversion (Rem_Block, Rem_Array_Block);
|
||||||
|
|
||||||
Block : Rem_Block;
|
Block : Rem_Block;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Read (Strm.all, Block, Last);
|
Read (Strm.all, Block, Last);
|
||||||
Item (Low .. Item'Last) := To_Rem_String_Block (Block);
|
Item (Low .. Item'Last) := To_Rem_Array_Block (Block);
|
||||||
|
|
||||||
Sum := Sum + Last;
|
Sum := Sum + Last;
|
||||||
end;
|
end;
|
||||||
|
|
@ -275,7 +280,7 @@ package body System.Strings.Stream_Ops is
|
||||||
-- words, the stream does not contain enough elements to fully
|
-- words, the stream does not contain enough elements to fully
|
||||||
-- populate Item.
|
-- populate Item.
|
||||||
|
|
||||||
if (Integer (Sum) * SE_Size) / C_Size < Item'Length then
|
if (Integer (Sum) * SE_Size) / ET_Size < Item'Length then
|
||||||
raise End_Error;
|
raise End_Error;
|
||||||
end if;
|
end if;
|
||||||
end;
|
end;
|
||||||
|
|
@ -284,12 +289,11 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
else
|
else
|
||||||
declare
|
declare
|
||||||
C : Character_Type;
|
E : Element_Type;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
for Index in Item'First .. Item'Last loop
|
for Index in Item'First .. Item'Last loop
|
||||||
Character_Type'Read (Strm, C);
|
Element_Type'Read (Strm, E);
|
||||||
Item (Index) := C;
|
Item (Index) := E;
|
||||||
end loop;
|
end loop;
|
||||||
end;
|
end;
|
||||||
end if;
|
end if;
|
||||||
|
|
@ -301,7 +305,7 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
procedure Write
|
procedure Write
|
||||||
(Strm : access Root_Stream_Type'Class;
|
(Strm : access Root_Stream_Type'Class;
|
||||||
Item : String_Type;
|
Item : Array_Type;
|
||||||
IO : IO_Kind)
|
IO : IO_Kind)
|
||||||
is
|
is
|
||||||
begin
|
begin
|
||||||
|
|
@ -317,14 +321,12 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
-- Block IO
|
-- Block IO
|
||||||
|
|
||||||
if IO = Block_IO
|
if IO = Block_IO and then Stream_Attributes.Block_IO_OK then
|
||||||
and then Stream_Attributes.Block_IO_OK
|
|
||||||
then
|
|
||||||
declare
|
declare
|
||||||
-- Determine the size in BITS of the block necessary to contain
|
-- Determine the size in BITS of the block necessary to contain
|
||||||
-- the whole string.
|
-- the whole string.
|
||||||
|
|
||||||
Block_Size : constant Natural := Item'Length * C_Size;
|
Block_Size : constant Natural := Item'Length * ET_Size;
|
||||||
|
|
||||||
-- Item can be larger than what the default block can store,
|
-- Item can be larger than what the default block can store,
|
||||||
-- determine the number of whole writes necessary to output the
|
-- determine the number of whole writes necessary to output the
|
||||||
|
|
@ -340,8 +342,8 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
-- String indexes
|
-- String indexes
|
||||||
|
|
||||||
Low : Positive := Item'First;
|
Low : Index_Type := Item'First;
|
||||||
High : Positive := Low + C_In_Default_Block - 1;
|
High : Index_Type := Low + AE_In_Default_Block - 1;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
-- Step 1: If the string is too large, write out individual
|
-- Step 1: If the string is too large, write out individual
|
||||||
|
|
@ -349,9 +351,8 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
for Counter in 1 .. Blocks loop
|
for Counter in 1 .. Blocks loop
|
||||||
Write (Strm.all, To_Default_Block (Item (Low .. High)));
|
Write (Strm.all, To_Default_Block (Item (Low .. High)));
|
||||||
|
|
||||||
Low := High + 1;
|
Low := High + 1;
|
||||||
High := Low + C_In_Default_Block - 1;
|
High := Low + AE_In_Default_Block - 1;
|
||||||
end loop;
|
end loop;
|
||||||
|
|
||||||
-- Step 2: Write out any remaining elements
|
-- Step 2: Write out any remaining elements
|
||||||
|
|
@ -361,11 +362,12 @@ package body System.Strings.Stream_Ops is
|
||||||
subtype Rem_Block is Stream_Element_Array
|
subtype Rem_Block is Stream_Element_Array
|
||||||
(1 .. Stream_Element_Offset (Rem_Size / SE_Size));
|
(1 .. Stream_Element_Offset (Rem_Size / SE_Size));
|
||||||
|
|
||||||
subtype Rem_String_Block is
|
subtype Rem_Array_Block is
|
||||||
String_Type (1 .. Rem_Size / C_Size);
|
Array_Type (Index_Type range
|
||||||
|
1 .. Index_Type (Rem_Size / ET_Size));
|
||||||
|
|
||||||
function To_Rem_Block is new
|
function To_Rem_Block is new
|
||||||
Ada.Unchecked_Conversion (Rem_String_Block, Rem_Block);
|
Ada.Unchecked_Conversion (Rem_Array_Block, Rem_Block);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Write (Strm.all, To_Rem_Block (Item (Low .. Item'Last)));
|
Write (Strm.all, To_Rem_Block (Item (Low .. Item'Last)));
|
||||||
|
|
@ -377,28 +379,233 @@ package body System.Strings.Stream_Ops is
|
||||||
|
|
||||||
else
|
else
|
||||||
for Index in Item'First .. Item'Last loop
|
for Index in Item'First .. Item'Last loop
|
||||||
Character_Type'Write (Strm, Item (Index));
|
Element_Type'Write (Strm, Item (Index));
|
||||||
end loop;
|
end loop;
|
||||||
end if;
|
end if;
|
||||||
end Write;
|
end Write;
|
||||||
end Stream_Ops_Internal;
|
end Stream_Ops_Internal;
|
||||||
|
|
||||||
-- Specific instantiations for all Ada string types
|
-- Specific instantiations for all Ada array types handled
|
||||||
|
|
||||||
|
package Storage_Array_Ops is
|
||||||
|
new Stream_Ops_Internal
|
||||||
|
(Element_Type => Storage_Element,
|
||||||
|
Index_Type => Storage_Offset,
|
||||||
|
Array_Type => Storage_Array);
|
||||||
|
|
||||||
|
package Stream_Element_Array_Ops is
|
||||||
|
new Stream_Ops_Internal
|
||||||
|
(Element_Type => Stream_Element,
|
||||||
|
Index_Type => Stream_Element_Offset,
|
||||||
|
Array_Type => Stream_Element_Array);
|
||||||
|
|
||||||
package String_Ops is
|
package String_Ops is
|
||||||
new Stream_Ops_Internal
|
new Stream_Ops_Internal
|
||||||
(Character_Type => Character,
|
(Element_Type => Character,
|
||||||
String_Type => String);
|
Index_Type => Positive,
|
||||||
|
Array_Type => String);
|
||||||
|
|
||||||
package Wide_String_Ops is
|
package Wide_String_Ops is
|
||||||
new Stream_Ops_Internal
|
new Stream_Ops_Internal
|
||||||
(Character_Type => Wide_Character,
|
(Element_Type => Wide_Character,
|
||||||
String_Type => Wide_String);
|
Index_Type => Positive,
|
||||||
|
Array_Type => Wide_String);
|
||||||
|
|
||||||
package Wide_Wide_String_Ops is
|
package Wide_Wide_String_Ops is
|
||||||
new Stream_Ops_Internal
|
new Stream_Ops_Internal
|
||||||
(Character_Type => Wide_Wide_Character,
|
(Element_Type => Wide_Wide_Character,
|
||||||
String_Type => Wide_Wide_String);
|
Index_Type => Positive,
|
||||||
|
Array_Type => Wide_Wide_String);
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
-- Storage_Array_Input --
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
function Storage_Array_Input
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class) return Storage_Array
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
return Storage_Array_Ops.Input (Strm, Byte_IO);
|
||||||
|
end Storage_Array_Input;
|
||||||
|
|
||||||
|
--------------------------------
|
||||||
|
-- Storage_Array_Input_Blk_IO --
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
function Storage_Array_Input_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class) return Storage_Array
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
return Storage_Array_Ops.Input (Strm, Block_IO);
|
||||||
|
end Storage_Array_Input_Blk_IO;
|
||||||
|
|
||||||
|
--------------------------
|
||||||
|
-- Storage_Array_Output --
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
procedure Storage_Array_Output
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : Storage_Array)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Storage_Array_Ops.Output (Strm, Item, Byte_IO);
|
||||||
|
end Storage_Array_Output;
|
||||||
|
|
||||||
|
---------------------------------
|
||||||
|
-- Storage_Array_Output_Blk_IO --
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
procedure Storage_Array_Output_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : Storage_Array)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Storage_Array_Ops.Output (Strm, Item, Block_IO);
|
||||||
|
end Storage_Array_Output_Blk_IO;
|
||||||
|
|
||||||
|
------------------------
|
||||||
|
-- Storage_Array_Read --
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
procedure Storage_Array_Read
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : out Storage_Array)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Storage_Array_Ops.Read (Strm, Item, Byte_IO);
|
||||||
|
end Storage_Array_Read;
|
||||||
|
|
||||||
|
-------------------------------
|
||||||
|
-- Storage_Array_Read_Blk_IO --
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
procedure Storage_Array_Read_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : out Storage_Array)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Storage_Array_Ops.Read (Strm, Item, Block_IO);
|
||||||
|
end Storage_Array_Read_Blk_IO;
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
-- Storage_Array_Write --
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
procedure Storage_Array_Write
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : Storage_Array)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Storage_Array_Ops.Write (Strm, Item, Byte_IO);
|
||||||
|
end Storage_Array_Write;
|
||||||
|
|
||||||
|
--------------------------------
|
||||||
|
-- Storage_Array_Write_Blk_IO --
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
procedure Storage_Array_Write_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : Storage_Array)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Storage_Array_Ops.Write (Strm, Item, Block_IO);
|
||||||
|
end Storage_Array_Write_Blk_IO;
|
||||||
|
|
||||||
|
--------------------------------
|
||||||
|
-- Stream_Element_Array_Input --
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
function Stream_Element_Array_Input
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class)
|
||||||
|
return Stream_Element_Array
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
return Stream_Element_Array_Ops.Input (Strm, Byte_IO);
|
||||||
|
end Stream_Element_Array_Input;
|
||||||
|
|
||||||
|
---------------------------------------
|
||||||
|
-- Stream_Element_Array_Input_Blk_IO --
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
function Stream_Element_Array_Input_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class)
|
||||||
|
return Stream_Element_Array
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
return Stream_Element_Array_Ops.Input (Strm, Block_IO);
|
||||||
|
end Stream_Element_Array_Input_Blk_IO;
|
||||||
|
|
||||||
|
---------------------------------
|
||||||
|
-- Stream_Element_Array_Output --
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
procedure Stream_Element_Array_Output
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : Stream_Element_Array)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Stream_Element_Array_Ops.Output (Strm, Item, Byte_IO);
|
||||||
|
end Stream_Element_Array_Output;
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
-- Stream_Element_Array_Output_Blk_IO --
|
||||||
|
----------------------------------------
|
||||||
|
|
||||||
|
procedure Stream_Element_Array_Output_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : Stream_Element_Array)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Stream_Element_Array_Ops.Output (Strm, Item, Block_IO);
|
||||||
|
end Stream_Element_Array_Output_Blk_IO;
|
||||||
|
|
||||||
|
-------------------------------
|
||||||
|
-- Stream_Element_Array_Read --
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
procedure Stream_Element_Array_Read
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : out Stream_Element_Array)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Stream_Element_Array_Ops.Read (Strm, Item, Byte_IO);
|
||||||
|
end Stream_Element_Array_Read;
|
||||||
|
|
||||||
|
--------------------------------------
|
||||||
|
-- Stream_Element_Array_Read_Blk_IO --
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
procedure Stream_Element_Array_Read_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : out Stream_Element_Array)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Stream_Element_Array_Ops.Read (Strm, Item, Block_IO);
|
||||||
|
end Stream_Element_Array_Read_Blk_IO;
|
||||||
|
|
||||||
|
--------------------------------
|
||||||
|
-- Stream_Element_Array_Write --
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
procedure Stream_Element_Array_Write
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : Stream_Element_Array)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Stream_Element_Array_Ops.Write (Strm, Item, Byte_IO);
|
||||||
|
end Stream_Element_Array_Write;
|
||||||
|
|
||||||
|
---------------------------------------
|
||||||
|
-- Stream_Element_Array_Write_Blk_IO --
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
procedure Stream_Element_Array_Write_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : Stream_Element_Array)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Stream_Element_Array_Ops.Write (Strm, Item, Block_IO);
|
||||||
|
end Stream_Element_Array_Write_Blk_IO;
|
||||||
|
|
||||||
------------------
|
------------------
|
||||||
-- String_Input --
|
-- String_Input --
|
||||||
|
|
|
||||||
|
|
@ -33,9 +33,14 @@
|
||||||
-- the following types using a "block IO" approach in which the entire data
|
-- the following types using a "block IO" approach in which the entire data
|
||||||
-- item is written in one operation, instead of writing individual characters.
|
-- item is written in one operation, instead of writing individual characters.
|
||||||
|
|
||||||
|
-- Ada.Stream_Element_Array
|
||||||
-- Ada.String
|
-- Ada.String
|
||||||
-- Ada.Wide_String
|
-- Ada.Wide_String
|
||||||
-- Ada.Wide_Wide_String
|
-- Ada.Wide_Wide_String
|
||||||
|
-- System.Storage_Array
|
||||||
|
|
||||||
|
-- Note: this routine is in Ada.Strings because historically it handled only
|
||||||
|
-- the string types. It is not worth moving it at this stage.
|
||||||
|
|
||||||
-- The compiler will generate references to the subprograms in this package
|
-- The compiler will generate references to the subprograms in this package
|
||||||
-- when expanding stream attributes for the above mentioned types. Example:
|
-- when expanding stream attributes for the above mentioned types. Example:
|
||||||
|
|
@ -48,21 +53,96 @@
|
||||||
-- or
|
-- or
|
||||||
-- String_Output_Blk_IO (Some_Stream, Some_String);
|
-- String_Output_Blk_IO (Some_Stream, Some_String);
|
||||||
|
|
||||||
-- This expansion occurs only if System.Stream_Attributes.Block_IO_OK returns
|
-- String_Output form is used if pragma Restrictions (No_String_Optimziations)
|
||||||
-- True, indicating that this approach is compatible with the expectations of
|
-- is active, which requires element by element operations. The BLK_IO form
|
||||||
-- System.Stream_Attributes. For the default implementation of this package,
|
-- is used if this restriction is not set, allowing block optimization.
|
||||||
-- there is no difference between writing the elements one by one using the
|
|
||||||
-- default output routine for the element type and writing the whole array
|
|
||||||
-- using block IO.
|
|
||||||
|
|
||||||
-- In addition,
|
-- Note that if System.Stream_Attributes.Block_IO_OK is False, then the BLK_IO
|
||||||
|
-- form is treated as equivalent to the normal case, so that the optimization
|
||||||
|
-- is inhibited anyway, regardless of the setting of the restriction. This
|
||||||
|
-- handles versions of System.Stream_Attributes (in particular the XDR version
|
||||||
|
-- found in s-stratt-xdr) which do not permit block io optimization.
|
||||||
|
|
||||||
pragma Compiler_Unit;
|
pragma Compiler_Unit;
|
||||||
|
|
||||||
with Ada.Streams;
|
with Ada.Streams;
|
||||||
|
|
||||||
|
with System.Storage_Elements;
|
||||||
|
|
||||||
package System.Strings.Stream_Ops is
|
package System.Strings.Stream_Ops is
|
||||||
|
|
||||||
|
-------------------------------------
|
||||||
|
-- Storage_Array stream operations --
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
function Storage_Array_Input
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class)
|
||||||
|
return System.Storage_Elements.Storage_Array;
|
||||||
|
|
||||||
|
function Storage_Array_Input_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class)
|
||||||
|
return System.Storage_Elements.Storage_Array;
|
||||||
|
|
||||||
|
procedure Storage_Array_Output
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : System.Storage_Elements.Storage_Array);
|
||||||
|
|
||||||
|
procedure Storage_Array_Output_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : System.Storage_Elements.Storage_Array);
|
||||||
|
|
||||||
|
procedure Storage_Array_Read
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : out System.Storage_Elements.Storage_Array);
|
||||||
|
|
||||||
|
procedure Storage_Array_Read_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : out System.Storage_Elements.Storage_Array);
|
||||||
|
|
||||||
|
procedure Storage_Array_Write
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : System.Storage_Elements.Storage_Array);
|
||||||
|
|
||||||
|
procedure Storage_Array_Write_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : System.Storage_Elements.Storage_Array);
|
||||||
|
|
||||||
|
--------------------------------------------
|
||||||
|
-- Stream_Element_Array stream operations --
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
function Stream_Element_Array_Input
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class)
|
||||||
|
return Ada.Streams.Stream_Element_Array;
|
||||||
|
|
||||||
|
function Stream_Element_Array_Input_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class)
|
||||||
|
return Ada.Streams.Stream_Element_Array;
|
||||||
|
|
||||||
|
procedure Stream_Element_Array_Output
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : Ada.Streams.Stream_Element_Array);
|
||||||
|
|
||||||
|
procedure Stream_Element_Array_Output_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : Ada.Streams.Stream_Element_Array);
|
||||||
|
|
||||||
|
procedure Stream_Element_Array_Read
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : out Ada.Streams.Stream_Element_Array);
|
||||||
|
|
||||||
|
procedure Stream_Element_Array_Read_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : out Ada.Streams.Stream_Element_Array);
|
||||||
|
|
||||||
|
procedure Stream_Element_Array_Write
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : Ada.Streams.Stream_Element_Array);
|
||||||
|
|
||||||
|
procedure Stream_Element_Array_Write_Blk_IO
|
||||||
|
(Strm : access Ada.Streams.Root_Stream_Type'Class;
|
||||||
|
Item : Ada.Streams.Stream_Element_Array);
|
||||||
|
|
||||||
------------------------------
|
------------------------------
|
||||||
-- String stream operations --
|
-- String stream operations --
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue