summaryrefslogtreecommitdiff
path: root/StdLib/Include/time.h
blob: ecef1e2f6139409c67531a97730bc401cde1bb35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
/** @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 */