[Ada] New function to return nanoseconds from Unix Epoch
authorDoug Rupp <rupp@adacore.com>
Tue, 29 May 2018 09:38:17 +0000 (09:38 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 29 May 2018 09:38:17 +0000 (09:38 +0000)
2018-05-29  Doug Rupp  <rupp@adacore.com>

gcc/ada/

* libgnat/a-calend.adb (Epoch_Offset): Move from body to ...
* libgnat/a-calend.ads (Epoch_Offset): to private part of spec
* libgnat/a-calcon.ads (To_Unix_Nano_Time): New function spec.
* libgnat/a-calcon.adb (To_Unix_Nano_Time): New function body.

From-SVN: r260870

gcc/ada/ChangeLog
gcc/ada/libgnat/a-calcon.adb
gcc/ada/libgnat/a-calcon.ads
gcc/ada/libgnat/a-calend.adb
gcc/ada/libgnat/a-calend.ads

index 21d1324aea30c93d595e727a12c0f9fb76f3c459..d5cd8715ea77868af3ff85a7831506acf66d6feb 100644 (file)
@@ -1,3 +1,10 @@
+2018-05-29  Doug Rupp  <rupp@adacore.com>
+
+       * libgnat/a-calend.adb (Epoch_Offset): Move from body to ...
+       * libgnat/a-calend.ads (Epoch_Offset): to private part of spec
+       * libgnat/a-calcon.ads (To_Unix_Nano_Time): New function spec.
+       * libgnat/a-calcon.adb (To_Unix_Nano_Time): New function body.
+
 2018-05-29  Eric Botcazou  <ebotcazou@adacore.com>
 
        * repinfo.ads (JSON format): Document new pair for components.
index 82ed24d485ed5102ecde69b4702a07eb1374b494..1c8e8cc7eeeedb30d74b50979180aafc8ca19bbd 100644 (file)
@@ -30,6 +30,7 @@
 ------------------------------------------------------------------------------
 
 with Interfaces.C; use Interfaces.C;
+with Interfaces.C.Extensions; use Interfaces.C.Extensions;
 
 package body Ada.Calendar.Conversions is
 
@@ -145,4 +146,18 @@ package body Ada.Calendar.Conversions is
       return long (Val);
    end To_Unix_Time;
 
+   -----------------------
+   -- To_Unix_Nano_Time --
+   -----------------------
+
+   function To_Unix_Nano_Time (Ada_Time : Time) return long_long is
+      pragma Unsuppress (Overflow_Check);
+      Ada_Rep : constant Time_Rep := Time_Rep (Ada_Time);
+   begin
+      return long_long (Ada_Rep + Epoch_Offset);
+   exception
+      when Constraint_Error =>
+         raise Time_Error;
+   end To_Unix_Nano_Time;
+
 end Ada.Calendar.Conversions;
index c7b16c59929d779d6a8162683223c7e46d802f75..e2b3ad3b4dc199fc6d78e5f7772c2b7ac5331941 100644 (file)
@@ -33,6 +33,7 @@
 --  time models - Time, Duration, struct tm and struct timespec.
 
 with Interfaces.C;
+with Interfaces.C.Extensions;
 
 package Ada.Calendar.Conversions is
 
@@ -110,4 +111,11 @@ package Ada.Calendar.Conversions is
    --  units of the result are seconds. Raises Time_Error if the result cannot
    --  fit into a Time value.
 
+   function To_Unix_Nano_Time (Ada_Time : Time) return
+      Interfaces.C.Extensions.long_long;
+   --  Convert a time value represented as number of time units since the Ada
+   --  implementation-defined Epoch to a value relative to the Unix Epoch. The
+   --  units of the result are nanoseconds. Raises Time_Error if the result
+   --  cannot fit into a Time value.
+
 end Ada.Calendar.Conversions;
index 89f64c3fcb9156f969387512d653590b29bfc954..8299b74bc98f893d843e7553607ea55e84dc4600 100644 (file)
@@ -203,10 +203,6 @@ is
      Ada_Low + Time_Rep (34 * 366 + 102 * 365) * Nanos_In_Day +
      Time_Rep (Leap_Seconds_Count) * Nano;
 
-   Epoch_Offset : constant Time_Rep := (136 * 365 + 44 * 366) * Nanos_In_Day;
-   --  The difference between 2150-1-1 UTC and 1970-1-1 UTC expressed in
-   --  nanoseconds. Note that year 2100 is non-leap.
-
    Cumulative_Days_Before_Month :
      constant array (Month_Number) of Natural :=
        (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334);
index 69b65637618e92ab31de9d50d820a2ff667dabb7..4371e110a1ec3d94e7e14d344140f0da0f2aa8e8 100644 (file)
@@ -221,6 +221,10 @@ private
    --  with overloading ambiguities in the body if we tried to use Time as an
    --  internal computational type.
 
+   Epoch_Offset : constant Time_Rep := (136 * 365 + 44 * 366) * Nanos_In_Day;
+   --  The difference between 2150-1-1 UTC and 1970-1-1 UTC expressed in
+   --  nanoseconds. Note that year 2100 is non-leap.
+
    Days_In_Month : constant array (Month_Number) of Day_Number :=
                      (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    --  Days in month for non-leap year, leap year case is adjusted in code