/** @file
    The header <time.h> defines two macros, and declares several types and
    functions for manipulating time.  Many functions deal with a calendar time
    that represents the current date (according to the Gregorian calendar) and
    time.  Some functions deal with local time, which is the calendar time
    expressed for some specific time zone, and with Daylight Saving Time, which
    is a temporary change in the algorithm for determining local time.  The local
    time zone and Daylight Saving Time are implementation-defined.

    The macros defined are NULL; and CLOCKS_PER_SEC which expands to an
    expression with type clock_t (described below) that is the number per second
    of the value returned by the clock function.

    The types declared are size_t along with clock_t and time_t which are
    arithmetic types capable of representing times; and struct tm which holds
    the components of a calendar time, called the broken-down time.

    The range and precision of times representable in clock_t and time_t are
    implementation-defined. The tm structure shall contain at least the following
    members, in any order.  The semantics of the members and their normal ranges
    are expressed in the comments.
      - int tm_sec;   // seconds after the minute - [0, 60]
      - int tm_min;   // minutes after the hour - [0, 59]
      - int tm_hour;  // hours since midnight - [0, 23]
      - int tm_mday;  // day of the month - [1, 31]
      - int tm_mon;   // months since January - [0, 11]
      - int tm_year;  // years since 1900
      - int tm_wday;  // days since Sunday - [0, 6]
      - int tm_yday;  // days since January 1 - [0, 365]
      - int tm_isdst; // Daylight Saving Time flag

    The value of tm_isdst is positive if Daylight Saving Time is in effect, zero
    if Daylight Saving Time is not in effect, and negative if the information
    is not available.

    The following macros are defined in this file:<BR>
    @verbatim
      NULL
      CLOCKS_PER_SEC    The number of values per second returned by the clock function.
    @endverbatim

    The following types are defined in this file:<BR>
    @verbatim
      size_t      Unsigned integer type of the result of the sizeof operator.
      clock_t     Arithmetic type capable of representing a time from the clock function.
      time_t      Arithmetic type capable of representing a time.
      struct tm   Holds the components of a calendar time; or broken-down time.
    @endverbatim

    The following functions are declared in this file:<BR>
    @verbatim
      ###############  Time Manipulation Functions
      clock_t       clock     (void);
      double        difftime  (time_t time1, time_t time0);
      time_t        mktime    (struct tm *timeptr);
      time_t        time      (time_t *timer);

      #################  Time Conversion Functions
      char        * asctime   (const struct tm *timeptr);
      char        * ctime     (const time_t *timer);
      struct tm   * gmtime    (const time_t *timer);
      time_t        timegm    (struct tm*);
      struct tm   * localtime (const time_t *timer);
      size_t        strftime  (char * __restrict s, size_t maxsize,
                               const char * __restrict format,
                               const struct tm * __restrict timeptr);
      char        * strptime  (const char *, const char * format, struct tm*);
    @endverbatim

    Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
    This program and the accompanying materials are licensed and made available under
    the terms and conditions of the BSD License that accompanies this distribution.
    The full text of the license may be found at
    http://opensource.org/licenses/bsd-license.

    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _TIME_H
#define _TIME_H
#include <sys/EfiCdefs.h>

#define CLOCKS_PER_SEC  __getCPS()

#ifdef _EFI_SIZE_T_
  typedef _EFI_SIZE_T_  size_t;
  #undef _EFI_SIZE_T_
  #undef _BSD_SIZE_T_
#endif

#ifdef _EFI_CLOCK_T
  /** An arithmetic type capable of representing values returned by clock(); **/
  typedef _EFI_CLOCK_T  clock_t;
  #undef _EFI_CLOCK_T
#endif

#ifdef _EFI_TIME_T
  /** An arithmetic type capable of representing values returned as calendar time
      values, such as that returned by mktime();
  **/
  typedef _EFI_TIME_T  time_t;
  #undef _EFI_TIME_T
#endif

/** Value added to tm_year to get the full year value.  TM_YEAR_BASE + 110 --> 2010 **/
#define TM_YEAR_BASE  1900

/** @{
    Values for the tm_wday member of struct tm.
**/
#define TM_SUNDAY     0
#define TM_MONDAY     1
#define TM_TUESDAY    2
#define TM_WEDNESDAY  3
#define TM_THURSDAY   4
#define TM_FRIDAY     5
#define TM_SATURDAY   6
/*@}*/

