------------------------------------------------------------------------------
--                                                                          --
--                         GNAT RUN-TIME COMPONENTS                         --
--                                                                          --
--              A D A . C A L E N D A R . C O N V E R S I O N S             --
--                                                                          --
--                                 B o d y                                  --
--                                                                          --
--        Copyright (C) 2008-2021, 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.      --
--                                                                          --
------------------------------------------------------------------------------

with Interfaces.C;            use Interfaces.C;

package body Ada.Calendar.Conversions is

   -----------------
   -- To_Ada_Time --
   -----------------

   function To_Ada_Time (Unix_Time : long) return Time is
      Val : constant Long_Integer := Long_Integer (Unix_Time);
   begin
      return Conversion_Operations.To_Ada_Time (Val);
   end To_Ada_Time;

   -----------------
   -- To_Ada_Time --
   -----------------

   function To_Ada_Time
     (tm_year  : int;
      tm_mon   : int;
      tm_day   : int;
      tm_hour  : int;
      tm_min   : int;
      tm_sec   : int;
      tm_isdst : int) return Time
   is
      Year   : constant Integer := Integer (tm_year);
      Month  : constant Integer := Integer (tm_mon);
      Day    : constant Integer := Integer (tm_day);
      Hour   : constant Integer := Integer (tm_hour);
      Minute : constant Integer := Integer (tm_min);
      Second : constant Integer := Integer (tm_sec);
      DST    : constant Integer := Integer (tm_isdst);
   begin
      return
        Conversion_Operations.To_Ada_Time
          (Year, Month, Day, Hour, Minute, Second, DST);
   end To_Ada_Time;

   -----------------
   -- To_Duration --
   -----------------

   function To_Duration
     (tv_sec  : long;
      tv_nsec : long) return Duration
   is
      Secs      : constant Long_Integer := Long_Integer (tv_sec);
      Nano_Secs : constant Long_Integer := Long_Integer (tv_nsec);
   begin
      return Conversion_Operations.To_Duration (Secs, Nano_Secs);
   end To_Duration;

   ------------------------
   -- To_Struct_Timespec --
   ------------------------

   procedure To_Struct_Timespec
     (D       : Duration;
      tv_sec  : out long;
      tv_nsec : out long)
   is
      Secs      : Long_Integer;
      Nano_Secs : Long_Integer;

   begin
      Conversion_Operations.To_Struct_Timespec (D, Secs, Nano_Secs);

      tv_sec  := long (Secs);
      tv_nsec := long (Nano_Secs);
   end To_Struct_Timespec;

   ------------------
   -- To_Struct_Tm --
   ------------------

   procedure To_Struct_Tm
     (T       : Time;
      tm_year : out int;
      tm_mon  : out int;
      tm_day  : out int;
      tm_hour : out int;
      tm_min  : out int;
      tm_sec  : out int)
   is
      Year   : Integer;
      Month  : Integer;
      Day    : Integer;
      Hour   : Integer;
      Minute : Integer;
      Second : Integer;

   begin
      Conversion_Operations.To_Struct_Tm
        (T, Year, Month, Day, Hour, Minute, Second);

      tm_year := int (Year);
      tm_mon  := int (Month);
      tm_day  := int (Day);
      tm_hour := int (Hour);
      tm_min  := int (Minute);
      tm_sec  := int (Second);
   end To_Struct_Tm;

   ------------------
   -- To_Unix_Time --
   ------------------

   function To_Unix_Time (Ada_Time : Time) return long is
      Val : constant Long_Integer :=
              Conversion_Operations.To_Unix_Time (Ada_Time);
   begin
      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;
