[Ada] Implement tiered support for floating-point input operations

gcc/ada/

	* Makefile.rtl (GNATRTL_NONTASKING_OBJS): Remove s-fatsfl$(objext)
	and add s-valflt$(objext), s-vallfl$(objext), s-valllf$(objext).
	* exp_attr.adb (Find_Fat_Info): Merge Short_Float and Float cases.
	* exp_imgv.adb (Expand_Value_Attribute): Replace RE_Value_Real with
	RE_Value_Long_Long_Float for fixed-point types and use appropriate
	base type for floating-point types.
	* rtsfind.ads (RTU_Id): Remove System_Fat_IEEE_Long_Float,
	System_Fat_IEEE_Short_Float and System_Val_Real, add System_Val_Flt,
	System_Val_LFlt and System_Val_LLF.
	(RE_Id): Remove RE_Attr_IEEE_Long, RE_Fat_IEEE_Long,
	RE_Attr_IEEE_Short, RE_Fat_IEEE_Short, RE_Attr_Short_Float, add
	RE_Value_Float, RE_Value_Long_Float, RE_Value_Long_Long_Float,
	(RE_Unit_Table): Likewise.
	* libgnat/a-ticoau.ads: Add with clause for Float_Aux and make the
	package generic.
	(Get): Change parameter types to Num.
	(Put): Likewise.
	(Gets): Likewise.
	(Puts): Likewise.
	* libgnat/a-ticoau.adb: Remove clause and renaming for Float_Aux.
	(Get): Change parameter types to Num.
	(Gets): Likewise.
	(Put): Likewise.
	(Puts): Likewise.  Add conversion to Long_Long_Float.
	* libgnat/a-ticoio.adb: Remove with clause for Ada.Text_IO, add with
	clause for Float_Aux, add with and use clauses for System.Val_Flt,
	System.Val_LFlt and System.Val_LLF. Instantiate Float_Aux and
	Complex_Aux on Float, Long_Float, and Long_Long_Float.
	(OK_Float): New boolean constant.
	(OK_Long_Float): Likewise.
	(Get): Call appropriate Get routine from auxiliary package.
	(Get): Call appropriate Gets routine from auxiliary package.
	(Put): Call appropriate Put routine from auxiliary package.
	(Put): Call appropriate Puts routine from auxiliary package.
	* libgnat/a-tideau.adb: Remove with and use clause for Float_Aux.
	* libgnat/a-tifiau.adb: Likewise.
	* libgnat/a-tifiio.adb: Add with and use clause for System.Val_LLF.
	Instantiate Float_Aux on Long_Long_Float.
	(Get): Adjust call to Get routine from auxiliary package.
	(Get): Adjust call to Gets routine from auxiliary package.
	(Put): Adjust call to Put routine from auxiliary package.
	(Put): Adjust call to Puts routine from auxiliary package.
	* libgnat/a-tifiio__128.adb: Likewise.
	(Get): Likewise.
	(Get): Likewise.
	(Put): Likewise.
	(Put): Likewise.
	* libgnat/a-tiflau.ads: Make the package generic.
	(Get): Change parameter type to Num.
	(Put): Likewise.
	(Gets): Likewise.
	(Puts): Likewise.
	* libgnat/a-tiflau.adb: Remove clauses for System.Val_Real.
	(Get): Change parameter type to Num and call Scan routine.
	(Gets): Likewise.
	(Load_Real): Move to...
	(Put): Change parameter type and add conversion to Long_Long_Float.
	(Puts): Likewise.
	* libgnat/a-tiflio.adb: Add with and use clauses for System.Val_Flt,
	System.Val_LFlt and System.Val_LLF. Instantiate Float_Aux on Float,
	Long_Float and Long_Long_Float.
	(OK_Float): New boolean constant.
	(OK_Long_Float): Likewise.
	(Get): Call appropriate Get routine from auxiliary package.
	(Get): Call previous variant.
	(Get): Call appropriate Gets routine from auxiliary package.
	(Put): Call appropriate Put routine from auxiliary package.
	(Put): Call previous variant.
	(Put): Call appropriate Puts routine from auxiliary package.
	* libgnat/a-tigeau.ads (Load_Real): New procedure.
	* libgnat/a-tigeau.adb (Load_Real): ...here.
	* libgnat/a-wtcoau.ads: Add with clause for Float_Aux and make the
	package generic.
	(Get): Change parameter types to Num.
	(Put): Likewise.
	(Gets): Likewise.
	(Puts): Likewise.
	* libgnat/a-wtcoau.adb: Remove clause and renaming for Float_Aux.
	(Get): Change parameter types to Num.
	(Gets): Likewise.
	(Put): Likewise.
	(Puts): Likewise.  Add conversion to Long_Long_Float.
	* libgnat/a-wtcoio.ads: Remove use clause for Complex_Types and use
	qualified names throughout accordingly.
	* libgnat/a-wtcoio.adb: Remove clause for Ada.Unchecked_Conversion,
	add with clause for Float_Aux, add clauses for System.Val_Flt,
	System.Val_LFlt and System.Val_LLF. Add clause for Complex_Types.
	Instantiate Float_Aux and Complex_Aux on Float, Long_Float, and
	Long_Long_Float.  Remove LLF subtype and TFT instantiation.
	(OK_Float): New boolean constant.
	(OK_Long_Float): Likewise.
	(Get): Call appropriate Get routine from auxiliary package.
	(Get): Call appropriate Gets routine from auxiliary package.
	(Put): Call appropriate Put routine from auxiliary package.
	(Put): Call appropriate Puts routine from auxiliary package.
	* libgnat/a-wtdeau.adb: Remove with and use clause for Float_Aux.
	* libgnat/a-wtfiau.adb: Likewise.
	* libgnat/a-wtfiio.adb: Add with and use clause for System.Val_LLF.
	Instantiate Float_Aux on Long_Long_Float.
	(Get): Adjust call to Get routine from auxiliary package.
	(Get): Adjust call to Gets routine from auxiliary package.
	(Put): Adjust call to Put routine from auxiliary package.
	(Put): Adjust call to Puts routine from auxiliary package.
	* libgnat/a-wtfiio__128.adb: Likewise.
	(Get): Likewise.
	(Get): Likewise.
	(Put): Likewise.
	(Put): Likewise.
	* libgnat/a-wtflau.ads: Make the package generic.
	(Get): Change parameter type to Num.
	(Put): Likewise.
	(Gets): Likewise.
	(Puts): Likewise.
	* libgnat/a-wtflau.adb: Remove clauses for System.Val_Real.
	(Get): Change parameter type to Num and call Scan routine. Set
	Ptr parameter lazily.
	(Gets): Likewise.
	(Load_Real): Move to...
	(Put): Change parameter type and add conversion to Long_Long_Float.
	Bump buffer length to Max_Real_Image_Length.
	(Puts): Likewise.
	* libgnat/a-wtflio.adb: Add with and use clauses for System.Val_Flt,
	System.Val_LFlt and System.Val_LLF. Instantiate Float_Aux on Float,
	Long_Float and Long_Long_Float.
	(OK_Float): New boolean constant.
	(OK_Long_Float): Likewise.
	(Get): Call appropriate Get routine from auxiliary package.  Add
	pragma Unsuppress (Range_Check) and manual validity check.
	(Get): Call appropriate Gets routine from auxiliary package. Add
	pragma Unsuppress (Range_Check) and manual validity check.
	(Put): Call appropriate Put routine from auxiliary package.
	(Put): Call appropriate Puts routine from auxiliary package.
	* libgnat/a-wtgeau.ads (Load_Real): New procedure.
	* libgnat/a-wtgeau.adb (Load_Real): ...here.
	* libgnat/a-ztcoau.ads: Add with clause for Float_Aux and make the
	package generic.
	(Get): Change parameter types to Num.
	(Put): Likewise.
	(Gets): Likewise.
	(Puts): Likewise.
	* libgnat/a-ztcoau.adb: Remove clause and renaming for Float_Aux.
	(Get): Change parameter types to Num.
	(Gets): Likewise.
	(Put): Likewise.
	(Puts): Likewise.  Add conversion to Long_Long_Float.
	* libgnat/a-ztcoio.ads: Remove use clause for Complex_Types and use
	qualified names throughout accordingly.
	* libgnat/a-ztcoio.adb: Remove clause for Ada.Unchecked_Conversion,
	add with clause for Float_Aux, add clauses for System.Val_Flt,
	System.Val_LFlt and System.Val_LLF. Add clause for Complex_Types.
	Instantiate Float_Aux and Complex_Aux on Float, Long_Float, and
	Long_Long_Float. Remove LLF subtype and TFT instantiation.
	(OK_Float): New boolean constant.
	(OK_Long_Float): Likewise.
	(Get): Call appropriate Get routine from auxiliary package.
	(Get): Call appropriate Gets routine from auxiliary package.
	(Put): Call appropriate Put routine from auxiliary package.
	(Put): Call appropriate Puts routine from auxiliary package.
	* libgnat/a-ztdeau.adb: Remove with and use clause for Float_Aux.
	* libgnat/a-ztfiau.adb: Likewise.
	* libgnat/a-ztfiio.adb: Add with and use clause for System.Val_LLF.
	Instantiate Float_Aux on Long_Long_Float.
	(Get): Adjust call to Get routine from auxiliary package.
	(Get): Adjust call to Gets routine from auxiliary package.
	(Put): Adjust call to Put routine from auxiliary package.
	(Put): Adjust call to Puts routine from auxiliary package.
	* libgnat/a-ztfiio__128.adb: Likewise.
	(Get): Likewise.
	(Get): Likewise.
	(Put): Likewise.
	(Put): Likewise.
	* libgnat/a-ztflau.ads: Make the package generic.
	(Get): Change parameter type to Num.
	(Put): Likewise.
	(Gets): Likewise.
	(Puts): Likewise.
	* libgnat/a-ztflau.adb: Remove clauses for System.Val_Real.
	(Get): Change parameter type to Num and call Scan routine. Set
	Ptr parameter lazily.
	(Gets): Likewise.
	(Load_Real): Move to...
	(Put): Change parameter type and add conversion to Long_Long_Float.
	Bump buffer length to Max_Real_Image_Length.
	(Puts): Likewise.
	* libgnat/a-ztflio.adb: Add with and use clauses for System.Val_Flt,
	System.Val_LFlt and System.Val_LLF. Instantiate Float_Aux on Float,
	Long_Float and Long_Long_Float.
	(OK_Float): New boolean constant.
	(OK_Long_Float): Likewise.
	(Get): Call appropriate Get routine from auxiliary package.  Add
	pragma Unsuppress (Range_Check) and manual validity check.
	(Get): Call appropriate Gets routine from auxiliary package. Add
	pragma Unsuppress (Range_Check) and manual validity check.
	(Put): Call appropriate Put routine from auxiliary package.
	(Put): Call appropriate Puts routine from auxiliary package.
	* libgnat/a-ztgeau.ads (Load_Real): New procedure.
	* libgnat/a-ztgeau.adb (Load_Real): ...here.
	* libgnat/s-fatsfl.ads: Delete.
	* libgnat/s-valflt.ads: New package.
	* libgnat/s-vallfl.ads: Likewise.
	* libgnat/s-valllf.ads: Likewise.
	* libgnat/s-valrea.ads: Make generic. Add assertions, defensive
	code and clarify intent.
	(Scan_Real): Change parameter type to Num.
	(Value_Real): Likewise.
	* libgnat/s-valrea.adb: Instantiate Value_R on Uns.
	(Integer_to_Real): Change parameter and result to Num.
	Call Float_Control.Reset only if the mantissa is 64 bits.  Use
	a divide to compute the final value if the scale is negative.
	(Scan_Real): Change result to Num.
	(Value_Real): Likewise.
	* libgnat/s-valuer.adb: Add assertions, defensive code and
	clarify intent.
	(F_Limit): Delete.
	(I_Limit): Likewise.
	(Precision_Limit): Always use the integer limit.
	* libgnat/s-fatgen.adb: Add pragma Annotate.
This commit is contained in:
Eric Botcazou 2020-11-23 15:42:08 +01:00 committed by Pierre-Marie de Rodat
parent 1851d3cef2
commit 338e513351
49 changed files with 1266 additions and 707 deletions

View file

@ -596,7 +596,6 @@ GNATRTL_NONTASKING_OBJS= \
s-fatgen$(objext) \
s-fatlfl$(objext) \
s-fatllf$(objext) \
s-fatsfl$(objext) \
s-ficobl$(objext) \
s-filatt$(objext) \
s-fileio$(objext) \
@ -756,7 +755,10 @@ GNATRTL_NONTASKING_OBJS= \
s-vafi32$(objext) \
s-vafi64$(objext) \
s-valenu$(objext) \
s-valflt$(objext) \
s-valint$(objext) \
s-vallfl$(objext) \
s-valllf$(objext) \
s-vallli$(objext) \
s-valllu$(objext) \
s-valrea$(objext) \

View file

@ -8311,27 +8311,25 @@ package body Exp_Attr is
-- All we do is use the root type (historically this dealt with
-- VAX-float .. to be cleaned up further later ???)
Fat_Type := Rtyp;
if Rtyp = Standard_Short_Float or else Rtyp = Standard_Float then
Fat_Type := Standard_Float;
Fat_Pkg := RE_Attr_Float;
if Fat_Type = Standard_Short_Float then
Fat_Pkg := RE_Attr_Short_Float;
elsif Rtyp = Standard_Long_Float then
Fat_Type := Standard_Long_Float;
Fat_Pkg := RE_Attr_Long_Float;
elsif Fat_Type = Standard_Float then
Fat_Pkg := RE_Attr_Float;
elsif Fat_Type = Standard_Long_Float then
Fat_Pkg := RE_Attr_Long_Float;
elsif Fat_Type = Standard_Long_Long_Float then
Fat_Pkg := RE_Attr_Long_Long_Float;
elsif Rtyp = Standard_Long_Long_Float then
Fat_Type := Standard_Long_Long_Float;
Fat_Pkg := RE_Attr_Long_Long_Float;
-- Universal real (which is its own root type) is treated as being
-- equivalent to Standard.Long_Long_Float, since it is defined to
-- have the same precision as the longest Float type.
elsif Fat_Type = Universal_Real then
elsif Rtyp = Universal_Real then
Fat_Type := Standard_Long_Long_Float;
Fat_Pkg := RE_Attr_Long_Long_Float;
Fat_Pkg := RE_Attr_Long_Long_Float;
else
raise Program_Error;

View file