/** @{
    Values for the tm_mon member of struct tm.
**/
#define TM_JANUARY     0
#define TM_FEBRUARY    1
#define TM_MARCH       2
#define TM_APRIL       3
#define TM_MAY         4
#define TM_JUNE        5
#define TM_JULY        6
#define TM_AUGUST      7
#define TM_SEPTEMBER   8
#define TM_OCTOBER     9
#define TM_NOVEMBER   10
#define TM_DECEMBER   11
/*@}*/

/** A structure holding the components of a calendar time, called the
    broken-down time.  The first nine (9) members are as mandated by the
    C95 standard.  Additional fields have been added for EFI support.
**/
struct tm {
  int     tm_year;      // years since 1900
  int     tm_mon;       // months since January  [0, 11]
  int     tm_mday;      // day of the month  [1, 31]
  int     tm_hour;      // hours since midnight  [0, 23]
  int     tm_min;       // minutes after the hour  [0, 59]
  int     tm_sec;       // seconds after the minute  [0, 60]
  int     tm_wday;      // days since Sunday  [0, 6]
  int     tm_yday;      // days since January 1  [0, 365]
  int     tm_isdst;     // Daylight Saving Time flag
  int     tm_zoneoff;   // EFI TimeZone offset, -1440 to 1440 or 2047
  int     tm_daylight;  // EFI Daylight flags
  UINT32  tm_Nano;      // EFI Nanosecond value
};

/* ###############  Time Manipulation Functions  ########################## */

/** The clock function determines the processor time used.

    @return   The clock function returns the implementation's best
              approximation to the processor time used by the program since the
              beginning of an implementation-defined era related only to the
              program invocation.  To determine the time in seconds, the value
              returned by the clock function should be divided by the value of
              the macro CLOCKS_PER_SEC.  If the processor time used is not
              available or its value cannot be represented, the function
              returns the value (clock_t)(-1).
**/
clock_t  clock(void);

/** Compute the difference between two calendar times: time1 - time0.

    @param[in]  time1   An arithmetic calendar time.
    @param[in]  time2   Another arithmetic calendar time.

    @return   The difference between the two times expressed in seconds.
**/
double difftime(time_t time1, time_t time0);

/** Convert a broken-down time into an arithmetic calendar time.

    The mktime function converts the broken-down time, expressed as local time,
    in the structure pointed to by timeptr into a calendar time value with the
    same encoding as that of the values returned by the time function. The
    original values of the tm_wday and tm_yday components of the structure are
    ignored, and the original values of the other components are not
    restricted to the ranges indicated above. On successful completion,
    the values of the tm_wday and tm_yday components of the structure are set
    appropriately, and the other components are set to represent the specified
    calendar time, but with their values forced to the ranges indicated above;
    the final value of tm_mday is not set until tm_mon and tm_year
    are determined.

    @param[in]  timeptr   Pointer to a broken-down time to be converted.

    @return   The mktime function returns the specified calendar time encoded
              as a value of type time_t. If the calendar time cannot be
              represented, the function returns the value (time_t)(-1).
**/
time_t mktime(struct tm *timeptr);

/** The time function determines the current calendar time.

    The encoding of the value is unspecified and undocumented.

    @param[out]   timer   An optional pointer to an object in which to
                          store the calendar time.

    @return   The time function returns the implementation's best approximation
              of the current calendar time. The value (time_t)(-1) is returned
              if the calendar time is not available. If timer is not a null
              pointer, the return value is also assigned to the object it
              points to.
**/
time_t time(time_t *timer);

/* #################  Time Conversion Functions  ########################## */

/** The asctime function converts the broken-down time in the structure pointed
    to by timeptr into a string in the form<BR>
    @verbatim
          Sun Sep 16 01:03:52 1973\n\0
    @endverbatim

    @param[in]  timeptr   A pointer to a broken-down time to convert.

    @return   The asctime function returns a pointer to the string.
**/
char * asctime(const struct tm *timeptr);

/** The ctime function converts the calendar time pointed to by timer to a local
    time in the form of a string. It is equivalent to asctime(localtime(timer))

    @param[in]  timer   Pointer to a calendar time value to convert into a
                        string representation.

    @return   The ctime function returns the pointer returned by the asctime
              function with that broken-down time as argument.
**/
char * ctime(const time_t *timer);

/** The gmtime function converts the calendar time pointed to by timer into a
    broken-down time, expressed as UTC.

    @param[in]  timer   Pointer to a calendar time value to convert into a
                        broken-down time.

    @return   The gmtime function returns a pointer to the broken-down time,
              or a null pointer if the specified time cannot be converted to UTC.
**/
struct tm  * gmtime(const time_t *timer);

