Home | History | Annotate | Download | only in Include
      1 /** @file
      2     The header <time.h> defines two macros, and declares several types and
      3     functions for manipulating time.  Many functions deal with a calendar time
      4     that represents the current date (according to the Gregorian calendar) and
      5     time.  Some functions deal with local time, which is the calendar time
      6     expressed for some specific time zone, and with Daylight Saving Time, which
      7     is a temporary change in the algorithm for determining local time.  The local
      8     time zone and Daylight Saving Time are implementation-defined.
      9 
     10     The macros defined are NULL; and CLOCKS_PER_SEC which expands to an
     11     expression with type clock_t (described below) that is the number per second
     12     of the value returned by the clock function.
     13 
     14     The types declared are size_t along with clock_t and time_t which are
     15     arithmetic types capable of representing times; and struct tm which holds
     16     the components of a calendar time, called the broken-down time.
     17 
     18     The range and precision of times representable in clock_t and time_t are
     19     implementation-defined. The tm structure shall contain at least the following
     20     members, in any order.  The semantics of the members and their normal ranges
     21     are expressed in the comments.
     22       - int tm_sec;   // seconds after the minute - [0, 60]
     23       - int tm_min;   // minutes after the hour - [0, 59]
     24       - int tm_hour;  // hours since midnight - [0, 23]
     25       - int tm_mday;  // day of the month - [1, 31]
     26       - int tm_mon;   // months since January - [0, 11]
     27       - int tm_year;  // years since 1900
     28       - int tm_wday;  // days since Sunday - [0, 6]
     29       - int tm_yday;  // days since January 1 - [0, 365]
     30       - int tm_isdst; // Daylight Saving Time flag
     31 
     32     The value of tm_isdst is positive if Daylight Saving Time is in effect, zero
     33     if Daylight Saving Time is not in effect, and negative if the information
     34     is not available.
     35 
     36     The following macros are defined in this file:<BR>
     37     @verbatim
     38       NULL
     39       CLOCKS_PER_SEC    The number of values per second returned by the clock function.
     40     @endverbatim
     41 
     42     The following types are defined in this file:<BR>
     43     @verbatim
     44       size_t      Unsigned integer type of the result of the sizeof operator.
     45       clock_t     Arithmetic type capable of representing a time from the clock function.
     46       time_t      Arithmetic type capable of representing a time.
     47       struct tm   Holds the components of a calendar time; or broken-down time.
     48     @endverbatim
     49 
     50     The following functions are declared in this file:<BR>
     51     @verbatim
     52       ###############  Time Manipulation Functions
     53       clock_t       clock     (void);
     54       double        difftime  (time_t time1, time_t time0);
     55       time_t        mktime    (struct tm *timeptr);
     56       time_t        time      (time_t *timer);
     57 
     58       #################  Time Conversion Functions
     59       char        * asctime   (const struct tm *timeptr);
     60       char        * ctime     (const time_t *timer);
     61       struct tm   * gmtime    (const time_t *timer);
     62       time_t        timegm    (struct tm*);
     63       struct tm   * localtime (const time_t *timer);
     64       size_t        strftime  (char * __restrict s, size_t maxsize,
     65                                const char * __restrict format,
     66                                const struct tm * __restrict timeptr);
     67       char        * strptime  (const char *, const char * format, struct tm*);
     68     @endverbatim
     69 
     70     Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
     71     This program and the accompanying materials are licensed and made available under
     72     the terms and conditions of the BSD License that accompanies this distribution.
     73     The full text of the license may be found at
     74     http://opensource.org/licenses/bsd-license.
     75 
     76     THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     77     WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     78 **/
     79 #ifndef _TIME_H
     80 #define _TIME_H
     81 #include <sys/EfiCdefs.h>
     82 
     83 #define CLOCKS_PER_SEC  __getCPS()
     84 
     85 #ifdef _EFI_SIZE_T_
     86   typedef _EFI_SIZE_T_  size_t;
     87   #undef _EFI_SIZE_T_
     88   #undef _BSD_SIZE_T_
     89 #endif
     90 
     91 #ifdef _EFI_CLOCK_T
     92   /** An arithmetic type capable of representing values returned by clock(); **/
     93   typedef _EFI_CLOCK_T  clock_t;
     94   #undef _EFI_CLOCK_T
     95 #endif
     96 
     97 #ifdef _EFI_TIME_T
     98   /** An arithmetic type capable of representing values returned as calendar time
     99       values, such as that returned by mktime();
    100   **/
    101   typedef _EFI_TIME_T  time_t;
    102   #undef _EFI_TIME_T
    103 #endif
    104 
    105 /** Value added to tm_year to get the full year value.  TM_YEAR_BASE + 110 --> 2010 **/
    106 #define TM_YEAR_BASE  1900
    107 
    108 /** @{
    109     Values for the tm_wday member of struct tm.
    110 **/
    111 #define TM_SUNDAY     0
    112 #define TM_MONDAY     1
    113 #define TM_TUESDAY    2
    114 #define TM_WEDNESDAY  3
    115 #define TM_THURSDAY   4
    116 #define TM_FRIDAY     5
    117 #define TM_SATURDAY   6
    118 /*@}*/
    119 
    120 /** @{
    121     Values for the tm_mon member of struct tm.
    122 **/
    123 #define TM_JANUARY     0
    124 #define TM_FEBRUARY    1
    125 #define TM_MARCH       2
    126 #define TM_APRIL       3
    127 #define TM_MAY         4
    128 #define TM_JUNE        5
    129 #define TM_JULY        6
    130 #define TM_AUGUST      7
    131 #define TM_SEPTEMBER   8
    132 #define TM_OCTOBER     9
    133 #define TM_NOVEMBER   10
    134 #define TM_DECEMBER   11
    135 /*@}*/
    136 
    137 /** A structure holding the components of a calendar time, called the
    138     broken-down time.  The first nine (9) members are as mandated by the
    139     C95 standard.  Additional fields have been added for EFI support.
    140 **/
    141 struct tm {
    142   int     tm_year;      // years since 1900
    143   int     tm_mon;       // months since January  [0, 11]
    144   int     tm_mday;      // day of the month  [1, 31]
    145   int     tm_hour;      // hours since midnight  [0, 23]
    146   int     tm_min;       // minutes after the hour  [0, 59]
    147   int     tm_sec;       // seconds after the minute  [0, 60]
    148   int     tm_wday;      // days since Sunday  [0, 6]
    149   int     tm_yday;      // days since January 1  [0, 365]
    150   int     tm_isdst;     // Daylight Saving Time flag
    151   int     tm_zoneoff;   // EFI TimeZone offset, -1440 to 1440 or 2047
    152   int     tm_daylight;  // EFI Daylight flags
    153   UINT32  tm_Nano;      // EFI Nanosecond value
    154 };
    155 
    156 /* ###############  Time Manipulation Functions  ########################## */
    157 
    158 /** The clock function determines the processor time used.
    159 
    160     @return   The clock function returns the implementation's best
    161               approximation to the processor time used by the program since the
    162               beginning of an implementation-defined era related only to the
    163               program invocation.  To determine the time in seconds, the value
    164               returned by the clock function should be divided by the value of
    165               the macro CLOCKS_PER_SEC.  If the processor time used is not
    166               available or its value cannot be represented, the function
    167               returns the value (clock_t)(-1).
    168 **/
    169 clock_t  clock(void);
    170 
    171 /** Compute the difference between two calendar times: time1 - time0.
    172 
    173     @param[in]  time1   An arithmetic calendar time.
    174     @param[in]  time2   Another arithmetic calendar time.
    175 
    176     @return   The difference between the two times expressed in seconds.
    177 **/
    178 double difftime(time_t time1, time_t time0);
    179 
    180 /** Convert a broken-down time into an arithmetic calendar time.
    181 
    182     The mktime function converts the broken-down time, expressed as local time,
    183     in the structure pointed to by timeptr into a calendar time value with the
    184     same encoding as that of the values returned by the time function. The
    185     original values of the tm_wday and tm_yday components of the structure are
    186     ignored, and the original values of the other components are not
    187     restricted to the ranges indicated above. On successful completion,
    188     the values of the tm_wday and tm_yday components of the structure are set
    189     appropriately, and the other components are set to represent the specified
    190     calendar time, but with their values forced to the ranges indicated above;
    191     the final value of tm_mday is not set until tm_mon and tm_year
    192     are determined.
    193 
    194     @param[in]  timeptr   Pointer to a broken-down time to be converted.
    195 
    196     @return   The mktime function returns the specified calendar time encoded
    197               as a value of type time_t. If the calendar time cannot be
    198               represented, the function returns the value (time_t)(-1).
    199 **/
    200 time_t mktime(struct tm *timeptr);
    201 
    202 /** The time function determines the current calendar time.
    203 
    204     The encoding of the value is unspecified and undocumented.
    205 
    206     @param[out]   timer   An optional pointer to an object in which to
    207                           store the calendar time.
    208 
    209     @return   The time function returns the implementation's best approximation
    210               of the current calendar time. The value (time_t)(-1) is returned
    211               if the calendar time is not available. If timer is not a null
    212               pointer, the return value is also assigned to the object it
    213               points to.
    214 **/
    215 time_t time(time_t *timer);
    216 
    217 /* #################  Time Conversion Functions  ########################## */
    218 
    219 /** The asctime function converts the broken-down time in the structure pointed
    220     to by timeptr into a string in the form<BR>
    221     @verbatim
    222           Sun Sep 16 01:03:52 1973\n\0
    223     @endverbatim
    224 
    225     @param[in]  timeptr   A pointer to a broken-down time to convert.
    226 
    227     @return   The asctime function returns a pointer to the string.
    228 **/
    229 char * asctime(const struct tm *timeptr);
    230 
    231 /** The ctime function converts the calendar time pointed to by timer to a local
    232     time in the form of a string. It is equivalent to asctime(localtime(timer))
    233 
    234     @param[in]  timer   Pointer to a calendar time value to convert into a
    235                         string representation.
    236 
    237     @return   The ctime function returns the pointer returned by the asctime
    238               function with that broken-down time as argument.
    239 **/
    240 char * ctime(const time_t *timer);
    241 
    242 /** The gmtime function converts the calendar time pointed to by timer into a
    243     broken-down time, expressed as UTC.
    244 
    245     @param[in]  timer   Pointer to a calendar time value to convert into a
    246                         broken-down time.
    247 
    248     @return   The gmtime function returns a pointer to the broken-down time,
    249               or a null pointer if the specified time cannot be converted to UTC.
    250 **/
    251 struct tm  * gmtime(const time_t *timer);
    252 
    253 /** The timegm function is the opposite of gmtime.
    254 
    255     @param[in]  tm    Pointer to a broken-down time to convert into a
    256                       calendar time.
    257 
    258     @return   The calendar time expressed as UTC.
    259 **/
    260 time_t timegm(struct tm*);
    261 
    262 /** The localtime function converts the calendar time pointed to by timer into
    263     a broken-down time, expressed as local time.
    264 
    265     @param[in]  timer   Pointer to a calendar time value to be converted.
    266 
    267     @return   The localtime function returns a pointer to the broken-down time,
    268               or a null pointer if the specified time cannot be converted to
    269               local time.
    270 **/
    271 struct tm  * localtime(const time_t *timer);
    272 
    273 /** The strftime function places characters into the array pointed to by s as
    274     controlled by the string pointed to by format. The format shall be a
    275     multibyte character sequence, beginning and ending in its initial shift
    276     state. The format string consists of zero or more conversion specifiers
    277     and ordinary multibyte characters. A conversion specifier consists of
    278     a % character, possibly followed by an E or O modifier character
    279     (described below), followed by a character that determines the behavior of
    280     the conversion specifier.
    281 
    282     All ordinary multibyte characters (including the terminating null
    283     character) are copied unchanged into the array. If copying takes place
    284     between objects that overlap, the behavior is undefined. No more than
    285     maxsize characters are placed into the array. 3 Each conversion specifier
    286     is replaced by appropriate characters as described in the following list.
    287     The appropriate characters are determined using the LC_TIME category of
    288     the current locale and by the values of zero or more members of the
    289     broken-down time structure pointed to by timeptr, as specified in brackets
    290     in the description. If any of the specified values is outside the normal
    291     range, the characters stored are unspecified.
    292 
    293     %a is replaced by the locale's abbreviated weekday name. [tm_wday]
    294     %A is replaced by the locale's full weekday name. [tm_wday]
    295     %b is replaced by the locale's abbreviated month name. [tm_mon]
    296     %B is replaced by the locale's full month name. [tm_mon]
    297     %c is replaced by the locale's appropriate date and time representation.
    298     %C is replaced by the year divided by 100 and truncated to an integer,
    299        as a decimal number (00-99). [tm_year]
    300     %d is replaced by the day of the month as a decimal number (01-31). [tm_mday]
    301     %D is equivalent to "%m/%d/%y". [tm_mon, tm_mday, tm_year]
    302     %e is replaced by the day of the month as a decimal number (1-31);
    303        a single digit is preceded by a space. [tm_mday]
    304     %F is equivalent to "%Y-%m-%d" (the ISO 8601 date format).
    305        [tm_year, tm_mon, tm_mday]
    306     %g is replaced by the last 2 digits of the week-based year (see below) as
    307        a decimal number (00-99). [tm_year, tm_wday, tm_yday]
    308     %G is replaced by the week-based year (see below) as a decimal number
    309        (e.g., 1997). [tm_year, tm_wday, tm_yday]
    310     %h is equivalent to "%b". [tm_mon]
    311     %H is replaced by the hour (24-hour clock) as a decimal number (00-23). [tm_hour]
    312     %I is replaced by the hour (12-hour clock) as a decimal number (01-12). [tm_hour]
    313     %j is replaced by the day of the year as a decimal number (001-366). [tm_yday]
    314     %m is replaced by the month as a decimal number (01-12). [tm_mon]
    315     %M is replaced by the minute as a decimal number (00-59). [tm_min]
    316     %n is replaced by a new-line character.
    317     %p is replaced by the locale's equivalent of the AM/PM designations
    318        associated with a 12-hour clock. [tm_hour]
    319     %r is replaced by the locale's 12-hour clock time. [tm_hour, tm_min, tm_sec]
    320     %R is equivalent to "%H:%M". [tm_hour, tm_min]
    321     %S is replaced by the second as a decimal number (00-60). [tm_sec]
    322     %t is replaced by a horizontal-tab character.
    323     %T is equivalent to "%H:%M:%S" (the ISO 8601 time format).
    324        [tm_hour, tm_min, tm_sec]
    325     %u is replaced by the ISO 8601 weekday as a decimal number (1-7),
    326        where Monday is 1. [tm_wday]
    327     %U is replaced by the week number of the year (the first Sunday as the
    328        first day of week 1) as a decimal number (00-53). [tm_year, tm_wday, tm_yday]
    329     %V is replaced by the ISO 8601 week number (see below) as a decimal number
    330        (01-53). [tm_year, tm_wday, tm_yday]
    331     %w is replaced by the weekday as a decimal number (0-6), where Sunday is 0.
    332        [tm_wday]
    333     %W is replaced by the week number of the year (the first Monday as the
    334        first day of week 1) as a decimal number (00-53). [tm_year, tm_wday, tm_yday]
    335     %x is replaced by the locale's appropriate date representation.
    336     %X is replaced by the locale's appropriate time representation.
    337     %y is replaced by the last 2 digits of the year as a decimal
    338        number (00-99). [tm_year]
    339     %Y is replaced by the year as a decimal number (e.g., 1997). [tm_year]
    340     %z is replaced by the offset from UTC in the ISO 8601 format "-0430"
    341        (meaning 4 hours 30 minutes behind UTC, west of Greenwich), or by no
    342        characters if no time zone is determinable. [tm_isdst]
    343     %Z is replaced by the locale's time zone name or abbreviation, or by no
    344        characters if no time zone is determinable. [tm_isdst]
    345     %% is replaced by %.
    346 
    347     Some conversion specifiers can be modified by the inclusion of an E or O
    348     modifier character to indicate an alternative format or specification.
    349     If the alternative format or specification does not exist for the current
    350     locale, the modifier is ignored. %Ec is replaced by the locale's
    351     alternative date and time representation.
    352 
    353     %EC is replaced by the name of the base year (period) in the locale's
    354         alternative representation.
    355     %Ex is replaced by the locale's alternative date representation.
    356     %EX is replaced by the locale's alternative time representation.
    357     %Ey is replaced by the offset from %EC (year only) in the locale's
    358         alternative representation.
    359     %EY is replaced by the locale's full alternative year representation.
    360     %Od is replaced by the day of the month, using the locale's alternative
    361         numeric symbols (filled as needed with leading zeros, or with leading
    362         spaces if there is no alternative symbol for zero).
    363     %Oe is replaced by the day of the month, using the locale's alternative
    364         numeric symbols (filled as needed with leading spaces).
    365     %OH is replaced by the hour (24-hour clock), using the locale's
    366         alternative numeric symbols.
    367     %OI is replaced by the hour (12-hour clock), using the locale's
    368         alternative numeric symbols.
    369     %Om is replaced by the month, using the locale's alternative numeric symbols.
    370     %OM is replaced by the minutes, using the locale's alternative numeric symbols.
    371     %OS is replaced by the seconds, using the locale's alternative numeric symbols.
    372     %Ou is replaced by the ISO 8601 weekday as a number in the locale's
    373         alternative representation, where Monday is 1.
    374     %OU is replaced by the week number, using the locale's alternative numeric symbols.
    375     %OV is replaced by the ISO 8601 week number, using the locale's alternative
    376         numeric symbols.
    377     %Ow is replaced by the weekday as a number, using the locale's alternative
    378         numeric symbols.
    379     %OW is replaced by the week number of the year, using the locale's
    380         alternative numeric symbols.
    381     %Oy is replaced by the last 2 digits of the year, using the locale's
    382         alternative numeric symbols.
    383 
    384     %g, %G, and %V give values according to the ISO 8601 week-based year. In
    385     this system, weeks begin on a Monday and week 1 of the year is the week
    386     that includes January 4th, which is also the week that includes the first
    387     Thursday of the year, and is also the first week that contains at least
    388     four days in the year. If the first Monday of January is the 2nd, 3rd, or
    389     4th, the preceding days are part of the last week of the preceding year;
    390     thus, for Saturday 2nd January 1999, %G is replaced by 1998 and %V is
    391     replaced by 53. If December 29th, 30th, or 31st is a Monday, it and any
    392     following days are part of week 1 of the following year. Thus, for Tuesday
    393     30th December 1997, %G is replaced by 1998 and %V is replaced by 01.
    394 
    395     If a conversion specifier is not one of the above, the behavior is undefined.
    396 
    397     In the "C" locale, the E and O modifiers are ignored and the replacement
    398     strings for the following specifiers are:
    399       %a the first three characters of %A.
    400       %A one of "Sunday", "Monday", ... , "Saturday".
    401       %b the first three characters of %B.
    402       %B one of "January", "February", ... , "December".
    403       %c equivalent to "%a %b %e %T %Y".
    404       %p one of "AM" or "PM".
    405       %r equivalent to "%I:%M:%S %p".
    406       %x equivalent to "%m/%d/%y".
    407       %X equivalent to %T.
    408       %Z implementation-defined.
    409 
    410     @param  s         Pointer to the buffer in which to store the result.
    411     @param  maxsize   Maximum number of characters to put into buffer s.
    412     @param  format    Format string, as described above.
    413     @param  timeptr   Pointer to a broken-down time structure containing the
    414                       time to format.
    415 
    416     @return   If the total number of resulting characters including the
    417               terminating null character is not more than maxsize, the
    418               strftime function returns the number of characters placed into
    419               the array pointed to by s not including the terminating null
    420               character. Otherwise, zero is returned and the contents of the
    421               array are indeterminate.
    422 **/
    423 size_t strftime( char * __restrict s, size_t maxsize,
    424                       const char * __restrict format,
    425                       const struct tm * __restrict timeptr);
    426 
    427 char *strptime(const char *, const char * format, struct tm*);
    428 
    429 
    430 /* #################  Implementation Functions  ########################### */
    431 
    432 clock_t __getCPS(void);
    433 
    434 #endif  /* _TIME_H */
    435