@ -1008,10 +1008,10 @@ package body Exp_Imgv is
then
Vid := RE_Value_Fixed128;
else
Vid := RE_Value_Real;
Vid := RE_Value_Long_Long_Float;
end if;
if Vid /= RE_Value_Real then
if Vid /= RE_Value_Long_Long_Float then
Append_To (Args,
Make_Integer_Literal (Loc, -Norm_Num (Small_Value (Rtyp))));
@ -1031,7 +1031,18 @@ package body Exp_Imgv is
end;
elsif Is_Floating_Point_Type (Rtyp) then
Vid := RE_Value_Real;
if Rtyp = Standard_Short_Float or else Rtyp = Standard_Float then
Vid := RE_Value_Float;
elsif Rtyp = Standard_Long_Float then
Vid := RE_Value_Long_Float;
elsif Rtyp = Standard_Long_Long_Float then
Vid := RE_Value_Long_Long_Float;
else
raise Program_Error;
end if;
-- Only other possibility is user-defined enumeration type

View file

@ -30,22 +30,19 @@
------------------------------------------------------------------------------
with Ada.Text_IO.Generic_Aux; use Ada.Text_IO.Generic_Aux;
with Ada.Text_IO.Float_Aux;
with System.Img_Real; use System.Img_Real;
package body Ada.Text_IO.Complex_Aux is
package Aux renames Ada.Text_IO.Float_Aux;
---------
-- Get --
---------
procedure Get
(File : File_Type;
ItemR : out Long_Long_Float;
ItemI : out Long_Long_Float;
ItemR : out Num;
ItemI : out Num;
Width : Field)
is
Buf : String (1 .. Field'Last);
@ -95,8 +92,8 @@ package body Ada.Text_IO.Complex_Aux is
procedure Gets
(From : String;
ItemR : out Long_Long_Float;
ItemI : out Long_Long_Float;
ItemR : out Num;
ItemI : out Num;
Last : out Positive)
is
Paren : Boolean;
@ -139,8 +136,8 @@ package body Ada.Text_IO.Complex_Aux is
procedure Put
(File : File_Type;
ItemR : Long_Long_Float;
ItemI : Long_Long_Float;
ItemR : Num;
ItemI : Num;
Fore : Field;
Aft : Field;
Exp : Field)
@ -159,8 +156,8 @@ package body Ada.Text_IO.Complex_Aux is
procedure Puts
(To : out String;
ItemR : Long_Long_Float;
ItemI : Long_Long_Float;
ItemR : Num;
ItemI : Num;
Aft : Field;
Exp : Field)
is
@ -174,9 +171,9 @@ package body Ada.Text_IO.Complex_Aux is
-- Both parts are initially converted with a Fore of 0
Rptr := 0;
Set_Image_Real (ItemR, R_String, Rptr, 0, Aft, Exp);
Set_Image_Real (Long_Long_Float (ItemR), R_String, Rptr, 0, Aft, Exp);
Iptr := 0;
Set_Image_Real (ItemI, I_String, Iptr, 0, Aft, Exp);
Set_Image_Real (Long_Long_Float (ItemI), I_String, Iptr, 0, Aft, Exp);
-- Check room for both parts plus parens plus comma (RM G.1.3(34))

View file

@ -30,39 +30,46 @@
------------------------------------------------------------------------------
-- This package contains the routines for Ada.Text_IO.Complex_IO that are
-- shared among separate instantiations of this package. The routines in
-- this package are identical semantically to those in Complex_IO itself,
-- except that the generic parameter Complex has been replaced by separate
-- real and imaginary values of type Long_Long_Float, and default parameters
-- have been removed because they are supplied explicitly by the calls from
-- within the generic template.
-- shared among separate instantiations of this package. The routines in this
-- package are identical semantically to those in Complex_IO, except that the
-- generic parameter Complex has been replaced by separate real and imaginary
-- parameters, and default parameters have been removed because they are
-- supplied explicitly by the calls from within the generic template.
with Ada.Text_IO.Float_Aux;
private generic
type Num is digits <>;
with package Aux is new Ada.Text_IO.Float_Aux (Num, <>);
package Ada.Text_IO.Complex_Aux is
procedure Get
(File : File_Type;
ItemR : out Long_Long_Float;
ItemI : out Long_Long_Float;
ItemR : out Num;
ItemI : out Num;
Width : Field);
procedure Put
(File : File_Type;
ItemR : Long_Long_Float;
ItemI : Long_Long_Float;
ItemR : Num;
ItemI : Num;
Fore : Field;
Aft : Field;
Exp : Field);
procedure Gets
(From : String;
ItemR : out Long_Long_Float;
ItemI : out Long_Long_Float;
ItemR : out Num;
ItemI : out Num;
Last : out Positive);
procedure Puts
(To : out String;
ItemR : Long_Long_Float;
ItemI : Long_Long_Float;
ItemR : Num;
ItemI : Num;
Aft : Field;
Exp : Field);

View file

@ -29,18 +29,42 @@
-- --
------------------------------------------------------------------------------
with Ada.Text_IO;
with Ada.Text_IO.Complex_Aux;
with Ada.Text_IO.Float_Aux;
with System.Val_Flt; use System.Val_Flt;
with System.Val_LFlt; use System.Val_LFlt;
with System.Val_LLF; use System.Val_LLF;
package body Ada.Text_IO.Complex_IO is
use Complex_Types;
package Aux renames Ada.Text_IO.Complex_Aux;
package Scalar_Float is new
Ada.Text_IO.Float_Aux (Float, Scan_Float);
subtype LLF is Long_Long_Float;
-- Type used for calls to routines in Aux
package Scalar_Long_Float is new
Ada.Text_IO.Float_Aux (Long_Float, Scan_Long_Float);
package Scalar_Long_Long_Float is new
Ada.Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
package Aux_Float is new
Ada.Text_IO.Complex_Aux (Float, Scalar_Float);
package Aux_Long_Float is new
Ada.Text_IO.Complex_Aux (Long_Float, Scalar_Long_Float);
package Aux_Long_Long_Float is new
Ada.Text_IO.Complex_Aux (Long_Long_Float, Scalar_Long_Long_Float);
-- Throughout this generic body, we distinguish between the case where type
-- Float is OK, where type Long_Float is OK and where type Long_Long_Float
-- is needed. These boolean constants are used to test for this, such that
-- only code for the relevant case is included in the instance.
OK_Float : constant Boolean := Real'Base'Digits <= Float'Digits;
OK_Long_Float : constant Boolean := Real'Base'Digits <= Long_Float'Digits;
---------
-- Get --
@ -48,14 +72,24 @@ package body Ada.Text_IO.Complex_IO is
procedure Get
(File : File_Type;
Item : out Complex_Types.Complex;
Item : out Complex;
Width : Field := 0)
is
Real_Item : Real'Base;
Imag_Item : Real'Base;
begin
Aux.Get (File, LLF (Real_Item), LLF (Imag_Item), Width);
if OK_Float then
Aux_Float.Get (File, Float (Real_Item), Float (Imag_Item), Width);
elsif OK_Long_Float then
Aux_Long_Float.Get
(File, Long_Float (Real_Item), Long_Float (Imag_Item), Width);
else
Aux_Long_Long_Float.Get
(File, Long_Long_Float (Real_Item), Long_Long_Float (Imag_Item),
Width);
end if;
Item := (Real_Item, Imag_Item);
exception
@ -67,7 +101,7 @@ package body Ada.Text_IO.Complex_IO is
---------
procedure Get
(Item : out Complex_Types.Complex;
(Item : out Complex;
Width : Field := 0)
is
begin
@ -80,14 +114,24 @@ package body Ada.Text_IO.Complex_IO is
procedure Get
(From : String;
Item : out Complex_Types.Complex;
Item : out Complex;
Last : out Positive)
is
Real_Item : Real'Base;
Imag_Item : Real'Base;
begin
Aux.Gets (From, LLF (Real_Item), LLF (Imag_Item), Last);
if OK_Float then
Aux_Float.Gets (From, Float (Real_Item), Float (Imag_Item), Last);
elsif OK_Long_Float then
Aux_Long_Float.Gets
(From, Long_Float (Real_Item), Long_Float (Imag_Item), Last);
else
Aux_Long_Long_Float.Gets
(From, Long_Long_Float (Real_Item), Long_Long_Float (Imag_Item),
Last);
end if;
Item := (Real_Item, Imag_Item);
exception
@ -100,13 +144,24 @@ package body Ada.Text_IO.Complex_IO is
procedure Put
(File : File_Type;
Item : Complex_Types.Complex;
Item : Complex;
Fore : Field := Default_Fore;
Aft : Field := Default_Aft;
Exp : Field := Default_Exp)
is
begin
Aux.Put (File, LLF (Re (Item)), LLF (Im (Item)), Fore, Aft, Exp);
if OK_Float then
Aux_Float.Put
(File, Float (Re (Item)), Float (Im (Item)), Fore, Aft, Exp);
elsif OK_Long_Float then
Aux_Long_Float.Put
(File, Long_Float (Re (Item)), Long_Float (Im (Item)), Fore, Aft,
Exp);
else
Aux_Long_Long_Float.Put
(File, Long_Long_Float (Re (Item)), Long_Long_Float (Im (Item)),
Fore, Aft, Exp);
end if;
end Put;
---------
@ -114,7 +169,7 @@ package body Ada.Text_IO.Complex_IO is
---------
procedure Put
(Item : Complex_Types.Complex;
(Item : Complex;
Fore : Field := Default_Fore;
Aft : Field := Default_Aft;
Exp : Field := Default_Exp)
@ -129,12 +184,21 @@ package body Ada.Text_IO.Complex_IO is
procedure Put
(To : out String;
Item : Complex_Types.Complex;
Item : Complex;
Aft : Field := Default_Aft;
Exp : Field := Default_Exp)
is
begin
Aux.Puts (To, LLF (Re (Item)), LLF (Im (Item)), Aft, Exp);
if OK_Float then
Aux_Float.Puts (To, Float (Re (Item)), Float (Im (Item)), Aft, Exp);
elsif OK_Long_Float then
Aux_Long_Float.Puts
(To, Long_Float (Re (Item)), Long_Float (Im (Item)), Aft, Exp);
else
Aux_Long_Long_Float.Puts
(To, Long_Long_Float (Re (Item)), Long_Long_Float (Im (Item)),
Aft, Exp);
end if;
end Put;
end Ada.Text_IO.Complex_IO;

View file

@ -30,7 +30,6 @@
------------------------------------------------------------------------------
with Ada.Text_IO.Generic_Aux; use Ada.Text_IO.Generic_Aux;
with Ada.Text_IO.Float_Aux; use Ada.Text_IO.Float_Aux;
package body Ada.Text_IO.Decimal_Aux is

View file

@ -30,7 +30,6 @@
------------------------------------------------------------------------------
with Ada.Text_IO.Generic_Aux; use Ada.Text_IO.Generic_Aux;
with Ada.Text_IO.Float_Aux; use Ada.Text_IO.Float_Aux;
package body Ada.Text_IO.Fixed_Aux is

View file

@ -160,6 +160,7 @@ with System.Img_Fixed_32; use System.Img_Fixed_32;
with System.Img_Fixed_64; use System.Img_Fixed_64;
with System.Val_Fixed_32; use System.Val_Fixed_32;
with System.Val_Fixed_64; use System.Val_Fixed_64;
with System.Val_LLF; use System.Val_LLF;
package body Ada.Text_IO.Fixed_IO is
@ -177,6 +178,9 @@ package body Ada.Text_IO.Fixed_IO is
package Aux64 is new
Ada.Text_IO.Fixed_Aux (Int64, Scan_Fixed64, Set_Image_Fixed64);
package Aux_Long_Long_Float is new
Ada.Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
-- Throughout this generic body, we distinguish between the case where type
-- Int32 is OK and where type Int64 is OK. These boolean constants are used
-- to test for this, such that only code for the relevant case is included
@ -279,7 +283,7 @@ package body Ada.Text_IO.Fixed_IO is
-Num'Small_Numerator,
-Num'Small_Denominator));
else
Float_Aux.Get (File, Long_Long_Float (Item), Width);
Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
end if;
exception
@ -313,7 +317,7 @@ package body Ada.Text_IO.Fixed_IO is
-Num'Small_Numerator,
-Num'Small_Denominator));
else
Float_Aux.Gets (From, Long_Long_Float (Item), Last);
Aux_Long_Long_Float.Gets (From, Long_Long_Float (Item), Last);
end if;
exception
@ -341,7 +345,8 @@ package body Ada.Text_IO.Fixed_IO is
-Num'Small_Numerator, -Num'Small_Denominator,
For0, Num'Aft);
else
Float_Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
Aux_Long_Long_Float.Put
(File, Long_Long_Float (Item), Fore, Aft, Exp);
end if;
end Put;
@ -371,7 +376,7 @@ package body Ada.Text_IO.Fixed_IO is
-Num'Small_Numerator, -Num'Small_Denominator,
For0, Num'Aft);
else
Float_Aux.Puts (To, Long_Long_Float (Item), Aft, Exp);
Aux_Long_Long_Float.Puts (To, Long_Long_Float (Item), Aft, Exp);
end if;
end Put;

View file

@ -162,6 +162,7 @@ with System.Img_Fixed_128; use System.Img_Fixed_128;
with System.Val_Fixed_32; use System.Val_Fixed_32;
with System.Val_Fixed_64; use System.Val_Fixed_64;
with System.Val_Fixed_128; use System.Val_Fixed_128;
with System.Val_LLF; use System.Val_LLF;
package body Ada.Text_IO.Fixed_IO is
@ -183,6 +184,9 @@ package body Ada.Text_IO.Fixed_IO is
package Aux128 is new
Ada.Text_IO.Fixed_Aux (Int128, Scan_Fixed128, Set_Image_Fixed128);
package Aux_Long_Long_Float is new
Ada.Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
-- Throughout this generic body, we distinguish between the case where type
-- Int32 is OK, where type Int64 is OK and where type Int128 is OK. These
-- boolean constants are used to test for this, such that only code for the
@ -319,7 +323,7 @@ package body Ada.Text_IO.Fixed_IO is
-Num'Small_Numerator,
-Num'Small_Denominator));
else
Float_Aux.Get (File, Long_Long_Float (Item), Width);
Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
end if;
exception
@ -358,7 +362,7 @@ package body Ada.Text_IO.Fixed_IO is
-Num'Small_Numerator,
-Num'Small_Denominator));
else
Float_Aux.Gets (From, Long_Long_Float (Item), Last);
Aux_Long_Long_Float.Gets (From, Long_Long_Float (Item), Last);
end if;
exception
@ -390,7 +394,8 @@ package body Ada.Text_IO.Fixed_IO is
-Num'Small_Numerator, -Num'Small_Denominator,
For0, Num'Aft);
else
Float_Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
Aux_Long_Long_Float.Put
(File, Long_Long_Float (Item), Fore, Aft, Exp);
end if;
end Put;
@ -424,7 +429,7 @@ package body Ada.Text_IO.Fixed_IO is
-Num'Small_Numerator, -Num'Small_Denominator,
For0, Num'Aft);
else
Float_Aux.Puts (To, Long_Long_Float (Item), Aft, Exp);
Aux_Long_Long_Float.Puts (To, Long_Long_Float (Item), Aft, Exp);
end if;
end Put;

View file

@ -32,7 +32,6 @@
with Ada.Text_IO.Generic_Aux; use Ada.Text_IO.Generic_Aux;
with System.Img_Real; use System.Img_Real;
with System.Val_Real; use System.Val_Real;
package body Ada.Text_IO.Float_Aux is
@ -42,7 +41,7 @@ package body Ada.Text_IO.Float_Aux is
procedure Get
(File : File_Type;
Item : out Long_Long_Float;
Item : out Num;
Width : Field)
is
Buf : String (1 .. Field'Last);
@ -58,7 +57,7 @@ package body Ada.Text_IO.Float_Aux is
Ptr := 1;
end if;
Item := Scan_Real (Buf, Ptr'Access, Stop);
Item := Scan (Buf, Ptr'Access, Stop);
Check_End_Of_Field (Buf, Stop, Ptr, Width);
end Get;
@ -68,127 +67,27 @@ package body Ada.Text_IO.Float_Aux is
procedure Gets
(From : String;
Item : out Long_Long_Float;
Item : out Num;
Last : out Positive)
is
Pos : aliased Integer;
begin
String_Skip (From, Pos);
Item := Scan_Real (From, Pos'Access, From'Last);
Item := Scan (From, Pos'Access, From'Last);
Last := Pos - 1;
exception
when Constraint_Error => raise Data_Error;
end Gets;
---------------
-- Load_Real --
---------------
procedure Load_Real
(File : File_Type;
Buf : out String;
Ptr : in out Natural)
is
Loaded : Boolean;
begin
-- Skip initial blanks, and load possible sign
Load_Skip (File);
Load (File, Buf, Ptr, '+', '-');
-- Case of .nnnn
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Digits (File, Buf, Ptr, Loaded);
-- Hopeless junk if no digits loaded
if not Loaded then
return;
end if;
-- Otherwise must have digits to start
else
Load_Digits (File, Buf, Ptr, Loaded);
-- Hopeless junk if no digits loaded
if not Loaded then
return;
end if;
-- Based cases. We recognize either the standard '#' or the
-- allowed alternative replacement ':' (see RM J.2(3)).
Load (File, Buf, Ptr, '#', ':', Loaded);
if Loaded then
-- Case of nnn#.xxx#
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Extended_Digits (File, Buf, Ptr);
Load (File, Buf, Ptr, '#', ':');
-- Case of nnn#xxx.[xxx]# or nnn#xxx#
else
Load_Extended_Digits (File, Buf, Ptr);
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Extended_Digits (File, Buf, Ptr);
end if;
-- As usual, it seems strange to allow mixed base characters,
-- but that is what ACVC tests expect, see CE3804M, case (3).
Load (File, Buf, Ptr, '#', ':');
end if;
-- Case of nnn.[nnn] or nnn
else
-- Prevent the potential processing of '.' in cases where the
-- initial digits have a trailing underscore.
if Buf (Ptr) = '_' then
return;
end if;
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Digits (File, Buf, Ptr);
end if;
end if;
end if;
-- Deal with exponent
Load (File, Buf, Ptr, 'E', 'e', Loaded);
if Loaded then
Load (File, Buf, Ptr, '+', '-');
Load_Digits (File, Buf, Ptr);
end if;
end Load_Real;
---------
-- Put --
---------
procedure Put
(File : File_Type;
Item : Long_Long_Float;
Item : Num;
Fore : Field;
Aft : Field;
Exp : Field)
@ -197,7 +96,7 @@ package body Ada.Text_IO.Float_Aux is
Ptr : Natural := 0;
begin
Set_Image_Real (Item, Buf, Ptr, Fore, Aft, Exp);
Set_Image_Real (Long_Long_Float (Item), Buf, Ptr, Fore, Aft, Exp);
Put_Item (File, Buf (1 .. Ptr));
end Put;
@ -207,7 +106,7 @@ package body Ada.Text_IO.Float_Aux is
procedure Puts
(To : out String;
Item : Long_Long_Float;
Item : Num;
Aft : Field;
Exp : Field)
is
@ -215,7 +114,8 @@ package body Ada.Text_IO.Float_Aux is
Ptr : Natural := 0;
begin
Set_Image_Real (Item, Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
Set_Image_Real
(Long_Long_Float (Item), Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
if Ptr > To'Length then
raise Layout_Error;

View file

@ -31,41 +31,42 @@
-- This package contains the routines for Ada.Text_IO.Float_IO that are
-- shared among separate instantiations of this package. The routines in
-- this package are identical semantically to those in Float_IO itself,
-- except that generic parameter Num has been replaced by Long_Long_Float,
-- and the default parameters have been removed because they are supplied
-- this package are identical semantically to those in Float_IO, except
-- that the default parameters have been removed because they are supplied
-- explicitly by the calls from within the generic template. This package
-- is also used by Ada.Text_IO.Fixed_IO, and Ada.Text_IO.Decimal_IO.
-- is also used by Ada.Text_IO.Fixed_IO and Ada.Text_IO.Decimal_IO.
private package Ada.Text_IO.Float_Aux is
private generic
procedure Load_Real
(File : File_Type;
Buf : out String;
Ptr : in out Natural);
-- This is an auxiliary routine that is used to load a possibly signed
-- real literal value from the input file into Buf, starting at Ptr + 1.
type Num is digits <>;
with function Scan
(Str : String;
Ptr : not null access Integer;
Max : Integer) return Num;
package Ada.Text_IO.Float_Aux is
procedure Get
(File : File_Type;
Item : out Long_Long_Float;
Item : out Num;
Width : Field);
procedure Put
(File : File_Type;
Item : Long_Long_Float;
Item : Num;
Fore : Field;
Aft : Field;
Exp : Field);
procedure Gets
(From : String;
Item : out Long_Long_Float;
Item : out Num;
Last : out Positive);
procedure Puts
(To : out String;
Item : Long_Long_Float;
Item : Num;
Aft : Field;
Exp : Field);

View file

@ -30,10 +30,29 @@
------------------------------------------------------------------------------
with Ada.Text_IO.Float_Aux;
with System.Val_Flt; use System.Val_Flt;
with System.Val_LFlt; use System.Val_LFlt;
with System.Val_LLF; use System.Val_LLF;
package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
package Aux renames Ada.Text_IO.Float_Aux;
package Aux_Float is new
Ada.Text_IO.Float_Aux (Float, Scan_Float);
package Aux_Long_Float is new
Ada.Text_IO.Float_Aux (Long_Float, Scan_Long_Float);
package Aux_Long_Long_Float is new
Ada.Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
-- Throughout this generic body, we distinguish between the case where type
-- Float is OK, where type Long_Float is OK and where type Long_Long_Float
-- is needed. These boolean constants are used to test for this, such that
-- only code for the relevant case is included in the instance.
OK_Float : constant Boolean := Num'Base'Digits <= Float'Digits;
OK_Long_Float : constant Boolean := Num'Base'Digits <= Long_Float'Digits;
---------
-- Get --
@ -47,7 +66,13 @@ package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
pragma Unsuppress (Range_Check);
begin
Aux.Get (File, Long_Long_Float (Item), Width);
if OK_Float then
Aux_Float.Get (File, Float (Item), Width);
elsif OK_Long_Float then
Aux_Long_Float.Get (File, Long_Float (Item), Width);
else
Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
end if;
-- In the case where the type is unconstrained (e.g. Standard'Float),
-- the above conversion may result in an infinite value, which is
@ -66,22 +91,8 @@ package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
(Item : out Num;
Width : Field := 0)
is
pragma Unsuppress (Range_Check);
begin
Aux.Get (Current_In, Long_Long_Float (Item), Width);
-- In the case where the type is unconstrained (e.g. Standard'Float),
-- the above conversion may result in an infinite value, which is
-- normally fine for a conversion, but in this case, we want to treat
-- that as a data error.
if not Item'Valid then
raise Data_Error;
end if;
exception
when Constraint_Error => raise Data_Error;
Get (Current_In, Item, Width);
end Get;
procedure Get
@ -92,7 +103,13 @@ package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
pragma Unsuppress (Range_Check);
begin
Aux.Gets (From, Long_Long_Float (Item), Last);
if OK_Float then
Aux_Float.Gets (From, Float (Item), Last);
elsif OK_Long_Float then
Aux_Long_Float.Gets (From, Long_Float (Item), Last);
else
Aux_Long_Long_Float.Gets (From, Long_Long_Float (Item), Last);
end if;
-- In the case where the type is unconstrained (e.g. Standard'Float),
-- the above conversion may result in an infinite value, which is
@ -119,7 +136,14 @@ package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
Exp : Field := Default_Exp)
is
begin
Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
if OK_Float then
Aux_Float.Put (File, Float (Item), Fore, Aft, Exp);
elsif OK_Long_Float then
Aux_Long_Float.Put (File, Long_Float (Item), Fore, Aft, Exp);
else
Aux_Long_Long_Float.Put
(File, Long_Long_Float (Item), Fore, Aft, Exp);
end if;
end Put;
procedure Put
@ -129,7 +153,7 @@ package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
Exp : Field := Default_Exp)
is
begin
Aux.Put (Current_Out, Long_Long_Float (Item), Fore, Aft, Exp);
Put (Current_Out, Item, Fore, Aft, Exp);
end Put;
procedure Put
@ -139,7 +163,13 @@ package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
Exp : Field := Default_Exp)
is
begin
Aux.Puts (To, Long_Long_Float (Item), Aft, Exp);
if OK_Float then
Aux_Float.Puts (To, Float (Item), Aft, Exp);
elsif OK_Long_Float then
Aux_Long_Float.Puts (To, Long_Float (Item), Aft, Exp);
else
Aux_Long_Long_Float.Puts (To, Long_Long_Float (Item), Aft, Exp);
end if;
end Put;
end Ada.Text_IO.Float_IO;

View file

@ -376,6 +376,106 @@ package body Ada.Text_IO.Generic_Aux is
end if;
end Load_Integer;
---------------
-- Load_Real --
---------------
procedure Load_Real
(File : File_Type;
Buf : out String;
Ptr : in out Natural)
is
Loaded : Boolean;
begin
-- Skip initial blanks, and load possible sign
Load_Skip (File);
Load (File, Buf, Ptr, '+', '-');
-- Case of .nnnn
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Digits (File, Buf, Ptr, Loaded);
-- Hopeless junk if no digits loaded
if not Loaded then
return;
end if;
-- Otherwise must have digits to start
else
Load_Digits (File, Buf, Ptr, Loaded);
-- Hopeless junk if no digits loaded
if not Loaded then
return;
end if;
-- Based cases. We recognize either the standard '#' or the
-- allowed alternative replacement ':' (see RM J.2(3)).
Load (File, Buf, Ptr, '#', ':', Loaded);
if Loaded then
-- Case of nnn#.xxx#
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Extended_Digits (File, Buf, Ptr);
Load (File, Buf, Ptr, '#', ':');
-- Case of nnn#xxx.[xxx]# or nnn#xxx#
else
Load_Extended_Digits (File, Buf, Ptr);
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Extended_Digits (File, Buf, Ptr);
end if;
-- As usual, it seems strange to allow mixed base characters,
-- but that is what ACVC tests expect, see CE3804M, case (3).
Load (File, Buf, Ptr, '#', ':');
end if;
-- Case of nnn.[nnn] or nnn
else
-- Prevent the potential processing of '.' in cases where the
-- initial digits have a trailing underscore.
if Buf (Ptr) = '_' then
return;
end if;
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Digits (File, Buf, Ptr);
end if;
end if;
end if;
-- Deal with exponent
Load (File, Buf, Ptr, 'E', 'e', Loaded);
if Loaded then
Load (File, Buf, Ptr, '+', '-');
Load_Digits (File, Buf, Ptr);
end if;
end Load_Real;
---------------
-- Load_Skip --
---------------

View file

@ -156,6 +156,12 @@ private package Ada.Text_IO.Generic_Aux is
Ptr : in out Natural);
-- Loads a possibly signed integer literal value
procedure Load_Real
(File : File_Type;
Buf : out String;
Ptr : in out Natural);
-- Loads a possibly signed real literal value
function Nextc (File : File_Type) return Integer;
-- Like Getc, but includes a call to Ungetc, so that the file
-- pointer is not moved by the call.

View file

@ -30,22 +30,19 @@
------------------------------------------------------------------------------
with Ada.Wide_Text_IO.Generic_Aux; use Ada.Wide_Text_IO.Generic_Aux;
with Ada.Wide_Text_IO.Float_Aux;
with System.Img_Real; use System.Img_Real;
package body Ada.Wide_Text_IO.Complex_Aux is
package Aux renames Ada.Wide_Text_IO.Float_Aux;
---------
-- Get --
---------
procedure Get
(File : File_Type;
ItemR : out Long_Long_Float;
ItemI : out Long_Long_Float;
ItemR : out Num;
ItemI : out Num;
Width : Field)
is
Buf : String (1 .. Field'Last);
@ -95,8 +92,8 @@ package body Ada.Wide_Text_IO.Complex_Aux is
procedure Gets
(From : String;
ItemR : out Long_Long_Float;
ItemI : out Long_Long_Float;
ItemR : out Num;
ItemI : out Num;
Last : out Positive)
is
Paren : Boolean;
@ -139,8 +136,8 @@ package body Ada.Wide_Text_IO.Complex_Aux is
procedure Put
(File : File_Type;
ItemR : Long_Long_Float;
ItemI : Long_Long_Float;
ItemR : Num;
ItemI : Num;
Fore : Field;
Aft : Field;
Exp : Field)
@ -159,8 +156,8 @@ package body Ada.Wide_Text_IO.Complex_Aux is
procedure Puts
(To : out String;
ItemR : Long_Long_Float;
ItemI : Long_Long_Float;
ItemR : Num;
ItemI : Num;
Aft : Field;
Exp : Field)
is
@ -174,9 +171,9 @@ package body Ada.Wide_Text_IO.Complex_Aux is
-- Both parts are initially converted with a Fore of 0
Rptr := 0;
Set_Image_Real (ItemR, R_String, Rptr, 0, Aft, Exp);
Set_Image_Real (Long_Long_Float (ItemR), R_String, Rptr, 0, Aft, Exp);
Iptr := 0;
Set_Image_Real (ItemI, I_String, Iptr, 0, Aft, Exp);
Set_Image_Real (Long_Long_Float (ItemI), I_String, Iptr, 0, Aft, Exp);
-- Check room for both parts plus parens plus comma (RM G.1.3(34))

View file

@ -29,40 +29,47 @@
-- --
------------------------------------------------------------------------------
-- This package contains the routines for Ada.Wide_Text_IO.Complex_IO that
-- are shared among separate instantiations of this package. The routines
-- in this package are identical semantically to those in Complex_IO itself,
-- except that the generic parameter Complex has been replaced by separate
-- real and imaginary values of type Long_Long_Float, and default parameters
-- have been removed because they are supplied explicitly by the calls from
-- within the generic template.
-- This package contains the routines for Ada.Wide_Text_IO.Complex_IO that are
-- shared among separate instantiations of this package. The routines in this
-- package are identical semantically to those in Complex_IO, except that the
-- generic parameter Complex has been replaced by separate real and imaginary
-- parameters, and default parameters have been removed because they are
-- supplied explicitly by the calls from within the generic template.
with Ada.Wide_Text_IO.Float_Aux;
private generic
type Num is digits <>;
with package Aux is new Ada.Wide_Text_IO.Float_Aux (Num, <>);
package Ada.Wide_Text_IO.Complex_Aux is
procedure Get
(File : File_Type;
ItemR : out Long_Long_Float;
ItemI : out Long_Long_Float;
ItemR : out Num;
ItemI : out Num;
Width : Field);
procedure Gets
(From : String;
ItemR : out Long_Long_Float;
ItemI : out Long_Long_Float;
Last : out Positive);
procedure Put
(File : File_Type;
ItemR : Long_Long_Float;
ItemI : Long_Long_Float;
ItemR : Num;
ItemI : Num;
Fore : Field;
Aft : Field;
Exp : Field);
procedure Gets
(From : String;
ItemR : out Num;
ItemI : out Num;
Last : out Positive);
procedure Puts
(To : out String;
ItemR : Long_Long_Float;
ItemI : Long_Long_Float;
ItemR : Num;
ItemI : Num;
Aft : Field;
Exp : Field);

View file

@ -30,24 +30,43 @@
------------------------------------------------------------------------------
with Ada.Wide_Text_IO.Complex_Aux;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_WtS; use System.WCh_WtS;
with Ada.Unchecked_Conversion;
with Ada.Wide_Text_IO.Float_Aux;
with System.Val_Flt; use System.Val_Flt;
with System.Val_LFlt; use System.Val_LFlt;
with System.Val_LLF; use System.Val_LLF;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_WtS; use System.WCh_WtS;
package body Ada.Wide_Text_IO.Complex_IO is
package Aux renames Ada.Wide_Text_IO.Complex_Aux;
use Complex_Types;
subtype LLF is Long_Long_Float;
-- Type used for calls to routines in Aux
package Scalar_Float is new
Ada.Wide_Text_IO.Float_Aux (Float, Scan_Float);
function TFT is new
Ada.Unchecked_Conversion (File_Type, Ada.Wide_Text_IO.File_Type);
-- This unchecked conversion is to get around a visibility bug in
-- GNAT version 2.04w. It should be possible to simply use the
-- subtype declared above and do normal checked conversions.
package Scalar_Long_Float is new
Ada.Wide_Text_IO.Float_Aux (Long_Float, Scan_Long_Float);
package Scalar_Long_Long_Float is new
Ada.Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
package Aux_Float is new
Ada.Wide_Text_IO.Complex_Aux (Float, Scalar_Float);
package Aux_Long_Float is new
Ada.Wide_Text_IO.Complex_Aux (Long_Float, Scalar_Long_Float);
package Aux_Long_Long_Float is new
Ada.Wide_Text_IO.Complex_Aux (Long_Long_Float, Scalar_Long_Long_Float);
-- Throughout this generic body, we distinguish between the case where type
-- Float is OK, where type Long_Float is OK and where type Long_Long_Float
-- is needed. These boolean constants are used to test for this, such that
-- only code for the relevant case is included in the instance.
OK_Float : constant Boolean := Real'Base'Digits <= Float'Digits;
OK_Long_Float : constant Boolean := Real'Base'Digits <= Long_Float'Digits;
---------
-- Get --
@ -62,7 +81,17 @@ package body Ada.Wide_Text_IO.Complex_IO is
Imag_Item : Real'Base;
begin
Aux.Get (TFT (File), LLF (Real_Item), LLF (Imag_Item), Width);
if OK_Float then
Aux_Float.Get (File, Float (Real_Item), Float (Imag_Item), Width);
elsif OK_Long_Float then
Aux_Long_Float.Get
(File, Long_Float (Real_Item), Long_Float (Imag_Item), Width);
else
Aux_Long_Long_Float.Get
(File, Long_Long_Float (Real_Item), Long_Long_Float (Imag_Item),
Width);
end if;
Item := (Real_Item, Imag_Item);
exception
@ -100,7 +129,17 @@ package body Ada.Wide_Text_IO.Complex_IO is
-- Aux.Gets will raise Data_Error in any case.
begin
Aux.Gets (S, LLF (Real_Item), LLF (Imag_Item), Last);
if OK_Float then
Aux_Float.Gets (S, Float (Real_Item), Float (Imag_Item), Last);
elsif OK_Long_Float then
Aux_Long_Float.Gets
(S, Long_Float (Real_Item), Long_Float (Imag_Item), Last);
else
Aux_Long_Long_Float.Gets
(S, Long_Long_Float (Real_Item), Long_Long_Float (Imag_Item),
Last);
end if;
Item := (Real_Item, Imag_Item);
exception
@ -119,7 +158,18 @@ package body Ada.Wide_Text_IO.Complex_IO is
Exp : Field := Default_Exp)
is
begin
Aux.Put (TFT (File), LLF (Re (Item)), LLF (Im (Item)), Fore, Aft, Exp);
if OK_Float then
Aux_Float.Put
(File, Float (Re (Item)), Float (Im (Item)), Fore, Aft, Exp);
elsif OK_Long_Float then
Aux_Long_Float.Put
(File, Long_Float (Re (Item)), Long_Float (Im (Item)), Fore, Aft,
Exp);
else
Aux_Long_Long_Float.Put
(File, Long_Long_Float (Re (Item)), Long_Long_Float (Im (Item)),
Fore, Aft, Exp);
end if;
end Put;
---------
@ -149,7 +199,16 @@ package body Ada.Wide_Text_IO.Complex_IO is
S : String (To'First .. To'Last);
begin
Aux.Puts (S, LLF (Re (Item)), LLF (Im (Item)), Aft, Exp);
if OK_Float then
Aux_Float.Puts (S, Float (Re (Item)), Float (Im (Item)), Aft, Exp);
elsif OK_Long_Float then
Aux_Long_Float.Puts
(S, Long_Float (Re (Item)), Long_Float (Im (Item)), Aft, Exp);
else
Aux_Long_Long_Float.Puts
(S, Long_Long_Float (Re (Item)), Long_Long_Float (Im (Item)),
Aft, Exp);
end if;
for J in S'Range loop
To (J) := Wide_Character'Val (Character'Pos (S (J)));

View file

@ -20,42 +20,40 @@ generic
package Ada.Wide_Text_IO.Complex_IO is
use Complex_Types;
Default_Fore : Field := 2;
Default_Aft : Field := Real'Digits - 1;
Default_Aft : Field := Complex_Types.Real'Digits - 1;
Default_Exp : Field := 3;
procedure Get
(File : File_Type;
Item : out Complex;
Item : out Complex_Types.Complex;
Width : Field := 0);
procedure Get
(Item : out Complex;
(Item : out Complex_Types.Complex;
Width : Field := 0);
procedure Put
(File : File_Type;
Item : Complex;
Item : Complex_Types.Complex;
Fore : Field := Default_Fore;
Aft : Field := Default_Aft;
Exp : Field := Default_Exp);
procedure Put
(Item : Complex;
(Item : Complex_Types.Complex;
Fore : Field := Default_Fore;
Aft : Field := Default_Aft;
Exp : Field := Default_Exp);
procedure Get
(From : Wide_String;
Item : out Complex;
Item : out Complex_Types.Complex;
Last : out Positive);
procedure Put
(To : out Wide_String;
Item : Complex;
Item : Complex_Types.Complex;
Aft : Field := Default_Aft;
Exp : Field := Default_Exp);

View file

@ -30,7 +30,6 @@
------------------------------------------------------------------------------
with Ada.Wide_Text_IO.Generic_Aux; use Ada.Wide_Text_IO.Generic_Aux;
with Ada.Wide_Text_IO.Float_Aux; use Ada.Wide_Text_IO.Float_Aux;
package body Ada.Wide_Text_IO.Decimal_Aux is

View file

@ -30,7 +30,6 @@
------------------------------------------------------------------------------
with Ada.Wide_Text_IO.Generic_Aux; use Ada.Wide_Text_IO.Generic_Aux;
with Ada.Wide_Text_IO.Float_Aux; use Ada.Wide_Text_IO.Float_Aux;
package body Ada.Wide_Text_IO.Fixed_Aux is

View file

@ -36,6 +36,7 @@ with System.Img_Fixed_32; use System.Img_Fixed_32;
with System.Img_Fixed_64; use System.Img_Fixed_64;
with System.Val_Fixed_32; use System.Val_Fixed_32;
with System.Val_Fixed_64; use System.Val_Fixed_64;
with System.Val_LLF; use System.Val_LLF;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_WtS; use System.WCh_WtS;
@ -55,6 +56,9 @@ package body Ada.Wide_Text_IO.Fixed_IO is
package Aux64 is new
Ada.Wide_Text_IO.Fixed_Aux (Int64, Scan_Fixed64, Set_Image_Fixed64);
package Aux_Long_Long_Float is new
Ada.Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
-- Throughout this generic body, we distinguish between the case where type
-- Int32 is OK and where type Int64 is OK. These boolean constants are used
-- to test for this, such that only code for the relevant case is included
@ -157,7 +161,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator,
-Num'Small_Denominator));
else
Float_Aux.Get (File, Long_Long_Float (Item), Width);
Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
end if;
exception
@ -197,7 +201,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator,
-Num'Small_Denominator));
else
Float_Aux.Gets (S, Long_Long_Float (Item), Last);
Aux_Long_Long_Float.Gets (S, Long_Long_Float (Item), Last);
end if;
exception
@ -225,7 +229,8 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator, -Num'Small_Denominator,
For0, Num'Aft);
else
Float_Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
Aux_Long_Long_Float.Put
(File, Long_Long_Float (Item), Fore, Aft, Exp);
end if;
end Put;
@ -257,7 +262,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator, -Num'Small_Denominator,
For0, Num'Aft);
else
Float_Aux.Puts (S, Long_Long_Float (Item), Aft, Exp);
Aux_Long_Long_Float.Puts (S, Long_Long_Float (Item), Aft, Exp);
end if;
for J in S'Range loop

View file

@ -38,6 +38,7 @@ with System.Img_Fixed_128; use System.Img_Fixed_128;
with System.Val_Fixed_32; use System.Val_Fixed_32;
with System.Val_Fixed_64; use System.Val_Fixed_64;
with System.Val_Fixed_128; use System.Val_Fixed_128;
with System.Val_LLF; use System.Val_LLF;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_WtS; use System.WCh_WtS;
@ -61,6 +62,9 @@ package body Ada.Wide_Text_IO.Fixed_IO is
package Aux128 is new
Ada.Wide_Text_IO.Fixed_Aux (Int128, Scan_Fixed128, Set_Image_Fixed128);
package Aux_Long_Long_Float is new
Ada.Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
-- Throughout this generic body, we distinguish between the case where type
-- Int32 is OK, where type Int64 is OK and where type Int128 is OK. These
-- boolean constants are used to test for this, such that only code for the
@ -197,7 +201,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator,
-Num'Small_Denominator));
else
Float_Aux.Get (File, Long_Long_Float (Item), Width);
Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
end if;
exception
@ -242,7 +246,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator,
-Num'Small_Denominator));
else
Float_Aux.Gets (S, Long_Long_Float (Item), Last);
Aux_Long_Long_Float.Gets (S, Long_Long_Float (Item), Last);
end if;
exception
@ -274,7 +278,8 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator, -Num'Small_Denominator,
For0, Num'Aft);
else
Float_Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
Aux_Long_Long_Float.Put
(File, Long_Long_Float (Item), Fore, Aft, Exp);
end if;
end Put;
@ -310,7 +315,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator, -Num'Small_Denominator,
For0, Num'Aft);
else
Float_Aux.Puts (S, Long_Long_Float (Item), Aft, Exp);
Aux_Long_Long_Float.Puts (S, Long_Long_Float (Item), Aft, Exp);
end if;
for J in S'Range loop

View file

@ -31,8 +31,7 @@
with Ada.Wide_Text_IO.Generic_Aux; use Ada.Wide_Text_IO.Generic_Aux;
with System.Img_Real; use System.Img_Real;
with System.Val_Real; use System.Val_Real;
with System.Img_Real; use System.Img_Real;
package body Ada.Wide_Text_IO.Float_Aux is
@ -42,12 +41,12 @@ package body Ada.Wide_Text_IO.Float_Aux is
procedure Get
(File : File_Type;
Item : out Long_Long_Float;
Item : out Num;
Width : Field)
is
Buf : String (1 .. Field'Last);
Stop : Integer := 0;
Ptr : aliased Integer := 1;
Ptr : aliased Integer;
begin
if Width /= 0 then
@ -55,10 +54,10 @@ package body Ada.Wide_Text_IO.Float_Aux is
String_Skip (Buf, Ptr);
else
Load_Real (File, Buf, Stop);
Ptr := 1;
end if;
Item := Scan_Real (Buf, Ptr'Access, Stop);
Item := Scan (Buf, Ptr'Access, Stop);
Check_End_Of_Field (Buf, Stop, Ptr, Width);
end Get;
@ -68,137 +67,36 @@ package body Ada.Wide_Text_IO.Float_Aux is
procedure Gets
(From : String;
Item : out Long_Long_Float;
Item : out Num;
Last : out Positive)
is
Pos : aliased Integer;
begin
String_Skip (From, Pos);
Item := Scan_Real (From, Pos'Access, From'Last);
Item := Scan (From, Pos'Access, From'Last);
Last := Pos - 1;
exception
when Constraint_Error =>
raise Data_Error;
when Constraint_Error => raise Data_Error;
end Gets;
---------------
-- Load_Real --
---------------
procedure Load_Real
(File : File_Type;
Buf : out String;
Ptr : in out Natural)
is
Loaded : Boolean;
begin
-- Skip initial blanks and load possible sign
Load_Skip (File);
Load (File, Buf, Ptr, '+', '-');
-- Case of .nnnn
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Digits (File, Buf, Ptr, Loaded);
-- Hopeless junk if no digits loaded
if not Loaded then
return;
end if;
-- Otherwise must have digits to start
else
Load_Digits (File, Buf, Ptr, Loaded);
-- Hopeless junk if no digits loaded
if not Loaded then
return;
end if;
-- Deal with based case. We recognize either the standard '#' or the
-- allowed alternative replacement ':' (see RM J.2(3)).
Load (File, Buf, Ptr, '#', ':', Loaded);
if Loaded then
-- Case of nnn#.xxx#
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Extended_Digits (File, Buf, Ptr);
Load (File, Buf, Ptr, '#', ':');
-- Case of nnn#xxx.[xxx]# or nnn#xxx#
else
Load_Extended_Digits (File, Buf, Ptr);
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Extended_Digits (File, Buf, Ptr);
end if;
-- As usual, it seems strange to allow mixed base characters,
-- but that is what ACVC tests expect, see CE3804M, case (3).
Load (File, Buf, Ptr, '#', ':');
end if;
-- Case of nnn.[nnn] or nnn
else
-- Prevent the potential processing of '.' in cases where the
-- initial digits have a trailing underscore.
if Buf (Ptr) = '_' then
return;
end if;
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Digits (File, Buf, Ptr);
end if;
end if;
end if;
-- Deal with exponent
Load (File, Buf, Ptr, 'E', 'e', Loaded);
if Loaded then
Load (File, Buf, Ptr, '+', '-');
Load_Digits (File, Buf, Ptr);
end if;
end Load_Real;
---------
-- Put --
---------
procedure Put
(File : File_Type;
Item : Long_Long_Float;
Item : Num;
Fore : Field;
Aft : Field;
Exp : Field)
is
Buf : String (1 .. Field'Last);
Buf : String (1 .. Max_Real_Image_Length);
Ptr : Natural := 0;
begin
Set_Image_Real (Item, Buf, Ptr, Fore, Aft, Exp);
Set_Image_Real (Long_Long_Float (Item), Buf, Ptr, Fore, Aft, Exp);
Put_Item (File, Buf (1 .. Ptr));
end Put;
@ -208,15 +106,16 @@ package body Ada.Wide_Text_IO.Float_Aux is
procedure Puts
(To : out String;
Item : Long_Long_Float;
Item : Num;
Aft : Field;
Exp : Field)
is
Buf : String (1 .. Field'Last);
Buf : String (1 .. Max_Real_Image_Length);
Ptr : Natural := 0;
begin
Set_Image_Real (Item, Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
Set_Image_Real
(Long_Long_Float (Item), Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
if Ptr > To'Length then
raise Layout_Error;

View file

@ -31,41 +31,42 @@
-- This package contains the routines for Ada.Wide_Text_IO.Float_IO that
-- are shared among separate instantiations of this package. The routines
-- in this package are identical semantically to those in Float_IO itself,
-- except that generic parameter Num has been replaced by Long_Long_Float,
-- and the default parameters have been removed because they are supplied
-- in this package are identical semantically to those in Float_IO, except
-- that the default parameters have been removed because they are supplied
-- explicitly by the calls from within the generic template. This package
-- is also used by Ada.Wide_Text_IO.Fixed_IO, Ada.Wide_Text_IO.Decimal_IO.
-- is also used by Ada.Wide_Text_IO.Fixed_IO and Ada.Wide_Text_IO.Decimal_IO.
private package Ada.Wide_Text_IO.Float_Aux is
private generic
procedure Load_Real
(File : File_Type;
Buf : out String;
Ptr : in out Natural);
-- This is an auxiliary routine that is used to load a possibly signed
-- real literal value from the input file into Buf, starting at Ptr + 1.
type Num is digits <>;
with function Scan
(Str : String;
Ptr : not null access Integer;
Max : Integer) return Num;
package Ada.Wide_Text_IO.Float_Aux is
procedure Get
(File : File_Type;
Item : out Long_Long_Float;
Item : out Num;
Width : Field);
procedure Gets
(From : String;
Item : out Long_Long_Float;
Last : out Positive);
procedure Put
(File : File_Type;
Item : Long_Long_Float;
Item : Num;
Fore : Field;
Aft : Field;
Exp : Field);
procedure Gets
(From : String;
Item : out Num;
Last : out Positive);
procedure Puts
(To : out String;
Item : Long_Long_Float;
Item : Num;
Aft : Field;
Exp : Field);

View file

@ -30,13 +30,31 @@
------------------------------------------------------------------------------
with Ada.Wide_Text_IO.Float_Aux;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_WtS; use System.WCh_WtS;
with System.Val_Flt; use System.Val_Flt;
with System.Val_LFlt; use System.Val_LFlt;
with System.Val_LLF; use System.Val_LLF;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_WtS; use System.WCh_WtS;
package body Ada.Wide_Text_IO.Float_IO is
package Aux renames Ada.Wide_Text_IO.Float_Aux;
package Aux_Float is new
Ada.Wide_Text_IO.Float_Aux (Float, Scan_Float);
package Aux_Long_Float is new
Ada.Wide_Text_IO.Float_Aux (Long_Float, Scan_Long_Float);
package Aux_Long_Long_Float is new
Ada.Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
-- Throughout this generic body, we distinguish between the case where type
-- Float is OK, where type Long_Float is OK and where type Long_Long_Float
-- is needed. These boolean constants are used to test for this, such that
-- only code for the relevant case is included in the instance.
OK_Float : constant Boolean := Num'Base'Digits <= Float'Digits;
OK_Long_Float : constant Boolean := Num'Base'Digits <= Long_Float'Digits;
---------
-- Get --
@ -47,8 +65,25 @@ package body Ada.Wide_Text_IO.Float_IO is
Item : out Num;
Width : Field := 0)
is
pragma Unsuppress (Range_Check);
begin
Aux.Get (File, Long_Long_Float (Item), Width);
if OK_Float then
Aux_Float.Get (File, Float (Item), Width);
elsif OK_Long_Float then
Aux_Long_Float.Get (File, Long_Float (Item), Width);
else
Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
end if;
-- In the case where the type is unconstrained (e.g. Standard'Float),
-- the above conversion may result in an infinite value, which is
-- normally fine for a conversion, but in this case, we want to treat
-- that as a data error.
if not Item'Valid then
raise Data_Error;
end if;
exception
when Constraint_Error => raise Data_Error;
@ -67,6 +102,8 @@ package body Ada.Wide_Text_IO.Float_IO is
Item : out Num;
Last : out Positive)
is
pragma Unsuppress (Range_Check);
S : constant String := Wide_String_To_String (From, WCEM_Upper);
-- String on which we do the actual conversion. Note that the method
-- used for wide character encoding is irrelevant, since if there is
@ -74,7 +111,22 @@ package body Ada.Wide_Text_IO.Float_IO is
-- Aux.Gets will raise Data_Error in any case.
begin
Aux.Gets (S, Long_Long_Float (Item), Last);
if OK_Float then
Aux_Float.Gets (S, Float (Item), Last);
elsif OK_Long_Float then
Aux_Long_Float.Gets (S, Long_Float (Item), Last);
else
Aux_Long_Long_Float.Gets (S, Long_Long_Float (Item), Last);
end if;
-- In the case where the type is unconstrained (e.g. Standard'Float),
-- the above conversion may result in an infinite value, which is
-- normally fine for a conversion, but in this case, we want to treat
-- that as a data error.
if not Item'Valid then
raise Data_Error;
end if;
exception
when Constraint_Error => raise Data_Error;
@ -92,7 +144,14 @@ package body Ada.Wide_Text_IO.Float_IO is
Exp : Field := Default_Exp)
is
begin
Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
if OK_Float then
Aux_Float.Put (File, Float (Item), Fore, Aft, Exp);
elsif OK_Long_Float then
Aux_Long_Float.Put (File, Long_Float (Item), Fore, Aft, Exp);
else
Aux_Long_Long_Float.Put
(File, Long_Long_Float (Item), Fore, Aft, Exp);
end if;
end Put;
procedure Put
@ -114,7 +173,13 @@ package body Ada.Wide_Text_IO.Float_IO is
S : String (To'First .. To'Last);
begin
Aux.Puts (S, Long_Long_Float (Item), Aft, Exp);
if OK_Float then
Aux_Float.Puts (S, Float (Item), Aft, Exp);
elsif OK_Long_Float then
Aux_Long_Float.Puts (S, Long_Float (Item), Aft, Exp);
else
Aux_Long_Long_Float.Puts (S, Long_Long_Float (Item), Aft, Exp);
end if;
for J in S'Range loop
To (J) := Wide_Character'Val (Character'Pos (S (J)));

View file

@ -402,6 +402,106 @@ package body Ada.Wide_Text_IO.Generic_Aux is
end if;
end Load_Integer;
---------------
-- Load_Real --
---------------
procedure Load_Real
(File : File_Type;
Buf : out String;
Ptr : in out Natural)
is
Loaded : Boolean;
begin
-- Skip initial blanks and load possible sign
Load_Skip (File);
Load (File, Buf, Ptr, '+', '-');
-- Case of .nnnn
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Digits (File, Buf, Ptr, Loaded);
-- Hopeless junk if no digits loaded
if not Loaded then
return;
end if;
-- Otherwise must have digits to start
else
Load_Digits (File, Buf, Ptr, Loaded);
-- Hopeless junk if no digits loaded
if not Loaded then
return;
end if;
-- Deal with based case. We recognize either the standard '#' or the
-- allowed alternative replacement ':' (see RM J.2(3)).
Load (File, Buf, Ptr, '#', ':', Loaded);
if Loaded then
-- Case of nnn#.xxx#
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Extended_Digits (File, Buf, Ptr);
Load (File, Buf, Ptr, '#', ':');
-- Case of nnn#xxx.[xxx]# or nnn#xxx#
else
Load_Extended_Digits (File, Buf, Ptr);
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Extended_Digits (File, Buf, Ptr);
end if;
-- As usual, it seems strange to allow mixed base characters,
-- but that is what ACVC tests expect, see CE3804M, case (3).
Load (File, Buf, Ptr, '#', ':');
end if;
-- Case of nnn.[nnn] or nnn
else
-- Prevent the potential processing of '.' in cases where the
-- initial digits have a trailing underscore.
if Buf (Ptr) = '_' then
return;
end if;
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Digits (File, Buf, Ptr);
end if;
end if;
end if;
-- Deal with exponent
Load (File, Buf, Ptr, 'E', 'e', Loaded);
if Loaded then
Load (File, Buf, Ptr, '+', '-');
Load_Digits (File, Buf, Ptr);
end if;
end Load_Real;
---------------
-- Load_Skip --
---------------

View file

@ -155,6 +155,12 @@ package Ada.Wide_Text_IO.Generic_Aux is
Ptr : in out Natural);
-- Loads a possibly signed integer literal value
procedure Load_Real
(File : File_Type;
Buf : out String;
Ptr : in out Natural);
-- Loads a possibly signed real literal value
procedure Put_Item (File : File_Type; Str : String);
-- This routine is like Wide_Text_IO.Put, except that it checks for
-- overflow of bounded lines, as described in (RM A.10.6(8)). It is used

View file

@ -30,22 +30,19 @@
------------------------------------------------------------------------------
with Ada.Wide_Wide_Text_IO.Generic_Aux; use Ada.Wide_Wide_Text_IO.Generic_Aux;
with Ada.Wide_Wide_Text_IO.Float_Aux;
with System.Img_Real; use System.Img_Real;
package body Ada.Wide_Wide_Text_IO.Complex_Aux is
package Aux renames Ada.Wide_Wide_Text_IO.Float_Aux;
---------
-- Get --
---------
procedure Get
(File : File_Type;
ItemR : out Long_Long_Float;
ItemI : out Long_Long_Float;
ItemR : out Num;
ItemI : out Num;
Width : Field)
is
Buf : String (1 .. Field'Last);
@ -95,8 +92,8 @@ package body Ada.Wide_Wide_Text_IO.Complex_Aux is
procedure Gets
(From : String;
ItemR : out Long_Long_Float;
ItemI : out Long_Long_Float;
ItemR : out Num;
ItemI : out Num;
Last : out Positive)
is
Paren : Boolean;
@ -139,8 +136,8 @@ package body Ada.Wide_Wide_Text_IO.Complex_Aux is
procedure Put
(File : File_Type;
ItemR : Long_Long_Float;
ItemI : Long_Long_Float;
ItemR : Num;
ItemI : Num;
Fore : Field;
Aft : Field;
Exp : Field)
@ -159,8 +156,8 @@ package body Ada.Wide_Wide_Text_IO.Complex_Aux is
procedure Puts
(To : out String;
ItemR : Long_Long_Float;
ItemI : Long_Long_Float;
ItemR : Num;
ItemI : Num;
Aft : Field;
Exp : Field)
is
@ -174,9 +171,9 @@ package body Ada.Wide_Wide_Text_IO.Complex_Aux is
-- Both parts are initially converted with a Fore of 0
Rptr := 0;
Set_Image_Real (ItemR, R_String, Rptr, 0, Aft, Exp);
Set_Image_Real (Long_Long_Float (ItemR), R_String, Rptr, 0, Aft, Exp);
Iptr := 0;
Set_Image_Real (ItemI, I_String, Iptr, 0, Aft, Exp);
Set_Image_Real (Long_Long_Float (ItemI), I_String, Iptr, 0, Aft, Exp);
-- Check room for both parts plus parens plus comma (RM G.1.3(34))

View file

@ -15,38 +15,45 @@
-- This package contains the routines for Ada.Wide_Wide_Text_IO.Complex_IO
-- that are shared among separate instantiations of this package. The routines
-- in this package are identical semantically to those in Complex_IO itself,
-- except that the generic parameter Complex has been replaced by separate
-- real and imaginary values of type Long_Long_Float, and default parameters
-- have been removed because they are supplied explicitly by the calls from
-- within the generic template.
-- in this package are identical semantically to those in Complex_IO, except
-- that the generic parameter Complex has been replaced by separate real and
-- imaginary parameters, and default parameters have been removed because they
-- are supplied explicitly by the calls from within the generic template.
with Ada.Wide_Wide_Text_IO.Float_Aux;
private generic
type Num is digits <>;
with package Aux is new Ada.Wide_Wide_Text_IO.Float_Aux (Num, <>);
package Ada.Wide_Wide_Text_IO.Complex_Aux is
procedure Get
(File : File_Type;
ItemR : out Long_Long_Float;
ItemI : out Long_Long_Float;
ItemR : out Num;
ItemI : out Num;
Width : Field);
procedure Gets
(From : String;
ItemR : out Long_Long_Float;
ItemI : out Long_Long_Float;
Last : out Positive);
procedure Put
(File : File_Type;
ItemR : Long_Long_Float;
ItemI : Long_Long_Float;
ItemR : Num;
ItemI : Num;
Fore : Field;
Aft : Field;
Exp : Field);
procedure Gets
(From : String;
ItemR : out Num;
ItemI : out Num;
Last : out Positive);
procedure Puts
(To : out String;
ItemR : Long_Long_Float;
ItemI : Long_Long_Float;
ItemR : Num;
ItemI : Num;
Aft : Field;
Exp : Field);

View file

@ -30,24 +30,46 @@
------------------------------------------------------------------------------
with Ada.Wide_Wide_Text_IO.Complex_Aux;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_WtS; use System.WCh_WtS;
with Ada.Wide_Wide_Text_IO.Float_Aux;
with System.Val_Flt; use System.Val_Flt;
with System.Val_LFlt; use System.Val_LFlt;
with System.Val_LLF; use System.Val_LLF;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_WtS; use System.WCh_WtS;
with Ada.Unchecked_Conversion;
package body Ada.Wide_Wide_Text_IO.Complex_IO is
package Aux renames Ada.Wide_Wide_Text_IO.Complex_Aux;
use Complex_Types;
subtype LLF is Long_Long_Float;
-- Type used for calls to routines in Aux
package Scalar_Float is new
Ada.Wide_Wide_Text_IO.Float_Aux (Float, Scan_Float);
function TFT is new
Ada.Unchecked_Conversion (File_Type, Ada.Wide_Wide_Text_IO.File_Type);
-- This unchecked conversion is to get around a visibility bug in
-- GNAT version 2.04w. It should be possible to simply use the
-- subtype declared above and do normal checked conversions.
package Scalar_Long_Float is new
Ada.Wide_Wide_Text_IO.Float_Aux (Long_Float, Scan_Long_Float);
package Scalar_Long_Long_Float is new
Ada.Wide_Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
package Aux_Float is new
Ada.Wide_Wide_Text_IO.Complex_Aux (Float, Scalar_Float);
package Aux_Long_Float is new
Ada.Wide_Wide_Text_IO.Complex_Aux (Long_Float, Scalar_Long_Float);
package Aux_Long_Long_Float is new
Ada.Wide_Wide_Text_IO.Complex_Aux
(Long_Long_Float, Scalar_Long_Long_Float);
-- Throughout this generic body, we distinguish between the case where type
-- Float is OK, where type Long_Float is OK and where type Long_Long_Float
-- is needed. These boolean constants are used to test for this, such that
-- only code for the relevant case is included in the instance.
OK_Float : constant Boolean := Real'Base'Digits <= Float'Digits;
OK_Long_Float : constant Boolean := Real'Base'Digits <= Long_Float'Digits;
---------
-- Get --
@ -62,7 +84,17 @@ package body Ada.Wide_Wide_Text_IO.Complex_IO is
Imag_Item : Real'Base;
begin
Aux.Get (TFT (File), LLF (Real_Item), LLF (Imag_Item), Width);
if OK_Float then
Aux_Float.Get (File, Float (Real_Item), Float (Imag_Item), Width);
elsif OK_Long_Float then
Aux_Long_Float.Get
(File, Long_Float (Real_Item), Long_Float (Imag_Item), Width);
else
Aux_Long_Long_Float.Get
(File, Long_Long_Float (Real_Item), Long_Long_Float (Imag_Item),
Width);
end if;
Item := (Real_Item, Imag_Item);
exception
@ -100,7 +132,17 @@ package body Ada.Wide_Wide_Text_IO.Complex_IO is
-- Aux.Gets will raise Data_Error in any case.
begin
Aux.Gets (S, LLF (Real_Item), LLF (Imag_Item), Last);
if OK_Float then
Aux_Float.Gets (S, Float (Real_Item), Float (Imag_Item), Last);
elsif OK_Long_Float then
Aux_Long_Float.Gets
(S, Long_Float (Real_Item), Long_Float (Imag_Item), Last);
else
Aux_Long_Long_Float.Gets
(S, Long_Long_Float (Real_Item), Long_Long_Float (Imag_Item),
Last);
end if;
Item := (Real_Item, Imag_Item);
exception
@ -119,7 +161,18 @@ package body Ada.Wide_Wide_Text_IO.Complex_IO is
Exp : Field := Default_Exp)
is
begin
Aux.Put (TFT (File), LLF (Re (Item)), LLF (Im (Item)), Fore, Aft, Exp);
if OK_Float then
Aux_Float.Put
(File, Float (Re (Item)), Float (Im (Item)), Fore, Aft, Exp);
elsif OK_Long_Float then
Aux_Long_Float.Put
(File, Long_Float (Re (Item)), Long_Float (Im (Item)), Fore, Aft,
Exp);
else
Aux_Long_Long_Float.Put
(File, Long_Long_Float (Re (Item)), Long_Long_Float (Im (Item)),
Fore, Aft, Exp);
end if;
end Put;
---------
@ -149,7 +202,16 @@ package body Ada.Wide_Wide_Text_IO.Complex_IO is
S : String (To'First .. To'Last);
begin
Aux.Puts (S, LLF (Re (Item)), LLF (Im (Item)), Aft, Exp);
if OK_Float then
Aux_Float.Puts (S, Float (Re (Item)), Float (Im (Item)), Aft, Exp);
elsif OK_Long_Float then
Aux_Long_Float.Puts
(S, Long_Float (Re (Item)), Long_Float (Im (Item)), Aft, Exp);
else
Aux_Long_Long_Float.Puts
(S, Long_Long_Float (Re (Item)), Long_Long_Float (Im (Item)),
Aft, Exp);
end if;
for J in S'Range loop
To (J) := Wide_Wide_Character'Val (Character'Pos (S (J)));

View file

@ -23,39 +23,39 @@ package Ada.Wide_Wide_Text_IO.Complex_IO is
use Complex_Types;
Default_Fore : Field := 2;
Default_Aft : Field := Real'Digits - 1;
Default_Aft : Field := Complex_Types.Real'Digits - 1;
Default_Exp : Field := 3;
procedure Get
(File : File_Type;
Item : out Complex;
Item : out Complex_Types.Complex;
Width : Field := 0);
procedure Get
(Item : out Complex;
(Item : out Complex_Types.Complex;
Width : Field := 0);
procedure Put
(File : File_Type;
Item : Complex;
Item : Complex_Types.Complex;
Fore : Field := Default_Fore;
Aft : Field := Default_Aft;
Exp : Field := Default_Exp);
procedure Put
(Item : Complex;
(Item : Complex_Types.Complex;
Fore : Field := Default_Fore;
Aft : Field := Default_Aft;
Exp : Field := Default_Exp);
procedure Get
(From : Wide_Wide_String;
Item : out Complex;
Item : out Complex_Types.Complex;
Last : out Positive);
procedure Put
(To : out Wide_Wide_String;
Item : Complex;
Item : Complex_Types.Complex;
Aft : Field := Default_Aft;
Exp : Field := Default_Exp);

View file

@ -30,7 +30,6 @@
------------------------------------------------------------------------------
with Ada.Wide_Wide_Text_IO.Generic_Aux; use Ada.Wide_Wide_Text_IO.Generic_Aux;
with Ada.Wide_Wide_Text_IO.Float_Aux; use Ada.Wide_Wide_Text_IO.Float_Aux;
package body Ada.Wide_Wide_Text_IO.Decimal_Aux is

View file

@ -30,7 +30,6 @@
------------------------------------------------------------------------------
with Ada.Wide_Wide_Text_IO.Generic_Aux; use Ada.Wide_Wide_Text_IO.Generic_Aux;
with Ada.Wide_Wide_Text_IO.Float_Aux; use Ada.Wide_Wide_Text_IO.Float_Aux;
package body Ada.Wide_Wide_Text_IO.Fixed_Aux is

View file

@ -36,6 +36,7 @@ with System.Img_Fixed_32; use System.Img_Fixed_32;
with System.Img_Fixed_64; use System.Img_Fixed_64;
with System.Val_Fixed_32; use System.Val_Fixed_32;
with System.Val_Fixed_64; use System.Val_Fixed_64;
with System.Val_LLF; use System.Val_LLF;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_WtS; use System.WCh_WtS;
@ -55,6 +56,9 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
package Aux64 is new
Ada.Wide_Wide_Text_IO.Fixed_Aux (Int64, Scan_Fixed64, Set_Image_Fixed64);
package Aux_Long_Long_Float is new
Ada.Wide_Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
-- Throughout this generic body, we distinguish between the case where type
-- Int32 is OK and where type Int64 is OK. These boolean constants are used
-- to test for this, such that only code for the relevant case is included
@ -157,7 +161,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator,
-Num'Small_Denominator));
else
Float_Aux.Get (File, Long_Long_Float (Item), Width);
Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
end if;
exception
@ -197,7 +201,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator,
-Num'Small_Denominator));
else
Float_Aux.Gets (S, Long_Long_Float (Item), Last);
Aux_Long_Long_Float.Gets (S, Long_Long_Float (Item), Last);
end if;
exception
@ -225,7 +229,8 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator, -Num'Small_Denominator,
For0, Num'Aft);
else
Float_Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
Aux_Long_Long_Float.Put
(File, Long_Long_Float (Item), Fore, Aft, Exp);
end if;
end Put;
@ -257,7 +262,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator, -Num'Small_Denominator,
For0, Num'Aft);
else
Float_Aux.Puts (S, Long_Long_Float (Item), Aft, Exp);
Aux_Long_Long_Float.Puts (S, Long_Long_Float (Item), Aft, Exp);
end if;
for J in S'Range loop

View file

@ -38,6 +38,7 @@ with System.Img_Fixed_128; use System.Img_Fixed_128;
with System.Val_Fixed_32; use System.Val_Fixed_32;
with System.Val_Fixed_64; use System.Val_Fixed_64;
with System.Val_Fixed_128; use System.Val_Fixed_128;
with System.Val_LLF; use System.Val_LLF;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_WtS; use System.WCh_WtS;
@ -62,6 +63,9 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
Ada.Wide_Wide_Text_IO.Fixed_Aux
(Int128, Scan_Fixed128, Set_Image_Fixed128);
package Aux_Long_Long_Float is new
Ada.Wide_Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
-- Throughout this generic body, we distinguish between the case where type
-- Int32 is OK, where type Int64 is OK and where type Int128 is OK. These
-- boolean constants are used to test for this, such that only code for the
@ -198,7 +202,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator,
-Num'Small_Denominator));
else
Float_Aux.Get (File, Long_Long_Float (Item), Width);
Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
end if;
exception
@ -243,7 +247,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator,
-Num'Small_Denominator));
else
Float_Aux.Gets (S, Long_Long_Float (Item), Last);
Aux_Long_Long_Float.Gets (S, Long_Long_Float (Item), Last);
end if;
exception
@ -275,7 +279,8 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator, -Num'Small_Denominator,
For0, Num'Aft);
else
Float_Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
Aux_Long_Long_Float.Put
(File, Long_Long_Float (Item), Fore, Aft, Exp);
end if;
end Put;
@ -311,7 +316,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-Num'Small_Numerator, -Num'Small_Denominator,
For0, Num'Aft);
else
Float_Aux.Puts (S, Long_Long_Float (Item), Aft, Exp);
Aux_Long_Long_Float.Puts (S, Long_Long_Float (Item), Aft, Exp);
end if;
for J in S'Range loop

View file

@ -31,8 +31,7 @@
with Ada.Wide_Wide_Text_IO.Generic_Aux; use Ada.Wide_Wide_Text_IO.Generic_Aux;
with System.Img_Real; use System.Img_Real;
with System.Val_Real; use System.Val_Real;
with System.Img_Real; use System.Img_Real;
package body Ada.Wide_Wide_Text_IO.Float_Aux is
@ -42,12 +41,12 @@ package body Ada.Wide_Wide_Text_IO.Float_Aux is
procedure Get
(File : File_Type;
Item : out Long_Long_Float;
Item : out Num;
Width : Field)
is
Buf : String (1 .. Field'Last);
Stop : Integer := 0;
Ptr : aliased Integer := 1;
Ptr : aliased Integer;
begin
if Width /= 0 then
@ -55,10 +54,10 @@ package body Ada.Wide_Wide_Text_IO.Float_Aux is
String_Skip (Buf, Ptr);
else
Load_Real (File, Buf, Stop);
Ptr := 1;
end if;
Item := Scan_Real (Buf, Ptr'Access, Stop);
Item := Scan (Buf, Ptr'Access, Stop);
Check_End_Of_Field (Buf, Stop, Ptr, Width);
end Get;
@ -68,137 +67,36 @@ package body Ada.Wide_Wide_Text_IO.Float_Aux is
procedure Gets
(From : String;
Item : out Long_Long_Float;
Item : out Num;
Last : out Positive)
is
Pos : aliased Integer;
begin
String_Skip (From, Pos);
Item := Scan_Real (From, Pos'Access, From'Last);
Item := Scan (From, Pos'Access, From'Last);
Last := Pos - 1;
exception
when Constraint_Error =>
raise Data_Error;
when Constraint_Error => raise Data_Error;
end Gets;
---------------
-- Load_Real --
---------------
procedure Load_Real
(File : File_Type;
Buf : out String;
Ptr : in out Natural)
is
Loaded : Boolean;
begin
-- Skip initial blanks and load possible sign
Load_Skip (File);
Load (File, Buf, Ptr, '+', '-');
-- Case of .nnnn
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Digits (File, Buf, Ptr, Loaded);
-- Hopeless junk if no digits loaded
if not Loaded then
return;
end if;
-- Otherwise must have digits to start
else
Load_Digits (File, Buf, Ptr, Loaded);
-- Hopeless junk if no digits loaded
if not Loaded then
return;
end if;
-- Deal with based case. We recognize either the standard '#' or the
-- allowed alternative replacement ':' (see RM J.2(3)).
Load (File, Buf, Ptr, '#', ':', Loaded);
if Loaded then
-- Case of nnn#.xxx#
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Extended_Digits (File, Buf, Ptr);
Load (File, Buf, Ptr, '#', ':');
-- Case of nnn#xxx.[xxx]# or nnn#xxx#
else
Load_Extended_Digits (File, Buf, Ptr);
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Extended_Digits (File, Buf, Ptr);
end if;
-- As usual, it seems strange to allow mixed base characters,
-- but that is what ACVC tests expect, see CE3804M, case (3).
Load (File, Buf, Ptr, '#', ':');
end if;
-- Case of nnn.[nnn] or nnn
else
-- Prevent the potential processing of '.' in cases where the
-- initial digits have a trailing underscore.
if Buf (Ptr) = '_' then
return;
end if;
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Digits (File, Buf, Ptr);
end if;
end if;
end if;
-- Deal with exponent
Load (File, Buf, Ptr, 'E', 'e', Loaded);
if Loaded then
Load (File, Buf, Ptr, '+', '-');
Load_Digits (File, Buf, Ptr);
end if;
end Load_Real;
---------
-- Put --
---------
procedure Put
(File : File_Type;
Item : Long_Long_Float;
Item : Num;
Fore : Field;
Aft : Field;
Exp : Field)
is
Buf : String (1 .. Field'Last);
Buf : String (1 .. Max_Real_Image_Length);
Ptr : Natural := 0;
begin
Set_Image_Real (Item, Buf, Ptr, Fore, Aft, Exp);
Set_Image_Real (Long_Long_Float (Item), Buf, Ptr, Fore, Aft, Exp);
Put_Item (File, Buf (1 .. Ptr));
end Put;
@ -208,15 +106,16 @@ package body Ada.Wide_Wide_Text_IO.Float_Aux is
procedure Puts
(To : out String;
Item : Long_Long_Float;
Item : Num;
Aft : Field;
Exp : Field)
is
Buf : String (1 .. Field'Last);
Ptr : Natural := 0;
Buf : String (1 .. Max_Real_Image_Length);
Ptr : Natural := 0;
begin
Set_Image_Real (Item, Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
Set_Image_Real
(Long_Long_Float (Item), Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
if Ptr > To'Length then
raise Layout_Error;

View file

@ -31,41 +31,42 @@
-- This package contains the routines for Ada.Wide_Wide_Text_IO.Float_IO that
-- are shared among separate instantiations of this package. The routines
-- in this package are identical semantically to those in Float_IO itself,
-- except that generic parameter Num has been replaced by Long_Long_Float,
-- and the default parameters have been removed because they are supplied
-- in this package are identical semantically to those in Float_IO, except
-- that the default parameters have been removed because they are supplied
-- explicitly by the calls from within the generic template. Also used by
-- Ada.Wide_Wide_Text_IO.Fixed_IO, and by Ada.Wide_Wide_Text_IO.Decimal_IO.
-- Ada.Wide_Wide_Text_IO.Fixed_IO and by Ada.Wide_Wide_Text_IO.Decimal_IO.
private package Ada.Wide_Wide_Text_IO.Float_Aux is
private generic
procedure Load_Real
(File : File_Type;
Buf : out String;
Ptr : in out Natural);
-- This is an auxiliary routine that is used to load a possibly signed
-- real literal value from the input file into Buf, starting at Ptr + 1.
type Num is digits <>;
with function Scan
(Str : String;
Ptr : not null access Integer;
Max : Integer) return Num;
package Ada.Wide_Wide_Text_IO.Float_Aux is
procedure Get
(File : File_Type;
Item : out Long_Long_Float;
Item : out Num;
Width : Field);
procedure Gets
(From : String;
Item : out Long_Long_Float;
Last : out Positive);
procedure Put
(File : File_Type;
Item : Long_Long_Float;
Item : Num;
Fore : Field;
Aft : Field;
Exp : Field);
procedure Gets
(From : String;
Item : out Num;
Last : out Positive);
procedure Puts
(To : out String;
Item : Long_Long_Float;
Item : Num;
Aft : Field;
Exp : Field);

View file

@ -30,12 +30,31 @@
------------------------------------------------------------------------------
with Ada.Wide_Wide_Text_IO.Float_Aux;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_WtS; use System.WCh_WtS;
with System.Val_Flt; use System.Val_Flt;
with System.Val_LFlt; use System.Val_LFlt;
with System.Val_LLF; use System.Val_LLF;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_WtS; use System.WCh_WtS;
package body Ada.Wide_Wide_Text_IO.Float_IO is
package Aux renames Ada.Wide_Wide_Text_IO.Float_Aux;
package Aux_Float is new
Ada.Wide_Wide_Text_IO.Float_Aux (Float, Scan_Float);
package Aux_Long_Float is new
Ada.Wide_Wide_Text_IO.Float_Aux (Long_Float, Scan_Long_Float);
package Aux_Long_Long_Float is new
Ada.Wide_Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
-- Throughout this generic body, we distinguish between the case where type
-- Float is OK, where type Long_Float is OK and where type Long_Long_Float
-- is needed. These boolean constants are used to test for this, such that
-- only code for the relevant case is included in the instance.
OK_Float : constant Boolean := Num'Base'Digits <= Float'Digits;
OK_Long_Float : constant Boolean := Num'Base'Digits <= Long_Float'Digits;
---------
-- Get --
@ -46,8 +65,25 @@ package body Ada.Wide_Wide_Text_IO.Float_IO is
Item : out Num;
Width : Field := 0)
is
pragma Unsuppress (Range_Check);
begin
Aux.Get (File, Long_Long_Float (Item), Width);
if OK_Float then
Aux_Float.Get (File, Float (Item), Width);
elsif OK_Long_Float then
Aux_Long_Float.Get (File, Long_Float (Item), Width);
else
Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
end if;
-- In the case where the type is unconstrained (e.g. Standard'Float),
-- the above conversion may result in an infinite value, which is
-- normally fine for a conversion, but in this case, we want to treat
-- that as a data error.
if not Item'Valid then
raise Data_Error;
end if;
exception
when Constraint_Error => raise Data_Error;
@ -66,6 +102,8 @@ package body Ada.Wide_Wide_Text_IO.Float_IO is
Item : out Num;
Last : out Positive)
is
pragma Unsuppress (Range_Check);
S : constant String := Wide_Wide_String_To_String (From, WCEM_Upper);
-- String on which we do the actual conversion. Note that the method
-- used for wide character encoding is irrelevant, since if there is
@ -73,7 +111,22 @@ package body Ada.Wide_Wide_Text_IO.Float_IO is
-- Aux.Gets will raise Data_Error in any case.
begin
Aux.Gets (S, Long_Long_Float (Item), Last);
if OK_Float then
Aux_Float.Gets (S, Float (Item), Last);
elsif OK_Long_Float then
Aux_Long_Float.Gets (S, Long_Float (Item), Last);
else
Aux_Long_Long_Float.Gets (S, Long_Long_Float (Item), Last);
end if;
-- In the case where the type is unconstrained (e.g. Standard'Float),
-- the above conversion may result in an infinite value, which is
-- normally fine for a conversion, but in this case, we want to treat
-- that as a data error.
if not Item'Valid then
raise Data_Error;
end if;
exception
when Constraint_Error => raise Data_Error;
@ -91,7 +144,14 @@ package body Ada.Wide_Wide_Text_IO.Float_IO is
Exp : Field := Default_Exp)
is
begin
Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
if OK_Float then
Aux_Float.Put (File, Float (Item), Fore, Aft, Exp);
elsif OK_Long_Float then
Aux_Long_Float.Put (File, Long_Float (Item), Fore, Aft, Exp);
else
Aux_Long_Long_Float.Put
(File, Long_Long_Float (Item), Fore, Aft, Exp);
end if;
end Put;
procedure Put
@ -113,7 +173,13 @@ package body Ada.Wide_Wide_Text_IO.Float_IO is
S : String (To'First .. To'Last);
begin
Aux.Puts (S, Long_Long_Float (Item), Aft, Exp);
if OK_Float then
Aux_Float.Puts (S, Float (Item), Aft, Exp);
elsif OK_Long_Float then
Aux_Long_Float.Puts (S, Long_Float (Item), Aft, Exp);
else
Aux_Long_Long_Float.Puts (S, Long_Long_Float (Item), Aft, Exp);
end if;
for J in S'Range loop
To (J) := Wide_Wide_Character'Val (Character'Pos (S (J)));

View file

@ -402,6 +402,106 @@ package body Ada.Wide_Wide_Text_IO.Generic_Aux is
end if;
end Load_Integer;
---------------
-- Load_Real --
---------------
procedure Load_Real
(File : File_Type;
Buf : out String;
Ptr : in out Natural)
is
Loaded : Boolean;
begin
-- Skip initial blanks and load possible sign
Load_Skip (File);
Load (File, Buf, Ptr, '+', '-');
-- Case of .nnnn
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Digits (File, Buf, Ptr, Loaded);
-- Hopeless junk if no digits loaded
if not Loaded then
return;
end if;
-- Otherwise must have digits to start
else
Load_Digits (File, Buf, Ptr, Loaded);
-- Hopeless junk if no digits loaded
if not Loaded then
return;
end if;
-- Deal with based case. We recognize either the standard '#' or the
-- allowed alternative replacement ':' (see RM J.2(3)).
Load (File, Buf, Ptr, '#', ':', Loaded);
if Loaded then
-- Case of nnn#.xxx#
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Extended_Digits (File, Buf, Ptr);
Load (File, Buf, Ptr, '#', ':');
-- Case of nnn#xxx.[xxx]# or nnn#xxx#
else
Load_Extended_Digits (File, Buf, Ptr);
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Extended_Digits (File, Buf, Ptr);
end if;
-- As usual, it seems strange to allow mixed base characters,
-- but that is what ACVC tests expect, see CE3804M, case (3).
Load (File, Buf, Ptr, '#', ':');
end if;
-- Case of nnn.[nnn] or nnn
else
-- Prevent the potential processing of '.' in cases where the
-- initial digits have a trailing underscore.
if Buf (Ptr) = '_' then
return;
end if;
Load (File, Buf, Ptr, '.', Loaded);
if Loaded then
Load_Digits (File, Buf, Ptr);
end if;
end if;
end if;
-- Deal with exponent
Load (File, Buf, Ptr, 'E', 'e', Loaded);
if Loaded then
Load (File, Buf, Ptr, '+', '-');
Load_Digits (File, Buf, Ptr);
end if;
end Load_Real;
---------------
-- Load_Skip --
---------------

View file

@ -155,6 +155,12 @@ package Ada.Wide_Wide_Text_IO.Generic_Aux is
Ptr : in out Natural);
-- Loads a possibly signed integer literal value
procedure Load_Real
(File : File_Type;
Buf : out String;
Ptr : in out Natural);
-- Loads a possibly signed real literal value
procedure Put_Item (File : File_Type; Str : String);
-- This routine is like Wide_Wide_Text_IO.Put, except that it checks for
-- overflow of bounded lines, as described in (RM A.10.6(8)). It is used

View file

@ -654,6 +654,8 @@ package body System.Fat_Gen is
if Adjustment > IEEE_Emax - Exp then
XX := 0.0;
return (if Minus then -1.0 / XX else 1.0 / XX);
pragma Annotate
(CodePeer, Intentional, "overflow check", "Infinity produced");
pragma Annotate
(CodePeer, Intentional, "divide by zero", "Infinity produced");

View file

@ -2,11 +2,11 @@
-- --
-- GNAT COMPILER COMPONENTS --
-- --
-- S Y S T E M . F A T _ S F L T --
-- S Y S T E M . V A L _ F L T --
-- --
-- S p e c --
-- --
-- Copyright (C) 1992-2020, Free Software Foundation, Inc. --
-- Copyright (C) 2020, Free Software Foundation, Inc. --
-- --
-- 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- --
@ -29,19 +29,24 @@
-- --
------------------------------------------------------------------------------
-- This package contains an instantiation of the floating-point attribute
-- runtime routines for the type Short_Float.
-- This package contains routines for scanning real values for floating point
-- type Float, for use in Text_IO.Float_IO and the Value attribute.
with System.Fat_Gen;
with Interfaces;
with System.Val_Real;
package System.Fat_SFlt is
pragma Pure;
package System.Val_Flt is
pragma Preelaborate;
-- Note the only entity from this package that is accessed by Rtsfind
-- is the name of the package instantiation. Entities within this package
-- (i.e. the individual floating-point attribute routines) are accessed
-- by name using selected notation.
package Impl is new Val_Real (Float, Interfaces.Unsigned_32);
package Attr_Short_Float is new System.Fat_Gen (Short_Float);
function Scan_Float
(Str : String;
Ptr : not null access Integer;
Max : Integer) return Float
renames Impl.Scan_Real;
end System.Fat_SFlt;
function Value_Float (Str : String) return Float
renames Impl.Value_Real;
end System.Val_Flt;

View file

@ -0,0 +1,52 @@
------------------------------------------------------------------------------
-- --
-- GNAT COMPILER COMPONENTS --
-- --
-- S Y S T E M . V A L _ L F L T --
-- --
-- S p e c --
-- --
-- Copyright (C) 2020, Free Software Foundation, Inc. --
-- --
-- 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- --
-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception, --
-- version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. --
-- --
------------------------------------------------------------------------------
-- This package contains routines for scanning real values for floating point
-- type Long_Float, for use in Text_IO.Float_IO and the Value attribute.
with Interfaces;
with System.Val_Real;
package System.Val_LFlt is
pragma Preelaborate;
package Impl is new Val_Real (Long_Float, Interfaces.Unsigned_64);
function Scan_Long_Float
(Str : String;
Ptr : not null access Integer;
Max : Integer) return Long_Float
renames Impl.Scan_Real;
function Value_Long_Float (Str : String) return Long_Float
renames Impl.Value_Real;
end System.Val_LFlt;

View file

@ -0,0 +1,52 @@
------------------------------------------------------------------------------
-- --
-- GNAT COMPILER COMPONENTS --
-- --
-- S Y S T E M . V A L _ L L F --
-- --
-- S p e c --
-- --
-- Copyright (C) 2020, Free Software Foundation, Inc. --
-- --
-- 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- --
-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception, --
-- version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. --
-- --
------------------------------------------------------------------------------
-- This package contains routines for scanning real values for floating point
-- type Long_Long_Float, for use in Text_IO.Float_IO and the Value attribute.
with Interfaces;
with System.Val_Real;
package System.Val_LLF is
pragma Preelaborate;
package Impl is new Val_Real (Long_Long_Float, Interfaces.Unsigned_64);
function Scan_Long_Long_Float
(Str : String;
Ptr : not null access Integer;
Max : Integer) return Long_Long_Float
renames Impl.Scan_Real;
function Value_Long_Long_Float (Str : String) return Long_Long_Float
renames Impl.Value_Real;
end System.Val_LLF;

View file

@ -36,14 +36,14 @@ with System.Value_R;
package body System.Val_Real is
package Impl is new Value_R (Long_Long_Unsigned, Floating => True);
package Impl is new Value_R (Uns, Floating => True);
function Integer_to_Real
(Str : String;
Val : Long_Long_Unsigned;
Val : Uns;
Base : Unsigned;
Scale : Integer;
Minus : Boolean) return Long_Long_Float;
Minus : Boolean) return Num;
-- Convert the real value from integer to real representation
---------------------
@ -52,26 +52,34 @@ package body System.Val_Real is
function Integer_to_Real
(Str : String;
Val : Long_Long_Unsigned;
Val : Uns;
Base : Unsigned;
Scale : Integer;
Minus : Boolean) return Long_Long_Float
Minus : Boolean) return Num
is
pragma Assert (Base in 2 .. 16);
pragma Unsuppress (Range_Check);
R_Val : Long_Long_Float;
R_Val : Num;
begin
-- We call the floating-point processor reset routine so we can be sure
-- that the processor is properly set for conversions. This is notably
-- that the x87 FPU is properly set for conversions. This is especially
-- needed on Windows, where calls to the operating system randomly reset
-- the processor into 64-bit mode.
System.Float_Control.Reset;
if Num'Machine_Mantissa = 64 then
System.Float_Control.Reset;
end if;
-- Compute the final value
-- Compute the final value with a single rounding if possible
R_Val := Long_Long_Float (Val) * Long_Long_Float (Base) ** Scale;
if Scale < 0 then
R_Val := Num (Val) / Num (Base) ** (-Scale);
else
R_Val := Num (Val) * Num (Base) ** Scale;
end if;
-- Finally deal with initial minus sign, note that this processing is
-- done even if Uval is zero, so that -0.0 is correctly interpreted.
@ -87,16 +95,16 @@ package body System.Val_Real is
---------------
function Scan_Real
(Str : String;
Ptr : not null access Integer;
Max : Integer)
return Long_Long_Float
(Str : String;
Ptr : not null access Integer;
Max : Integer) return Num
is
Base : Unsigned;
Scale : Integer;
Extra : Unsigned;
pragma Unreferenced (Extra);
Minus : Boolean;
Val : Long_Long_Unsigned;
Val : Uns;
begin
Val := Impl.Scan_Raw_Real (Str, Ptr, Max, Base, Scale, Extra, Minus);
@ -108,12 +116,13 @@ package body System.Val_Real is
-- Value_Real --
----------------
function Value_Real (Str : String) return Long_Long_Float is
function Value_Real (Str : String) return Num is
Base : Unsigned;
Scale : Integer;
Extra : Unsigned;
pragma Unreferenced (Extra);
Minus : Boolean;
Val : Long_Long_Unsigned;
Val : Uns;
begin
Val := Impl.Value_Raw_Real (Str, Base, Scale, Extra, Minus);

View file

@ -29,13 +29,22 @@
-- --
------------------------------------------------------------------------------
-- This package contains routines for scanning real values for use in
-- Text_IO.Float_IO and the Value attribute.
generic
type Num is digits <>;
type Uns is mod <>;
package System.Val_Real is
pragma Preelaborate;
function Scan_Real
(Str : String;
Ptr : not null access Integer;
Max : Integer) return Long_Long_Float;
Max : Integer) return Num;
-- This function scans the string starting at Str (Ptr.all) for a valid
-- real literal according to the syntax described in (RM 3.5(43)). The
-- substring scanned extends no further than Str (Max). There are three
@ -65,10 +74,10 @@ package System.Val_Real is
-- If this occurs Program_Error is raised with a message noting that this
-- case is not supported. Most such cases are eliminated by the caller.
function Value_Real (Str : String) return Long_Long_Float;
function Value_Real (Str : String) return Num;
-- Used in computing X'Value (Str) where X is a floating-point type or an
-- ordinary fixed-point type. Str is the string argument of the attribute.
-- Constraint_Error is raised if the string is malformed, or if the value
-- out of range of Long_Long_Float.
-- out of range of Num.
end System.Val_Real;

View file

@ -33,11 +33,7 @@ with System.Val_Util; use System.Val_Util;
package body System.Value_R is
F_Limit : constant Uns := 2 ** (Long_Long_Float'Machine_Mantissa - 1);
I_Limit : constant Uns := 2 ** (Uns'Size - 1);
-- Absolute value of largest representable signed integer
Precision_Limit : constant Uns := (if Floating then F_Limit else I_Limit);
Precision_Limit : constant Uns := 2 ** (Uns'Size - 1);
-- Limit beyond which additional digits are dropped
subtype Char_As_Digit is Unsigned range 0 .. 17;
@ -133,6 +129,8 @@ package body System.Value_R is
is
pragma Assert (Base in 2 .. 16);
pragma Assert (Index in Str'Range);
pragma Assert (Max <= Str'Last);
Umax : constant Uns := (Precision_Limit - Uns (Base) + 1) / Uns (Base);
-- Max value which cannot overflow on accumulating next digit
@ -144,8 +142,9 @@ package body System.Value_R is
-- Set to True if addition of a digit will cause Value to be superior
-- to Precision_Limit.
Precision_Limit_Just_Reached : Boolean := False;
Precision_Limit_Just_Reached : Boolean;
-- Set to True if Precision_Limit_Reached was just set to True
-- Only used when Floating = False.
Digit : Char_As_Digit;
-- The current digit
@ -166,6 +165,10 @@ package body System.Value_R is
Extra := 0;
end if;
if not Floating then
Precision_Limit_Just_Reached := False;
end if;
-- The function precondition is that the first character is a valid
-- digit.
@ -194,7 +197,7 @@ package body System.Value_R is
-- continue only to assess the validity of the string.
if Precision_Limit_Reached then
if Precision_Limit_Just_Reached and then not Floating then
if not Floating and then Precision_Limit_Just_Reached then
if Digit >= Base / 2 then
if Extra = Base - 1 then
Extra := 0;
@ -244,7 +247,10 @@ package body System.Value_R is
else
Extra := Digit;
Precision_Limit_Reached := True;
Precision_Limit_Just_Reached := True;
if not Floating then
Precision_Limit_Just_Reached := True;
end if;
end if;
end if;
end if;
@ -308,8 +314,9 @@ package body System.Value_R is
-- Set to True if addition of a digit will cause Value to be superior
-- to Precision_Limit.
Precision_Limit_Just_Reached : Boolean := False;
-- Set to True if Precision_Limit_Reached was just set to True
Precision_Limit_Just_Reached : Boolean;
-- Set to True if Precision_Limit_Reached was just set to True.
-- Only used when Floating = False.
Digit : Char_As_Digit;
-- The current digit
@ -324,6 +331,12 @@ package body System.Value_R is
Scale := 0;
Extra := 0;
if not Floating then
Precision_Limit_Just_Reached := False;
end if;
pragma Assert (Max <= Str'Last);
-- The function precondition is that the first character is a valid
-- digit.
@ -354,7 +367,7 @@ package body System.Value_R is
if Precision_Limit_Reached then
Scale := Scale + 1;
if Precision_Limit_Just_Reached and then not Floating then
if not Floating and then Precision_Limit_Just_Reached then
if Digit >= Base / 2 then
if Extra = Base - 1 then
Extra := 0;
@ -378,7 +391,11 @@ package body System.Value_R is
else
Extra := Digit;
Precision_Limit_Reached := True;
Precision_Limit_Just_Reached := True;
if not Floating then
Precision_Limit_Just_Reached := True;
end if;
Scale := Scale + 1;
end if;
end if;
@ -409,7 +426,6 @@ package body System.Value_R is
end if;
end if;
end loop;
end Scan_Integral_Digits;
-------------------
@ -425,6 +441,8 @@ package body System.Value_R is
Extra : out Unsigned;
Minus : out Boolean) return Uns
is
pragma Assert (Max <= Str'Last);
After_Point : Boolean;
-- True if a decimal should be parsed
@ -440,7 +458,7 @@ package body System.Value_R is
-- Local copy of string pointer
Start : Positive;
-- Position of starting non-blank character
pragma Unreferenced (Start);
Value : Uns;
-- Mantissa as an Integer
@ -461,14 +479,15 @@ package body System.Value_R is
Scan_Sign (Str, Ptr, Max, Minus, Start);
Index := Ptr.all;
Ptr.all := Start;
-- First character can be either a decimal digit or a dot
pragma Assert (Index >= Str'First);
pragma Annotate (CodePeer, Modified, Str (Index));
-- First character can be either a decimal digit or a dot and for some
-- reason CodePeer incorrectly thinks it is always a digit.
if Str (Index) in '0' .. '9' then
pragma Annotate
(CodePeer, False_Positive, "test always true", "defensive code");
After_Point := False;
-- If this is a digit it can indicates either the float decimal
@ -496,13 +515,16 @@ package body System.Value_R is
-- Check if the first number encountered is a base
pragma Assert (Index >= Str'First);
if Index < Max
and then (Str (Index) = '#' or else Str (Index) = ':')
then
Base_Char := Str (Index);
Base := Unsigned (Value);
if Base < 2 or else Base > 16 then
if Value in 2 .. 16 then
Base := Unsigned (Value);
else
Base_Violation := True;
Base := 16;
end if;
@ -533,6 +555,8 @@ package body System.Value_R is
-- Do we have a dot?
pragma Assert (Index >= Str'First);
if not After_Point and then Index <= Max and then Str (Index) = '.' then
-- At this stage if After_Point was not set, this means that an
@ -549,6 +573,8 @@ package body System.Value_R is
-- Scan the decimal part
if After_Point then
pragma Assert (Index <= Max);
Scan_Decimal_Digits
(Str, Index, Max, Value, Scale, Char_As_Digit (Extra),
Base_Violation, Base, Base_Specified => Base_Char /= ASCII.NUL);
@ -557,6 +583,8 @@ package body System.Value_R is
-- If an explicit base was specified ensure that the delimiter is found
if Base_Char /= ASCII.NUL then
pragma Assert (Index > Max or else Index in Str'Range);
if Index > Max or else Str (Index) /= Base_Char then
Bad_Value (Str);
else

View file

@ -239,8 +239,6 @@ package Rtsfind is
System_Exp_Mod,
System_Exp_Uns,
System_Fat_Flt,
System_Fat_IEEE_Long_Float,
System_Fat_IEEE_Short_Float,
System_Fat_LFlt,
System_Fat_LLF,
System_Fat_SFlt,
@ -434,13 +432,15 @@ package Rtsfind is
System_Val_Fixed_32,
System_Val_Fixed_64,
System_Val_Fixed_128,
System_Val_Flt,
System_Val_Int,
System_Val_LFlt,
System_Val_LLF,
System_Val_LLI,
System_Val_LLLI,
System_Val_LLU,
System_Val_LLLU,
System_Val_Name,
System_Val_Real,
System_Val_Uns,
System_Val_WChar,
System_Version_Control,
@ -925,18 +925,10 @@ package Rtsfind is
RE_Attr_Float, -- System.Fat_Flt
RE_Attr_IEEE_Long, -- System.Fat_IEEE_Long_Float
RE_Fat_IEEE_Long, -- System.Fat_IEEE_Long_Float
RE_Attr_IEEE_Short, -- System.Fat_IEEE_Short_Float
RE_Fat_IEEE_Short, -- System.Fat_IEEE_Short_Float
RE_Attr_Long_Float, -- System.Fat_LFlt
RE_Attr_Long_Long_Float, -- System.Fat_LLF
RE_Attr_Short_Float, -- System.Fat_SFlt
RE_Attr_VAX_D_Float, -- System.Fat_VAX_D_Float
RE_Fat_VAX_D, -- System.Fat_VAX_D_Float
@ -2045,8 +2037,14 @@ package Rtsfind is
RE_Value_Fixed128, -- System_Val_Fixed_128
RE_Value_Float, -- System_Val_Flt
RE_Value_Integer, -- System.Val_Int
RE_Value_Long_Float, -- System_Val_LFlt
RE_Value_Long_Long_Float, -- System_Val_LLF
RE_Value_Long_Long_Integer, -- System.Val_LLI
RE_Value_Long_Long_Long_Integer, -- System.Val_LLLI
@ -2055,8 +2053,6 @@ package Rtsfind is
RE_Value_Long_Long_Long_Unsigned, -- System.Val_LLLU
RE_Value_Real, -- System.Val_Real
RE_Value_Unsigned, -- System.Val_Uns
RE_Value_Wide_Character, -- System.Val_WChar
@ -2610,18 +2606,10 @@ package Rtsfind is
RE_Attr_Float => System_Fat_Flt,
RE_Attr_IEEE_Long => System_Fat_IEEE_Long_Float,
RE_Fat_IEEE_Long => System_Fat_IEEE_Long_Float,
RE_Attr_IEEE_Short => System_Fat_IEEE_Short_Float,
RE_Fat_IEEE_Short => System_Fat_IEEE_Short_Float,
RE_Attr_Long_Float => System_Fat_LFlt,
RE_Attr_Long_Long_Float => System_Fat_LLF,
RE_Attr_Short_Float => System_Fat_SFlt,
RE_Attr_VAX_D_Float => System_Fat_VAX_D_Float,
RE_Fat_VAX_D => System_Fat_VAX_D_Float,
@ -3730,8 +3718,14 @@ package Rtsfind is
RE_Value_Fixed128 => System_Val_Fixed_128,
RE_Value_Float => System_Val_Flt,
RE_Value_Integer => System_Val_Int,
RE_Value_Long_Float => System_Val_LFlt,
RE_Value_Long_Long_Float => System_Val_LLF,
RE_Value_Long_Long_Integer => System_Val_LLI,
RE_Value_Long_Long_Long_Integer => System_Val_LLLI,
@ -3740,8 +3734,6 @@ package Rtsfind is
RE_Value_Long_Long_Long_Unsigned => System_Val_LLLU,
RE_Value_Real => System_Val_Real,
RE_Value_Unsigned => System_Val_Uns,
RE_Value_Wide_Character => System_Val_WChar,