/** The timegm function is the opposite of gmtime.

    @param[in]  tm    Pointer to a broken-down time to convert into a
                      calendar time.

    @return   The calendar time expressed as UTC.
**/
time_t timegm(struct tm*);

/** The localtime function converts the calendar time pointed to by timer into
    a broken-down time, expressed as local time.

    @param[in]  timer   Pointer to a calendar time value to be converted.

    @return   The localtime function returns a pointer to the broken-down time,
              or a null pointer if the specified time cannot be converted to
              local time.
**/
struct tm  * localtime(const time_t *timer);

/** The strftime function places characters into the array pointed to by s as
    controlled by the string pointed to by format. The format shall be a
    multibyte character sequence, beginning and ending in its initial shift
    state. The format string consists of zero or more conversion specifiers
    and ordinary multibyte characters. A conversion specifier consists of
    a % character, possibly followed by an E or O modifier character
    (described below), followed by a character that determines the behavior of
    the conversion specifier.

    All ordinary multibyte characters (including the terminating null
    character) are copied unchanged into the array. If copying takes place
    between objects that overlap, the behavior is undefined. No more than
    maxsize characters are placed into the array. 3 Each conversion specifier
    is replaced by appropriate characters as described in the following list.
    The appropriate characters are determined using the LC_TIME category of
    the current locale and by the values of zero or more members of the
    broken-down time structure pointed to by timeptr, as specified in brackets
    in the description. If any of the specified values is outside the normal
    range, the characters stored are unspecified.

    %a is replaced by the locale's abbreviated weekday name. [tm_wday]
    %A is replaced by the locale's full weekday name. [tm_wday]
    %b is replaced by the locale's abbreviated month name. [tm_mon]
    %B is replaced by the locale's full month name. [tm_mon]
    %c is replaced by the locale's appropriate date and time representation.
    %C is replaced by the year divided by 100 and truncated to an integer,
       as a decimal number (00-99). [tm_year]
    %d is replaced by the day of the month as a decimal number (01-31). [tm_mday]
    %D is equivalent to "%m/%d/%y". [tm_mon, tm_mday, tm_year]
    %e is replaced by the day of the month as a decimal number (1-31);
       a single digit is preceded by a space. [tm_mday]
    %F is equivalent to "%Y-%m-%d" (the ISO 8601 date format).
       [tm_year, tm_mon, tm_mday]
    %g is replaced by the last 2 digits of the week-based year (see below) as
       a decimal number (00-99). [tm_year, tm_wday, tm_yday]
    %G is replaced by the week-based year (see below) as a decimal number
       (e.g., 1997). [tm_year, tm_wday, tm_yday]
    %h is equivalent to "%b". [tm_mon]
    %H is replaced by the hour (24-hour clock) as a decimal number (00-23). [tm_hour]
    %I is replaced by the hour (12-hour clock) as a decimal number (01-12). [tm_hour]
    %j is replaced by the day of the year as a decimal number (001-366). [tm_yday]
    %m is replaced by the month as a decimal number (01-12). [tm_mon]
    %M is replaced by the minute as a decimal number (00-59). [tm_min]
    %n is replaced by a new-line character.
    %p is replaced by the locale's equivalent of the AM/PM designations
       associated with a 12-hour clock. [tm_hour]
    %r is replaced by the locale's 12-hour clock time. [tm_hour, tm_min, tm_sec]
    %R is equivalent to "%H:%M". [tm_hour, tm_min]
    %S is replaced by the second as a decimal number (00-60). [tm_sec]
    %t is replaced by a horizontal-tab character.
    %T is equivalent to "%H:%M:%S" (the ISO 8601 time format).
       [tm_hour, tm_min, tm_sec]
    %u is replaced by the ISO 8601 weekday as a decimal number (1-7),
       where Monday is 1. [tm_wday]
    %U is replaced by the week number of the year (the first Sunday as the
       first day of week 1) as a decimal number (00-53). [tm_year, tm_wday, tm_yday]
    %V is replaced by the ISO 8601 week number (see below) as a decimal number
       (01-53). [tm_year, tm_wday, tm_yday]
    %w is replaced by the weekday as a decimal number (0-6), where Sunday is 0.
       [tm_wday]
    %W is replaced by the week number of the year (the first Monday as the
       first day of week 1) as a decimal number (00-53). [tm_year, tm_wday, tm_yday]
    %x is replaced by the locale's appropriate date representation.
    %X is replaced by the locale's appropriate time representation.
    %y is replaced by the last 2 digits of the year as a decimal
       number (00-99). [tm_year]
    %Y is replaced by the year as a decimal number (e.g., 1997). [tm_year]
    %z is replaced by the offset from UTC in the ISO 8601 format "-0430"
       (meaning 4 hours 30 minutes behind UTC, west of Greenwich), or by no
       characters if no time zone is determinable. [tm_isdst]
    %Z is replaced by the locale's time zone name or abbreviation, or by no
       characters if no time zone is determinable. [tm_isdst]
    %% is replaced by %.

    Some conversion specifiers can be modified by the inclusion of an E or O
    modifier character to indicate an alternative format or specification.
    If the alternative format or specification does not exist for the current
    locale, the modifier is ignored. %Ec is replaced by the locale's
    alternative date and time representation.

    %EC is replaced by the name of the base year (period) in the locale's
        alternative representation.
    %Ex is replaced by the locale's alternative date representation.
    %EX is replaced by the locale's alternative time representation.
    %Ey is replaced by the offset from %EC (year only) in the locale's
        alternative representation.
    %EY is replaced by the locale's full alternative year representation.
    %Od is replaced by the day of the month, using the locale's alternative
        numeric symbols (filled as needed with leading zeros, or with leading
        spaces if there is no alternative symbol for zero).
    %Oe is replaced by the day of the month, using the locale's alternative
        numeric symbols (filled as needed with leading spaces).
    %OH is replaced by the hour (24-hour clock), using the locale's
        alternative numeric symbols.
    %OI is replaced by the hour (12-hour clock), using the locale's
        alternative numeric symbols.
    %Om is replaced by the month, using the locale's alternative numeric symbols.
    %OM is replaced by the minutes, using the locale's alternative numeric symbols.
    %OS is replaced by the seconds, using the locale's alternative numeric symbols.
    %Ou is replaced by the ISO 8601 weekday as a number in the locale's
        alternative representation, where Monday is 1.
    %OU is replaced by the week number, using the locale's alternative numeric symbols.
    %OV is replaced by the ISO 8601 week number, using the locale's alternative
        numeric symbols.
    %Ow is replaced by the weekday as a number, using the locale's alternative
        numeric symbols.
    %OW is replaced by the week number of the year, using the locale's
        alternative numeric symbols.
    %Oy is replaced by the last 2 digits of the year, using the locale's
        alternative numeric symbols.

    %g, %G, and %V give values according to the ISO 8601 week-based year. In
    this system, weeks begin on a Monday and week 1 of the year is the week
    that includes January 4th, which is also the week that includes the first
    Thursday of the year, and is also the first week that contains at least
    four days in the year. If the first Monday of January is the 2nd, 3rd, or
    4th, the preceding days are part of the last week of the preceding year;
    thus, for Saturday 2nd January 1999, %G is replaced by 1998 and %V is
    replaced by 53. If December 29th, 30th, or 31st is a Monday, it and any
    following days are part of week 1 of the following year. Thus, for Tuesday
    30th December 1997, %G is replaced by 1998 and %V is replaced by 01.

    If a conversion specifier is not one of the above, the behavior is undefined.

    In the "C" locale, the E and O modifiers are ignored and the replacement
    strings for the following specifiers are:
      %a the first three characters of %A.
      %A one of "Sunday", "Monday", ... , "Saturday".
      %b the first three characters of %B.
      %B one of "January", "February", ... , "December".
      %c equivalent to "%a %b %e %T %Y".
      %p one of "AM" or "PM".
      %r equivalent to "%I:%M:%S %p".
      %x equivalent to "%m/%d/%y".
      %X equivalent to %T.
      %Z implementation-defined.

    @param  s         Pointer to the buffer in which to store the result.
    @param  maxsize   Maximum number of characters to put into buffer s.
    @param  format    Format string, as described above.
    @param  timeptr   Pointer to a broken-down time structure containing the
                      time to format.

    @return   If the total number of resulting characters including the
              terminating null character is not more than maxsize, the
              strftime function returns the number of characters placed into
              the array pointed to by s not including the terminating null
              character. Otherwise, zero is returned and the contents of the
              array are indeterminate.
**/
size_t strftime( char * __restrict s, size_t maxsize,
                      const char * __restrict format,
                      const struct tm * __restrict timeptr);

char *strptime(const char *, const char * format, struct tm*);


/* #################  Implementation Functions  ########################### */

clock_t __getCPS(void);

#endif  /* _TIME_H */
