Commit 309ff6fb by Arnaud Charlet Committed by Pierre-Marie de Rodat

[Ada] Fix support for > 24 hours image in Ada.Calendar.Formatting

2019-12-13  Arnaud Charlet  <charlet@adacore.com>

gcc/ada/

	* libgnat/a-calfor.ads, libgnat/a-calfor.adb (Split_Duration):
	New procedure.
	(Split, Image): Use Split_Duration. Update Image spec.

From-SVN: r279362
parent 3af796b5
2019-12-13 Arnaud Charlet <charlet@adacore.com>
* libgnat/a-calfor.ads, libgnat/a-calfor.adb (Split_Duration):
New procedure.
(Split, Image): Use Split_Duration. Update Image spec.
2019-12-13 Javier Miranda <miranda@adacore.com> 2019-12-13 Javier Miranda <miranda@adacore.com>
* exp_unst.adb (Unnest_Subprogram): Generate an extra temporary * exp_unst.adb (Unnest_Subprogram): Generate an extra temporary
......
...@@ -52,6 +52,15 @@ package body Ada.Calendar.Formatting is ...@@ -52,6 +52,15 @@ package body Ada.Calendar.Formatting is
-- such as 1983-*1-j3 u5:n7:k9 which should be 1983-01-03 05:07:09. Raise -- such as 1983-*1-j3 u5:n7:k9 which should be 1983-01-03 05:07:09. Raise
-- Constraint_Error if there is a mismatch. -- Constraint_Error if there is a mismatch.
procedure Split_Duration
(Seconds : Duration;
Hour : out Natural;
Minute : out Minute_Number;
Second : out Second_Number;
Sub_Second : out Second_Duration);
-- Version of Split that allows durations < 100 hours.
-- Will raise Time_Error if Seconds >= 100 hours.
---------------- ----------------
-- Check_Char -- -- Check_Char --
---------------- ----------------
...@@ -140,7 +149,7 @@ package body Ada.Calendar.Formatting is ...@@ -140,7 +149,7 @@ package body Ada.Calendar.Formatting is
Include_Time_Fraction : Boolean := False) return String Include_Time_Fraction : Boolean := False) return String
is is
To_Char : constant array (0 .. 9) of Character := "0123456789"; To_Char : constant array (0 .. 9) of Character := "0123456789";
Hour : Hour_Number; Hour : Natural;
Minute : Minute_Number; Minute : Minute_Number;
Second : Second_Number; Second : Second_Number;
Sub_Second : Duration; Sub_Second : Duration;
...@@ -155,7 +164,7 @@ package body Ada.Calendar.Formatting is ...@@ -155,7 +164,7 @@ package body Ada.Calendar.Formatting is
Result : String := "-00:00:00.00"; Result : String := "-00:00:00.00";
begin begin
Split (abs (Elapsed_Time), Hour, Minute, Second, Sub_Second); Split_Duration (abs Elapsed_Time, Hour, Minute, Second, Sub_Second);
-- Hour processing, positions 2 and 3 -- Hour processing, positions 2 and 3
...@@ -361,6 +370,34 @@ package body Ada.Calendar.Formatting is ...@@ -361,6 +370,34 @@ package body Ada.Calendar.Formatting is
Sub_Second; Sub_Second;
end Seconds_Of; end Seconds_Of;
--------------------
-- Split_Duration --
--------------------
procedure Split_Duration
(Seconds : Duration;
Hour : out Natural;
Minute : out Minute_Number;
Second : out Second_Number;
Sub_Second : out Second_Duration)
is
Secs : Natural;
begin
-- Check that Seconds is below 100 hours
if Seconds >= 3600.0 * 100.0 then
raise Time_Error;
end if;
Secs := (if Seconds = 0.0 then 0 else Natural (Seconds - 0.5));
Sub_Second := Second_Duration (Seconds - Duration (Secs));
Hour := Natural (Secs / 3_600);
Secs := Secs mod 3_600;
Minute := Minute_Number (Secs / 60);
Second := Second_Number (Secs mod 60);
end Split_Duration;
----------- -----------
-- Split -- -- Split --
----------- -----------
...@@ -372,8 +409,7 @@ package body Ada.Calendar.Formatting is ...@@ -372,8 +409,7 @@ package body Ada.Calendar.Formatting is
Second : out Second_Number; Second : out Second_Number;
Sub_Second : out Second_Duration) Sub_Second : out Second_Duration)
is is
Secs : Natural; Unchecked_Hour : Natural;
begin begin
-- Validity checks -- Validity checks
...@@ -381,23 +417,13 @@ package body Ada.Calendar.Formatting is ...@@ -381,23 +417,13 @@ package body Ada.Calendar.Formatting is
raise Constraint_Error; raise Constraint_Error;
end if; end if;
Secs := (if Seconds = 0.0 then 0 else Natural (Seconds - 0.5)); Split_Duration (Seconds, Unchecked_Hour, Minute, Second, Sub_Second);
Sub_Second := Second_Duration (Seconds - Day_Duration (Secs));
Hour := Hour_Number (Secs / 3_600);
Secs := Secs mod 3_600;
Minute := Minute_Number (Secs / 60);
Second := Second_Number (Secs mod 60);
-- Validity checks
if not Hour'Valid if Unchecked_Hour > Hour_Number'Last then
or else not Minute'Valid
or else not Second'Valid
or else not Sub_Second'Valid
then
raise Time_Error; raise Time_Error;
end if; end if;
Hour := Unchecked_Hour;
end Split; end Split;
----------- -----------
......
...@@ -204,7 +204,7 @@ package Ada.Calendar.Formatting is ...@@ -204,7 +204,7 @@ package Ada.Calendar.Formatting is
-- to the string as a point followed by a 2-digit value. If Elapsed_Time < -- to the string as a point followed by a 2-digit value. If Elapsed_Time <
-- 0.0, the result is Image (abs Elapsed_Time, Include_Time_Fraction) -- 0.0, the result is Image (abs Elapsed_Time, Include_Time_Fraction)
-- prefixed with a minus sign. If abs Elapsed_Time represents 100 hours or -- prefixed with a minus sign. If abs Elapsed_Time represents 100 hours or
-- more, the result is implementation-defined. -- more, Time_Error is raised.
function Value (Elapsed_Time : String) return Duration; function Value (Elapsed_Time : String) return Duration;
-- Returns a Duration value for the image given as Elapsed_Time. -- Returns a Duration value for the image given as Elapsed_Time.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment