OSDN Git Service

* haifa-sched.c (extend_global): Split to extend_global_data and
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-calend-vms.ads
index 07c9bcb..c11093d 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2005 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2008, Free Software Foundation, Inc.         --
 --                                                                          --
 -- This specification is derived from the Ada Reference Manual for use with --
 -- GNAT. The copyright notice above, and the license provisions that follow --
@@ -20,8 +20,8 @@
 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
 -- for  more details.  You should have  received  a copy of the GNU General --
 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
--- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
--- MA 02111-1307, USA.                                                      --
+-- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
+-- Boston, MA 02110-1301, USA.                                              --
 --                                                                          --
 -- As a special exception,  if other files  instantiate  generics from this --
 -- unit, or you link  this unit with other files  to produce an executable, --
 --                                                                          --
 ------------------------------------------------------------------------------
 
---  This is the Alpha/VMS version.
+--  This is the Alpha/VMS version
 
 with System.OS_Primitives;
+
 package Ada.Calendar is
 
    package OSP renames System.OS_Primitives;
 
    type Time is private;
 
-   --  Declarations representing limits of allowed local time values. Note that
-   --  these do NOT constrain the possible stored values of time which may well
-   --  permit a larger range of times (this is explicitly allowed in Ada 95).
+   --  Declarations representing limits of allowed local time values. Note
+   --  that these do NOT constrain the possible stored values of time which
+   --  may well permit a larger range of times (this is explicitly allowed
+   --  in Ada 95).
 
-   subtype Year_Number  is Integer range 1901 .. 2099;
+   subtype Year_Number  is Integer range 1901 .. 2399;
    subtype Month_Number is Integer range 1 .. 12;
    subtype Day_Number   is Integer range 1 .. 31;
 
@@ -72,8 +74,7 @@ package Ada.Calendar is
      (Year    : Year_Number;
       Month   : Month_Number;
       Day     : Day_Number;
-      Seconds : Day_Duration := 0.0)
-      return    Time;
+      Seconds : Day_Duration := 0.0) return Time;
 
    function "+" (Left : Time;     Right : Duration) return Time;
    function "+" (Left : Duration; Right : Time)     return Time;
@@ -88,7 +89,6 @@ package Ada.Calendar is
    Time_Error : exception;
 
 private
-
    pragma Inline (Clock);
 
    pragma Inline (Year);
@@ -103,19 +103,170 @@ private
    pragma Inline (">");
    pragma Inline (">=");
 
-   --  Time is represented as the number of 100-nanosecond (ns) units offset
-   --  from the system base date and time, which is 00:00 o'clock,
-   --  November 17, 1858 (the Smithsonian base date and time for the
-   --  astronomic calendar).
+   --  Although the units are 100 nanoseconds, for the purpose of better
+   --  readability, this unit will be called "mili".
+
+   Mili         : constant := 10_000_000;
+   Mili_F       : constant := 10_000_000.0;
+   Milis_In_Day : constant := 864_000_000_000;
+   Secs_In_Day  : constant := 86_400;
 
-   --  The time value stored is typically a GMT value, as provided in standard
+   --  Time is represented as the number of 100-nanosecond (ns) units from the
+   --  system base date and time 1858-11-17 0.0 (the Smithsonian base date and
+   --  time for the astronomic calendar).
+
+   --  The time value stored is typically a UTC value, as provided in standard
    --  Unix environments. If this is the case then Split and Time_Of perform
    --  required conversions to and from local times.
 
-   type Time is new OSP.OS_Time;
-
    --  Notwithstanding this definition, Time is not quite the same as OS_Time.
    --  Relative Time is positive, whereas relative OS_Time is negative,
    --  but this declaration makes for easier conversion.
 
+   type Time is new OSP.OS_Time;
+
+   Days_In_Month : constant array (Month_Number) of Day_Number :=
+                     (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
+
+   Invalid_Time_Zone_Offset : Long_Integer;
+   pragma Import (C, Invalid_Time_Zone_Offset, "__gnat_invalid_tzoff");
+
+   function Is_Leap (Year : Year_Number) return Boolean;
+   --  Determine whether a given year is leap
+
+   --  The following packages provide a target independent interface to the
+   --  children of Calendar - Arithmetic, Formatting and Time_Zones.
+
+   --  NOTE: Delays does not need a target independent interface because
+   --  VMS already has a target specific file for that package.
+
+   ---------------------------
+   -- Arithmetic_Operations --
+   ---------------------------
+
+   package Arithmetic_Operations is
+
+      function Add (Date : Time; Days : Long_Integer) return Time;
+      --  Add a certain number of days to a time value
+
+      procedure Difference
+        (Left         : Time;
+         Right        : Time;
+         Days         : out Long_Integer;
+         Seconds      : out Duration;
+         Leap_Seconds : out Integer);
+      --  Calculate the difference between two time values in terms of days,
+      --  seconds and leap seconds elapsed. The leap seconds are not included
+      --  in the seconds returned. If Left is greater than Right, the returned
+      --  values are positive, negative otherwise.
+
+      function Subtract (Date : Time; Days : Long_Integer) return Time;
+      --  Subtract a certain number of days from a time value
+
+   end Arithmetic_Operations;
+
+   ---------------------------
+   -- Conversion_Operations --
+   ---------------------------
+
+   package Conversion_Operations is
+      function To_Ada_Time (Unix_Time : Long_Integer) return Time;
+      --  Unix to Ada Epoch conversion
+
+      function To_Ada_Time
+        (tm_year  : Integer;
+         tm_mon   : Integer;
+         tm_day   : Integer;
+         tm_hour  : Integer;
+         tm_min   : Integer;
+         tm_sec   : Integer;
+         tm_isdst : Integer) return Time;
+      --  Struct tm to Ada Epoch conversion
+
+      function To_Duration
+        (tv_sec  : Long_Integer;
+         tv_nsec : Long_Integer) return Duration;
+      --  Struct timespec to Duration conversion
+
+      procedure To_Struct_Timespec
+        (D       : Duration;
+         tv_sec  : out Long_Integer;
+         tv_nsec : out Long_Integer);
+      --  Duration to struct timespec conversion
+
+      procedure To_Struct_Tm
+        (T       : Time;
+         tm_year : out Integer;
+         tm_mon  : out Integer;
+         tm_day  : out Integer;
+         tm_hour : out Integer;
+         tm_min  : out Integer;
+         tm_sec  : out Integer);
+      --  Time to struct tm conversion
+
+      function To_Unix_Time (Ada_Time : Time) return Long_Integer;
+      --  Ada to Unix Epoch conversion
+
+   end Conversion_Operations;
+
+   ---------------------------
+   -- Formatting_Operations --
+   ---------------------------
+
+   package Formatting_Operations is
+
+      function Day_Of_Week (Date : Time) return Integer;
+      --  Determine which day of week Date falls on. The returned values are
+      --  within the range of 0 .. 6 (Monday .. Sunday).
+
+      procedure Split
+        (Date      : Time;
+         Year      : out Year_Number;
+         Month     : out Month_Number;
+         Day       : out Day_Number;
+         Day_Secs  : out Day_Duration;
+         Hour      : out Integer;
+         Minute    : out Integer;
+         Second    : out Integer;
+         Sub_Sec   : out Duration;
+         Leap_Sec  : out Boolean;
+         Is_Ada_05 : Boolean;
+         Time_Zone : Long_Integer);
+      --  Split a time value into its components. Set Is_Ada_05 to use the
+      --  local time zone (the value in Time_Zone is ignored) when splitting
+      --  a time value.
+
+      function Time_Of
+        (Year         : Year_Number;
+         Month        : Month_Number;
+         Day          : Day_Number;
+         Day_Secs     : Day_Duration;
+         Hour         : Integer;
+         Minute       : Integer;
+         Second       : Integer;
+         Sub_Sec      : Duration;
+         Leap_Sec     : Boolean := False;
+         Use_Day_Secs : Boolean := False;
+         Is_Ada_05    : Boolean := False;
+         Time_Zone    : Long_Integer := 0) return Time;
+      --  Given all the components of a date, return the corresponding time
+      --  value. Set Use_Day_Secs to use the value in Day_Secs, otherwise the
+      --  day duration will be calculated from Hour, Minute, Second and Sub_
+      --  Sec. Set Is_Ada_05 to use the local time zone (the value in formal
+      --  Time_Zone is ignored) when building a time value and to verify the
+      --  validity of a requested leap second.
+
+   end Formatting_Operations;
+
+   ---------------------------
+   -- Time_Zones_Operations --
+   ---------------------------
+
+   package Time_Zones_Operations is
+
+      function UTC_Time_Offset (Date : Time) return Long_Integer;
+      --  Return the offset in seconds from UTC
+
+   end Time_Zones_Operations;
+
 end Ada.Calendar;